summaryrefslogtreecommitdiff
path: root/xsd/xsd
diff options
context:
space:
mode:
Diffstat (limited to 'xsd/xsd')
-rw-r--r--xsd/xsd/.gitignore6
-rw-r--r--xsd/xsd/buildfile114
-rw-r--r--xsd/xsd/cxx/.gitignore1
-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.cxx183
-rw-r--r--xsd/xsd/cxx/tree/tree-inline.cxx6
-rw-r--r--xsd/xsd/cxx/tree/tree-source.cxx2
-rw-r--r--xsd/xsd/options.cli15
-rw-r--r--xsd/xsd/pregenerated/xsd/cxx/options.cxx739
-rw-r--r--xsd/xsd/pregenerated/xsd/cxx/options.hxx451
-rw-r--r--xsd/xsd/pregenerated/xsd/cxx/options.ixx615
-rw-r--r--xsd/xsd/pregenerated/xsd/cxx/parser/options.cxx776
-rw-r--r--xsd/xsd/pregenerated/xsd/cxx/parser/options.hxx186
-rw-r--r--xsd/xsd/pregenerated/xsd/cxx/parser/options.ixx162
-rw-r--r--xsd/xsd/pregenerated/xsd/cxx/tree/options.cxx1343
-rw-r--r--xsd/xsd/pregenerated/xsd/cxx/tree/options.hxx414
-rw-r--r--xsd/xsd/pregenerated/xsd/cxx/tree/options.ixx504
-rw-r--r--xsd/xsd/pregenerated/xsd/options.cxx1297
-rw-r--r--xsd/xsd/pregenerated/xsd/options.hxx702
-rw-r--r--xsd/xsd/pregenerated/xsd/options.ixx555
-rw-r--r--xsd/xsd/xsd.cxx35
25 files changed, 8173 insertions, 222 deletions
diff --git a/xsd/xsd/.gitignore b/xsd/xsd/.gitignore
index 2d9360c..8c86c4a 100644
--- a/xsd/xsd/.gitignore
+++ b/xsd/xsd/.gitignore
@@ -1,3 +1,3 @@
-xsd
-options.?xx
-version.hxx
+/xsd
+/version.hxx
+/options.?xx
diff --git a/xsd/xsd/buildfile b/xsd/xsd/buildfile
index eac0ff9..d4e7af5 100644
--- a/xsd/xsd/buildfile
+++ b/xsd/xsd/buildfile
@@ -5,13 +5,10 @@ import libs = libxsd-frontend%lib{xsd-frontend}
import libs += libcutl%lib{cutl}
import libs += libxerces-c%lib{xerces-c}
-import! [metadata] cli = cli%exe{cli}
-
ops = options cxx/options cxx/parser/options cxx/tree/options
-./: exe{xsd}: {hxx ixx txx cxx}{** -{$ops} -version} \
- {hxx ixx cxx}{$ops} \
- {hxx}{version} \
+./: exe{xsd}: {hxx ixx txx cxx}{** -version -{$ops} -pregenerated/**} \
+ {hxx}{version} \
$libs
# Target metadata, see also --build2-metadata in xsd.cxx.
@@ -28,51 +25,96 @@ exe{xsd}:
hxx{version}: in{version} $src_root/manifest
-# Generated options parser.
+## Consumption build ($develop == false).
#
-# Note: tracking .cli dependencies manually.
+
+# Use pregenerated versions in the consumption build.
#
-cli_options = --std c++11 -I $src_root --generate-specifier \
---generate-file-scanner --suppress-undocumented \
---ostream-type ::std::wostream --exclude-base \
---include-with-brackets --option-length 28 \
---cxx-prologue '#include <xsd/options-parser.hxx>'
+exe{xsd}: pregenerated/{hxx ixx cxx}{**}: include = (!$develop)
-<{hxx ixx cxx}{options}>: cli{options}
-{
- cli_options += --include-prefix xsd --guard-prefix XSD
-}
+if! $develop
+ cxx.poptions =+ "-I($src_base/pregenerated)" # Note: must come first.
-<cxx/{hxx ixx cxx}{options}>: cxx/cli{options} cli{options}
-{
- cli_options += --include-prefix xsd/cxx --guard-prefix XSD_CXX
-}
+# Distribute pregenerated versions only in the consumption build.
+#
+pregenerated/{hxx ixx cxx}{*}: dist = (!$develop)
-<cxx/parser/{hxx ixx cxx}{options}>: cxx/parser/cli{options} cxx/cli{options} \
- cli{options}
-{
- cli_options += --include-prefix xsd/cxx/parser --guard-prefix XSD_CXX_PARSER
-}
+#
+##
+
+## Development build ($develop == true).
+#
-<cxx/tree/{hxx ixx cxx}{options}>: cxx/tree/cli{options} cxx/cli{options} \
- cli{options}
+exe{xsd}: {hxx ixx cxx}{$ops}: include = $develop
+
+if $develop
+ import! [metadata] cli = cli%exe{cli}
+
+# In the development build distribute regenerated {hxx ixx cxx}{options},
+# remapping their locations to the paths of the pregenerated versions (which
+# are only distributed in the consumption build; see above). This way we make
+# sure that the distributed files are always up-to-date.
+#
+for f: $ops
{
- cli_options += --include-prefix xsd/cxx/tree --guard-prefix XSD_CXX_TREE
+ d = $directory($f) # empty, cxx/, etc.
+
+ <{hxx ixx cxx}{$f}>: cli{$f}
+ {
+ dist = ($develop ? $relative([dir_path] "pregenerated/xsd/$d", $d) : false)
+
+ # Symlink the generated code in src for convenience of development.
+ #
+ backlink = true
+ }
}
<hxx{~'/(.*)/'} ixx{~'/\1/'} cxx{~'/\1/'}>: cli{~'/\1/'} $cli
-{
- # Symlink the generated code in src for convenience of development.
- #
- backlink = true
-}
+%
+if $develop
{{
- diag cli ($<[0])
- $cli $cli_options -o $directory($path($>[0])) $path($<[0])
+ t = $path($>[0]).t
+
+ depdb dyndep --byproduct --file $t
+
+ h = $path($>[0])
+ i = $path($>[1])
+ c = $path($>[2])
+
+ d = $directory($h)
+ p = $string($leaf($d, $out_root)) # xsd, xsd/cxx, etc
+
+ options = --std c++11 -I $src_root --include-prefix $p \
+ --guard-prefix $regex.replace($ucase($p), '[/\\]', '_') \
+ --generate-specifier --generate-file-scanner \
+ --suppress-undocumented --ostream-type ::std::wostream \
+ --exclude-base --include-with-brackets --option-length 28 \
+ --cxx-prologue '#include <xsd/options-parser.hxx>'
+
+ $cli $options --generate-dep --dep-file $t -o $d $path($<[0])
+
+ # If the result differs from the pregenerated version, copy it over.
+ #
+ d = [dir_path] $src_base/pregenerated/$p
+
+ dh = $d/$leaf($h)
+ di = $d/$leaf($i)
+ dc = $d/$leaf($c)
+
+ if diff $dh $h >- && \
+ diff $di $i >- && \
+ diff $dc $c >-
+ exit
+ end
+
+ cp $h $dh
+ cp $i $di
+ cp $c $dc
}}
-# Build options.
#
+##
+
# Pass the copyright notice extracted from the LICENSE file.
#
obj{xsd cxx/parser/generator cxx/tree/generator}: \
diff --git a/xsd/xsd/cxx/.gitignore b/xsd/xsd/cxx/.gitignore
new file mode 100644
index 0000000..c6e608b
--- /dev/null
+++ b/xsd/xsd/cxx/.gitignore
@@ -0,0 +1 @@
+options.?xx
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 5601f4e..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 () << ':';
@@ -928,19 +958,16 @@ namespace CXX
}
}
- if (inline_)
- {
- hxx << "#ifndef XSD_DONT_INCLUDE_INLINE" << endl
- << "#include " << ctx.process_include_path (ixx_name) << endl
- << "#endif // XSD_DONT_INCLUDE_INLINE" << endl
- << endl;
- }
-
hxx << "#include <xsd/cxx/post.hxx>" << endl
<< endl;
// Copy epilogue.
//
+ // Note that it goes before the inline file in case it defines
+ // something (such as a custom type) which is needed by this file.
+ // And if something in the epilogue needs something from the inline
+ // file, then it should be the inline rather than header epilogue.
+ //
hxx << "// Begin epilogue." << endl
<< "//" << endl;
@@ -951,6 +978,14 @@ namespace CXX
<< "// End epilogue." << endl
<< endl;
+ if (inline_)
+ {
+ hxx << "#ifndef XSD_DONT_INCLUDE_INLINE" << endl
+ << "#include " << ctx.process_include_path (ixx_name) << endl
+ << "#endif // XSD_DONT_INCLUDE_INLINE" << endl
+ << endl;
+ }
+
hxx << "#endif // " << guard << endl;
if (show_sloc)
@@ -999,6 +1034,9 @@ namespace CXX
<< "// End prologue." << endl
<< endl;
+ ixx << "#include <xsd/cxx/pre.hxx>" << endl
+ << endl;
+
// Generate.
//
{
@@ -1006,6 +1044,9 @@ namespace CXX
generate_tree_inline (ctx, 1, 0);
}
+ ixx << "#include <xsd/cxx/post.hxx>" << endl
+ << endl;
+
// Copy epilogue.
//
ixx << "// Begin epilogue." << endl
diff --git a/xsd/xsd/cxx/tree/tree-inline.cxx b/xsd/xsd/cxx/tree/tree-inline.cxx
index 318ef66..aa8b726 100644
--- a/xsd/xsd/cxx/tree/tree-inline.cxx
+++ b/xsd/xsd/cxx/tree/tree-inline.cxx
@@ -291,7 +291,7 @@ namespace CXX
}
os << "// " << name << endl
- << "// " << endl
+ << "//" << endl
<< endl;
// default c-tor
@@ -902,7 +902,7 @@ namespace CXX
return;
os << "// " << name << endl
- << "// " << endl
+ << "//" << endl
<< endl;
// Generate accessors and modifiers.
@@ -1037,7 +1037,7 @@ namespace CXX
String const& name (ename (e));
os << "// " << name << endl
- << "// " << endl
+ << "//" << endl
<< endl;
// Accessors/modifiers.
diff --git a/xsd/xsd/cxx/tree/tree-source.cxx b/xsd/xsd/cxx/tree/tree-source.cxx
index d702509..89419af 100644
--- a/xsd/xsd/cxx/tree/tree-source.cxx
+++ b/xsd/xsd/cxx/tree/tree-source.cxx
@@ -3562,7 +3562,7 @@ namespace CXX
String const& member (emember (e));
os << "// " << name << endl
- << "// " << endl
+ << "//" << endl
<< endl;
// Virtual accessors.
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
new file mode 100644
index 0000000..9eea3a9
--- /dev/null
+++ b/xsd/xsd/pregenerated/xsd/cxx/options.cxx
@@ -0,0 +1,739 @@
+// -*- C++ -*-
+//
+// This file was generated by CLI, a command line interface
+// compiler for C++.
+//
+
+// Begin prologue.
+//
+#include <xsd/options-parser.hxx>
+//
+// End prologue.
+
+#include <xsd/cxx/options.hxx>
+
+#include <map>
+#include <set>
+#include <string>
+#include <vector>
+#include <utility>
+#include <ostream>
+#include <sstream>
+#include <cstring>
+
+namespace cli
+{
+ template <typename X>
+ struct parser
+ {
+ static void
+ parse (X& x, bool& xs, scanner& s)
+ {
+ using namespace std;
+
+ const char* o (s.next ());
+ if (s.more ())
+ {
+ string v (s.next ());
+ istringstream is (v);
+ if (!(is >> x && is.peek () == istringstream::traits_type::eof ()))
+ throw invalid_value (o, v);
+ }
+ else
+ throw missing_value (o);
+
+ xs = true;
+ }
+ };
+
+ template <>
+ struct parser<bool>
+ {
+ static void
+ parse (bool& x, bool& xs, scanner& s)
+ {
+ const char* o (s.next ());
+
+ if (s.more ())
+ {
+ const char* v (s.next ());
+
+ if (std::strcmp (v, "1") == 0 ||
+ std::strcmp (v, "true") == 0 ||
+ std::strcmp (v, "TRUE") == 0 ||
+ std::strcmp (v, "True") == 0)
+ x = true;
+ else if (std::strcmp (v, "0") == 0 ||
+ std::strcmp (v, "false") == 0 ||
+ std::strcmp (v, "FALSE") == 0 ||
+ std::strcmp (v, "False") == 0)
+ x = false;
+ else
+ throw invalid_value (o, v);
+ }
+ else
+ throw missing_value (o);
+
+ xs = true;
+ }
+ };
+
+ template <>
+ struct parser<std::string>
+ {
+ static void
+ parse (std::string& x, bool& xs, scanner& s)
+ {
+ const char* o (s.next ());
+
+ if (s.more ())
+ x = s.next ();
+ else
+ throw missing_value (o);
+
+ xs = true;
+ }
+ };
+
+ template <typename X>
+ struct parser<std::pair<X, std::size_t> >
+ {
+ static void
+ parse (std::pair<X, std::size_t>& x, bool& xs, scanner& s)
+ {
+ x.second = s.position ();
+ parser<X>::parse (x.first, xs, s);
+ }
+ };
+
+ template <typename X>
+ struct parser<std::vector<X> >
+ {
+ static void
+ parse (std::vector<X>& c, bool& xs, scanner& s)
+ {
+ X x;
+ bool dummy;
+ parser<X>::parse (x, dummy, s);
+ c.push_back (x);
+ xs = true;
+ }
+ };
+
+ template <typename X, typename C>
+ struct parser<std::set<X, C> >
+ {
+ static void
+ parse (std::set<X, C>& c, bool& xs, scanner& s)
+ {
+ X x;
+ bool dummy;
+ parser<X>::parse (x, dummy, s);
+ c.insert (x);
+ xs = true;
+ }
+ };
+
+ template <typename K, typename V, typename C>
+ struct parser<std::map<K, V, C> >
+ {
+ static void
+ parse (std::map<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[k] = v;
+ }
+ else
+ throw missing_value (o);
+
+ xs = true;
+ }
+ };
+
+ 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)
+ {
+ parser<T>::parse (x.*M, s);
+ }
+
+ template <typename X, bool X::*M>
+ void
+ thunk (X& x, scanner& s)
+ {
+ s.next ();
+ x.*M = true;
+ }
+
+ template <typename X, typename T, T X::*M, bool X::*S>
+ void
+ thunk (X& x, scanner& s)
+ {
+ parser<T>::parse (x.*M, x.*S, s);
+ }
+}
+
+#include <map>
+
+namespace CXX
+{
+ // options
+ //
+
+ options::
+ options ()
+ : std_ (cxx_version::cxx11),
+ std_specified_ (false),
+ char_type_ ("char"),
+ char_type_specified_ (false),
+ char_encoding_ (),
+ char_encoding_specified_ (false),
+ output_dir_ (),
+ output_dir_specified_ (false),
+ generate_inline_ (),
+ generate_xml_schema_ (),
+ extern_xml_schema_ (),
+ extern_xml_schema_specified_ (false),
+ namespace_map_ (),
+ namespace_map_specified_ (false),
+ namespace_regex_ (),
+ namespace_regex_specified_ (false),
+ namespace_regex_trace_ (),
+ reserved_name_ (),
+ reserved_name_specified_ (false),
+ include_with_brackets_ (),
+ include_prefix_ (),
+ include_prefix_specified_ (false),
+ include_regex_ (),
+ include_regex_specified_ (false),
+ include_regex_trace_ (),
+ guard_prefix_ (),
+ guard_prefix_specified_ (false),
+ hxx_suffix_ (".hxx"),
+ hxx_suffix_specified_ (false),
+ ixx_suffix_ (".ixx"),
+ ixx_suffix_specified_ (false),
+ cxx_suffix_ (".cxx"),
+ cxx_suffix_specified_ (false),
+ fwd_suffix_ ("-fwd.hxx"),
+ fwd_suffix_specified_ (false),
+ hxx_regex_ (),
+ hxx_regex_specified_ (false),
+ ixx_regex_ (),
+ ixx_regex_specified_ (false),
+ cxx_regex_ (),
+ cxx_regex_specified_ (false),
+ fwd_regex_ (),
+ fwd_regex_specified_ (false),
+ hxx_prologue_ (),
+ hxx_prologue_specified_ (false),
+ ixx_prologue_ (),
+ ixx_prologue_specified_ (false),
+ cxx_prologue_ (),
+ cxx_prologue_specified_ (false),
+ fwd_prologue_ (),
+ fwd_prologue_specified_ (false),
+ prologue_ (),
+ prologue_specified_ (false),
+ hxx_epilogue_ (),
+ hxx_epilogue_specified_ (false),
+ ixx_epilogue_ (),
+ ixx_epilogue_specified_ (false),
+ cxx_epilogue_ (),
+ cxx_epilogue_specified_ (false),
+ fwd_epilogue_ (),
+ fwd_epilogue_specified_ (false),
+ epilogue_ (),
+ epilogue_specified_ (false),
+ hxx_prologue_file_ (),
+ hxx_prologue_file_specified_ (false),
+ ixx_prologue_file_ (),
+ ixx_prologue_file_specified_ (false),
+ cxx_prologue_file_ (),
+ cxx_prologue_file_specified_ (false),
+ fwd_prologue_file_ (),
+ fwd_prologue_file_specified_ (false),
+ prologue_file_ (),
+ prologue_file_specified_ (false),
+ hxx_epilogue_file_ (),
+ hxx_epilogue_file_specified_ (false),
+ ixx_epilogue_file_ (),
+ ixx_epilogue_file_specified_ (false),
+ cxx_epilogue_file_ (),
+ cxx_epilogue_file_specified_ (false),
+ fwd_epilogue_file_ (),
+ fwd_epilogue_file_specified_ (false),
+ epilogue_file_ (),
+ epilogue_file_specified_ (false),
+ export_symbol_ (),
+ export_symbol_specified_ (false),
+ export_xml_schema_ (),
+ export_maps_ (),
+ import_maps_ (),
+ generate_dep_ (),
+ generate_dep_only_ (),
+ dep_phony_ (),
+ dep_target_ (),
+ dep_target_specified_ (false),
+ dep_suffix_ (".d"),
+ dep_suffix_specified_ (false),
+ dep_file_ (),
+ dep_file_specified_ (false),
+ dep_regex_ (),
+ dep_regex_specified_ (false)
+ {
+ }
+
+ ::cli::usage_para options::
+ print_usage (::std::wostream& os, ::cli::usage_para p)
+ {
+ CLI_POTENTIALLY_UNUSED (os);
+
+ if (p == ::cli::usage_para::text)
+ os << ::std::endl;
+
+ os << "--std <version> Specify the C++ standard that the generated code" << ::std::endl
+ << " should conform to." << ::std::endl;
+
+ os << "--char-type <type> Generate code using the provided character <type>" << ::std::endl
+ << " instead of the default char." << ::std::endl;
+
+ os << "--char-encoding <enc> Specify the character encoding that should be used" << ::std::endl
+ << " in the generated code." << ::std::endl;
+
+ os << "--output-dir <dir> Write generated files to <dir> instead of the" << ::std::endl
+ << " current directory." << ::std::endl;
+
+ os << "--generate-inline Generate simple functions inline." << ::std::endl;
+
+ os << "--generate-xml-schema Generate a C++ header file as if the schema being" << ::std::endl
+ << " compiled defines the XML Schema namespace." << ::std::endl;
+
+ os << "--extern-xml-schema <file> Include a header file derived from <file> instead" << ::std::endl
+ << " of generating the XML Schema namespace mapping" << ::std::endl
+ << " inline." << ::std::endl;
+
+ os << "--namespace-map <xns>=<cns> Map XML Schema namespace <xns> to C++ namespace" << ::std::endl
+ << " <cns>." << ::std::endl;
+
+ os << "--namespace-regex <regex> Add <regex> to the list of regular expressions" << ::std::endl
+ << " used to translate XML Schema namespace names to" << ::std::endl
+ << " C++ namespace names." << ::std::endl;
+
+ os << "--namespace-regex-trace Trace the process of applying regular expressions" << ::std::endl
+ << " specified with the --namespace-regex option." << ::std::endl;
+
+ os << "--reserved-name <n>[=<r>] Add name <n> to the list of names that should not" << ::std::endl
+ << " be used as identifiers." << ::std::endl;
+
+ os << "--include-with-brackets Use angle brackets (<>) instead of quotes (\"\") in" << ::std::endl
+ << " generated #include directives." << ::std::endl;
+
+ os << "--include-prefix <prefix> Add <prefix> to generated #include directive" << ::std::endl
+ << " paths." << ::std::endl;
+
+ os << "--include-regex <regex> Add <regex> to the list of regular expressions" << ::std::endl
+ << " used to transform #include directive paths." << ::std::endl;
+
+ os << "--include-regex-trace Trace the process of applying regular expressions" << ::std::endl
+ << " specified with the --include-regex option." << ::std::endl;
+
+ os << "--guard-prefix <prefix> Add <prefix> to generated header inclusion guards." << ::std::endl;
+
+ os << "--hxx-suffix <suffix> Use the provided <suffix> instead of the default" << ::std::endl
+ << " .hxx to construct the name of the header file." << ::std::endl;
+
+ os << "--ixx-suffix <suffix> Use the provided <suffix> instead of the default" << ::std::endl
+ << " .ixx to construct the name of the inline file." << ::std::endl;
+
+ os << "--cxx-suffix <suffix> Use the provided <suffix> instead of the default" << ::std::endl
+ << " .cxx to construct the name of the source file." << ::std::endl;
+
+ os << "--fwd-suffix <suffix> Use the provided <suffix> instead of the default" << ::std::endl
+ << " -fwd.hxx to construct the name of the forward" << ::std::endl
+ << " declaration file." << ::std::endl;
+
+ os << "--hxx-regex <regex> Use the provided expression to construct the name" << ::std::endl
+ << " of the header file." << ::std::endl;
+
+ os << "--ixx-regex <regex> Use the provided expression to construct the name" << ::std::endl
+ << " of the inline file." << ::std::endl;
+
+ os << "--cxx-regex <regex> Use the provided expression to construct the name" << ::std::endl
+ << " of the source file." << ::std::endl;
+
+ os << "--fwd-regex <regex> Use the provided expression to construct the name" << ::std::endl
+ << " of the forward declaration file." << ::std::endl;
+
+ os << "--hxx-prologue <text> Insert <text> at the beginning of the header file." << ::std::endl;
+
+ os << "--ixx-prologue <text> Insert <text> at the beginning of the inline file." << ::std::endl;
+
+ os << "--cxx-prologue <text> Insert <text> at the beginning of the source file." << ::std::endl;
+
+ os << "--fwd-prologue <text> Insert <text> at the beginning of the forward" << ::std::endl
+ << " declaration file." << ::std::endl;
+
+ os << "--prologue <text> Insert <text> at the beginning of each generated" << ::std::endl
+ << " file for which there is no file-specific prologue." << ::std::endl;
+
+ os << "--hxx-epilogue <text> Insert <text> at the end of the header file." << ::std::endl;
+
+ os << "--ixx-epilogue <text> Insert <text> at the end of the inline file." << ::std::endl;
+
+ os << "--cxx-epilogue <text> Insert <text> at the end of the source file." << ::std::endl;
+
+ os << "--fwd-epilogue <text> Insert <text> at the end of the forward" << ::std::endl
+ << " declaration file." << ::std::endl;
+
+ os << "--epilogue <text> Insert <text> at the end of each generated file" << ::std::endl
+ << " for which there is no file-specific epilogue." << ::std::endl;
+
+ os << "--hxx-prologue-file <file> Insert the content of the <file> at the beginning" << ::std::endl
+ << " of the header file." << ::std::endl;
+
+ os << "--ixx-prologue-file <file> Insert the content of the <file> at the beginning" << ::std::endl
+ << " of the inline file." << ::std::endl;
+
+ os << "--cxx-prologue-file <file> Insert the content of the <file> at the beginning" << ::std::endl
+ << " of the source file." << ::std::endl;
+
+ os << "--fwd-prologue-file <file> Insert the content of the <file> at the beginning" << ::std::endl
+ << " of the forward declaration file." << ::std::endl;
+
+ os << "--prologue-file <file> Insert the content of the <file> at the beginning" << ::std::endl
+ << " of each generated file for which there is no" << ::std::endl
+ << " file-specific prologue file." << ::std::endl;
+
+ os << "--hxx-epilogue-file <file> Insert the content of the <file> at the end of the" << ::std::endl
+ << " header file." << ::std::endl;
+
+ os << "--ixx-epilogue-file <file> Insert the content of the <file> at the end of the" << ::std::endl
+ << " inline file." << ::std::endl;
+
+ os << "--cxx-epilogue-file <file> Insert the content of the <file> at the end of the" << ::std::endl
+ << " source file." << ::std::endl;
+
+ os << "--fwd-epilogue-file <file> Insert the content of the <file> at the end of the" << ::std::endl
+ << " forward declaration file." << ::std::endl;
+
+ os << "--epilogue-file <file> Insert the content of the <file> at the end of" << ::std::endl
+ << " each generated file for which there is no" << ::std::endl
+ << " file-specific epilogue file." << ::std::endl;
+
+ os << "--export-symbol <symbol> Insert <symbol> in places where DLL export/import" << ::std::endl
+ << " control statements" << ::std::endl
+ << " (__declspec(dllexport/dllimport)) are necessary." << ::std::endl;
+
+ os << "--export-xml-schema Export/import types in the XML Schema namespace" << ::std::endl
+ << " using the export symbol provided with the" << ::std::endl
+ << " --export-symbol option." << ::std::endl;
+
+ os << "--export-maps Export polymorphism support maps from a Win32 DLL" << ::std::endl
+ << " into which this generated code is placed." << ::std::endl;
+
+ os << "--import-maps Import polymorphism support maps to a Win32 DLL or" << ::std::endl
+ << " executable into which this generated code is" << ::std::endl
+ << " linked." << ::std::endl;
+
+ os << "--generate-dep Generate make dependency information." << ::std::endl;
+
+ os << "--generate-dep-only Generate make dependency information only." << ::std::endl;
+
+ os << "--dep-phony Generate phony targets for included/imported" << ::std::endl
+ << " schema files, causing each to depend on nothing." << ::std::endl;
+
+ os << "--dep-target <target> Change the target of the dependency rule." << ::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;
+
+ p = ::cli::usage_para::option;
+
+ return p;
+ }
+
+ typedef
+ std::map<std::string, void (*) (options&, ::cli::scanner&)>
+ _cli_options_map;
+
+ static _cli_options_map _cli_options_map_;
+
+ struct _cli_options_map_init
+ {
+ _cli_options_map_init ()
+ {
+ _cli_options_map_["--std"] =
+ &::cli::thunk< options, cxx_version, &options::std_,
+ &options::std_specified_ >;
+ _cli_options_map_["--char-type"] =
+ &::cli::thunk< options, NarrowString, &options::char_type_,
+ &options::char_type_specified_ >;
+ _cli_options_map_["--char-encoding"] =
+ &::cli::thunk< options, NarrowString, &options::char_encoding_,
+ &options::char_encoding_specified_ >;
+ _cli_options_map_["--output-dir"] =
+ &::cli::thunk< options, NarrowString, &options::output_dir_,
+ &options::output_dir_specified_ >;
+ _cli_options_map_["--generate-inline"] =
+ &::cli::thunk< options, &options::generate_inline_ >;
+ _cli_options_map_["--generate-xml-schema"] =
+ &::cli::thunk< options, &options::generate_xml_schema_ >;
+ _cli_options_map_["--extern-xml-schema"] =
+ &::cli::thunk< options, NarrowString, &options::extern_xml_schema_,
+ &options::extern_xml_schema_specified_ >;
+ _cli_options_map_["--namespace-map"] =
+ &::cli::thunk< options, NarrowStrings, &options::namespace_map_,
+ &options::namespace_map_specified_ >;
+ _cli_options_map_["--namespace-regex"] =
+ &::cli::thunk< options, NarrowStrings, &options::namespace_regex_,
+ &options::namespace_regex_specified_ >;
+ _cli_options_map_["--namespace-regex-trace"] =
+ &::cli::thunk< options, &options::namespace_regex_trace_ >;
+ _cli_options_map_["--reserved-name"] =
+ &::cli::thunk< options, NarrowStrings, &options::reserved_name_,
+ &options::reserved_name_specified_ >;
+ _cli_options_map_["--include-with-brackets"] =
+ &::cli::thunk< options, &options::include_with_brackets_ >;
+ _cli_options_map_["--include-prefix"] =
+ &::cli::thunk< options, NarrowString, &options::include_prefix_,
+ &options::include_prefix_specified_ >;
+ _cli_options_map_["--include-regex"] =
+ &::cli::thunk< options, NarrowStrings, &options::include_regex_,
+ &options::include_regex_specified_ >;
+ _cli_options_map_["--include-regex-trace"] =
+ &::cli::thunk< options, &options::include_regex_trace_ >;
+ _cli_options_map_["--guard-prefix"] =
+ &::cli::thunk< options, NarrowString, &options::guard_prefix_,
+ &options::guard_prefix_specified_ >;
+ _cli_options_map_["--hxx-suffix"] =
+ &::cli::thunk< options, NarrowString, &options::hxx_suffix_,
+ &options::hxx_suffix_specified_ >;
+ _cli_options_map_["--ixx-suffix"] =
+ &::cli::thunk< options, NarrowString, &options::ixx_suffix_,
+ &options::ixx_suffix_specified_ >;
+ _cli_options_map_["--cxx-suffix"] =
+ &::cli::thunk< options, NarrowString, &options::cxx_suffix_,
+ &options::cxx_suffix_specified_ >;
+ _cli_options_map_["--fwd-suffix"] =
+ &::cli::thunk< options, NarrowString, &options::fwd_suffix_,
+ &options::fwd_suffix_specified_ >;
+ _cli_options_map_["--hxx-regex"] =
+ &::cli::thunk< options, NarrowString, &options::hxx_regex_,
+ &options::hxx_regex_specified_ >;
+ _cli_options_map_["--ixx-regex"] =
+ &::cli::thunk< options, NarrowString, &options::ixx_regex_,
+ &options::ixx_regex_specified_ >;
+ _cli_options_map_["--cxx-regex"] =
+ &::cli::thunk< options, NarrowString, &options::cxx_regex_,
+ &options::cxx_regex_specified_ >;
+ _cli_options_map_["--fwd-regex"] =
+ &::cli::thunk< options, NarrowString, &options::fwd_regex_,
+ &options::fwd_regex_specified_ >;
+ _cli_options_map_["--hxx-prologue"] =
+ &::cli::thunk< options, NarrowStrings, &options::hxx_prologue_,
+ &options::hxx_prologue_specified_ >;
+ _cli_options_map_["--ixx-prologue"] =
+ &::cli::thunk< options, NarrowStrings, &options::ixx_prologue_,
+ &options::ixx_prologue_specified_ >;
+ _cli_options_map_["--cxx-prologue"] =
+ &::cli::thunk< options, NarrowStrings, &options::cxx_prologue_,
+ &options::cxx_prologue_specified_ >;
+ _cli_options_map_["--fwd-prologue"] =
+ &::cli::thunk< options, NarrowStrings, &options::fwd_prologue_,
+ &options::fwd_prologue_specified_ >;
+ _cli_options_map_["--prologue"] =
+ &::cli::thunk< options, NarrowStrings, &options::prologue_,
+ &options::prologue_specified_ >;
+ _cli_options_map_["--hxx-epilogue"] =
+ &::cli::thunk< options, NarrowStrings, &options::hxx_epilogue_,
+ &options::hxx_epilogue_specified_ >;
+ _cli_options_map_["--ixx-epilogue"] =
+ &::cli::thunk< options, NarrowStrings, &options::ixx_epilogue_,
+ &options::ixx_epilogue_specified_ >;
+ _cli_options_map_["--cxx-epilogue"] =
+ &::cli::thunk< options, NarrowStrings, &options::cxx_epilogue_,
+ &options::cxx_epilogue_specified_ >;
+ _cli_options_map_["--fwd-epilogue"] =
+ &::cli::thunk< options, NarrowStrings, &options::fwd_epilogue_,
+ &options::fwd_epilogue_specified_ >;
+ _cli_options_map_["--epilogue"] =
+ &::cli::thunk< options, NarrowStrings, &options::epilogue_,
+ &options::epilogue_specified_ >;
+ _cli_options_map_["--hxx-prologue-file"] =
+ &::cli::thunk< options, NarrowString, &options::hxx_prologue_file_,
+ &options::hxx_prologue_file_specified_ >;
+ _cli_options_map_["--ixx-prologue-file"] =
+ &::cli::thunk< options, NarrowString, &options::ixx_prologue_file_,
+ &options::ixx_prologue_file_specified_ >;
+ _cli_options_map_["--cxx-prologue-file"] =
+ &::cli::thunk< options, NarrowString, &options::cxx_prologue_file_,
+ &options::cxx_prologue_file_specified_ >;
+ _cli_options_map_["--fwd-prologue-file"] =
+ &::cli::thunk< options, NarrowString, &options::fwd_prologue_file_,
+ &options::fwd_prologue_file_specified_ >;
+ _cli_options_map_["--prologue-file"] =
+ &::cli::thunk< options, NarrowString, &options::prologue_file_,
+ &options::prologue_file_specified_ >;
+ _cli_options_map_["--hxx-epilogue-file"] =
+ &::cli::thunk< options, NarrowString, &options::hxx_epilogue_file_,
+ &options::hxx_epilogue_file_specified_ >;
+ _cli_options_map_["--ixx-epilogue-file"] =
+ &::cli::thunk< options, NarrowString, &options::ixx_epilogue_file_,
+ &options::ixx_epilogue_file_specified_ >;
+ _cli_options_map_["--cxx-epilogue-file"] =
+ &::cli::thunk< options, NarrowString, &options::cxx_epilogue_file_,
+ &options::cxx_epilogue_file_specified_ >;
+ _cli_options_map_["--fwd-epilogue-file"] =
+ &::cli::thunk< options, NarrowString, &options::fwd_epilogue_file_,
+ &options::fwd_epilogue_file_specified_ >;
+ _cli_options_map_["--epilogue-file"] =
+ &::cli::thunk< options, NarrowString, &options::epilogue_file_,
+ &options::epilogue_file_specified_ >;
+ _cli_options_map_["--export-symbol"] =
+ &::cli::thunk< options, NarrowString, &options::export_symbol_,
+ &options::export_symbol_specified_ >;
+ _cli_options_map_["--export-xml-schema"] =
+ &::cli::thunk< options, &options::export_xml_schema_ >;
+ _cli_options_map_["--export-maps"] =
+ &::cli::thunk< options, &options::export_maps_ >;
+ _cli_options_map_["--import-maps"] =
+ &::cli::thunk< options, &options::import_maps_ >;
+ _cli_options_map_["--generate-dep"] =
+ &::cli::thunk< options, &options::generate_dep_ >;
+ _cli_options_map_["--generate-dep-only"] =
+ &::cli::thunk< options, &options::generate_dep_only_ >;
+ _cli_options_map_["--dep-phony"] =
+ &::cli::thunk< options, &options::dep_phony_ >;
+ _cli_options_map_["--dep-target"] =
+ &::cli::thunk< options, NarrowStrings, &options::dep_target_,
+ &options::dep_target_specified_ >;
+ _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_ >;
+ }
+ };
+
+ static _cli_options_map_init _cli_options_map_init_;
+
+ bool options::
+ _parse (const char* o, ::cli::scanner& s)
+ {
+ _cli_options_map::const_iterator i (_cli_options_map_.find (o));
+
+ if (i != _cli_options_map_.end ())
+ {
+ (*(i->second)) (*this, s);
+ return true;
+ }
+
+ // options base
+ //
+ if (::options::_parse (o, s))
+ return true;
+
+ return false;
+ }
+}
+
+// Begin epilogue.
+//
+//
+// End epilogue.
+
diff --git a/xsd/xsd/pregenerated/xsd/cxx/options.hxx b/xsd/xsd/pregenerated/xsd/cxx/options.hxx
new file mode 100644
index 0000000..085aa4c
--- /dev/null
+++ b/xsd/xsd/pregenerated/xsd/cxx/options.hxx
@@ -0,0 +1,451 @@
+// -*- C++ -*-
+//
+// This file was generated by CLI, a command line interface
+// compiler for C++.
+//
+
+#ifndef XSD_CXX_OPTIONS_HXX
+#define XSD_CXX_OPTIONS_HXX
+
+// Begin prologue.
+//
+//
+// End prologue.
+
+#include <cstddef>
+
+#include <xsd/types.hxx>
+
+#include <xsd/cxx/option-types.hxx>
+
+#include <xsd/options.hxx>
+
+namespace CXX
+{
+ class options: public ::options
+ {
+ public:
+ // Option accessors.
+ //
+ const cxx_version&
+ std () const;
+
+ bool
+ std_specified () const;
+
+ const NarrowString&
+ char_type () const;
+
+ bool
+ char_type_specified () const;
+
+ const NarrowString&
+ char_encoding () const;
+
+ bool
+ char_encoding_specified () const;
+
+ const NarrowString&
+ output_dir () const;
+
+ bool
+ output_dir_specified () const;
+
+ const bool&
+ generate_inline () const;
+
+ const bool&
+ generate_xml_schema () const;
+
+ const NarrowString&
+ extern_xml_schema () const;
+
+ bool
+ extern_xml_schema_specified () const;
+
+ const NarrowStrings&
+ namespace_map () const;
+
+ bool
+ namespace_map_specified () const;
+
+ const NarrowStrings&
+ namespace_regex () const;
+
+ bool
+ namespace_regex_specified () const;
+
+ const bool&
+ namespace_regex_trace () const;
+
+ const NarrowStrings&
+ reserved_name () const;
+
+ bool
+ reserved_name_specified () const;
+
+ const bool&
+ include_with_brackets () const;
+
+ const NarrowString&
+ include_prefix () const;
+
+ bool
+ include_prefix_specified () const;
+
+ const NarrowStrings&
+ include_regex () const;
+
+ bool
+ include_regex_specified () const;
+
+ const bool&
+ include_regex_trace () const;
+
+ const NarrowString&
+ guard_prefix () const;
+
+ bool
+ guard_prefix_specified () const;
+
+ const NarrowString&
+ hxx_suffix () const;
+
+ bool
+ hxx_suffix_specified () const;
+
+ const NarrowString&
+ ixx_suffix () const;
+
+ bool
+ ixx_suffix_specified () const;
+
+ const NarrowString&
+ cxx_suffix () const;
+
+ bool
+ cxx_suffix_specified () const;
+
+ const NarrowString&
+ fwd_suffix () const;
+
+ bool
+ fwd_suffix_specified () const;
+
+ const NarrowString&
+ hxx_regex () const;
+
+ bool
+ hxx_regex_specified () const;
+
+ const NarrowString&
+ ixx_regex () const;
+
+ bool
+ ixx_regex_specified () const;
+
+ const NarrowString&
+ cxx_regex () const;
+
+ bool
+ cxx_regex_specified () const;
+
+ const NarrowString&
+ fwd_regex () const;
+
+ bool
+ fwd_regex_specified () const;
+
+ const NarrowStrings&
+ hxx_prologue () const;
+
+ bool
+ hxx_prologue_specified () const;
+
+ const NarrowStrings&
+ ixx_prologue () const;
+
+ bool
+ ixx_prologue_specified () const;
+
+ const NarrowStrings&
+ cxx_prologue () const;
+
+ bool
+ cxx_prologue_specified () const;
+
+ const NarrowStrings&
+ fwd_prologue () const;
+
+ bool
+ fwd_prologue_specified () const;
+
+ const NarrowStrings&
+ prologue () const;
+
+ bool
+ prologue_specified () const;
+
+ const NarrowStrings&
+ hxx_epilogue () const;
+
+ bool
+ hxx_epilogue_specified () const;
+
+ const NarrowStrings&
+ ixx_epilogue () const;
+
+ bool
+ ixx_epilogue_specified () const;
+
+ const NarrowStrings&
+ cxx_epilogue () const;
+
+ bool
+ cxx_epilogue_specified () const;
+
+ const NarrowStrings&
+ fwd_epilogue () const;
+
+ bool
+ fwd_epilogue_specified () const;
+
+ const NarrowStrings&
+ epilogue () const;
+
+ bool
+ epilogue_specified () const;
+
+ const NarrowString&
+ hxx_prologue_file () const;
+
+ bool
+ hxx_prologue_file_specified () const;
+
+ const NarrowString&
+ ixx_prologue_file () const;
+
+ bool
+ ixx_prologue_file_specified () const;
+
+ const NarrowString&
+ cxx_prologue_file () const;
+
+ bool
+ cxx_prologue_file_specified () const;
+
+ const NarrowString&
+ fwd_prologue_file () const;
+
+ bool
+ fwd_prologue_file_specified () const;
+
+ const NarrowString&
+ prologue_file () const;
+
+ bool
+ prologue_file_specified () const;
+
+ const NarrowString&
+ hxx_epilogue_file () const;
+
+ bool
+ hxx_epilogue_file_specified () const;
+
+ const NarrowString&
+ ixx_epilogue_file () const;
+
+ bool
+ ixx_epilogue_file_specified () const;
+
+ const NarrowString&
+ cxx_epilogue_file () const;
+
+ bool
+ cxx_epilogue_file_specified () const;
+
+ const NarrowString&
+ fwd_epilogue_file () const;
+
+ bool
+ fwd_epilogue_file_specified () const;
+
+ const NarrowString&
+ epilogue_file () const;
+
+ bool
+ epilogue_file_specified () const;
+
+ const NarrowString&
+ export_symbol () const;
+
+ bool
+ export_symbol_specified () const;
+
+ const bool&
+ export_xml_schema () const;
+
+ const bool&
+ export_maps () const;
+
+ const bool&
+ import_maps () const;
+
+ const bool&
+ generate_dep () const;
+
+ const bool&
+ generate_dep_only () const;
+
+ const bool&
+ dep_phony () const;
+
+ const NarrowStrings&
+ dep_target () const;
+
+ bool
+ dep_target_specified () const;
+
+ const NarrowString&
+ dep_suffix () const;
+
+ bool
+ dep_suffix_specified () const;
+
+ const NarrowString&
+ dep_file () const;
+
+ bool
+ dep_file_specified () const;
+
+ const NarrowString&
+ dep_regex () const;
+
+ bool
+ dep_regex_specified () const;
+
+ // Print usage information.
+ //
+ static ::cli::usage_para
+ print_usage (::std::wostream&,
+ ::cli::usage_para = ::cli::usage_para::none);
+
+ // Implementation details.
+ //
+ protected:
+ options ();
+
+ bool
+ _parse (const char*, ::cli::scanner&);
+
+ public:
+ cxx_version std_;
+ bool std_specified_;
+ NarrowString char_type_;
+ bool char_type_specified_;
+ NarrowString char_encoding_;
+ bool char_encoding_specified_;
+ NarrowString output_dir_;
+ bool output_dir_specified_;
+ bool generate_inline_;
+ bool generate_xml_schema_;
+ NarrowString extern_xml_schema_;
+ bool extern_xml_schema_specified_;
+ NarrowStrings namespace_map_;
+ bool namespace_map_specified_;
+ NarrowStrings namespace_regex_;
+ bool namespace_regex_specified_;
+ bool namespace_regex_trace_;
+ NarrowStrings reserved_name_;
+ bool reserved_name_specified_;
+ bool include_with_brackets_;
+ NarrowString include_prefix_;
+ bool include_prefix_specified_;
+ NarrowStrings include_regex_;
+ bool include_regex_specified_;
+ bool include_regex_trace_;
+ NarrowString guard_prefix_;
+ bool guard_prefix_specified_;
+ NarrowString hxx_suffix_;
+ bool hxx_suffix_specified_;
+ NarrowString ixx_suffix_;
+ bool ixx_suffix_specified_;
+ NarrowString cxx_suffix_;
+ bool cxx_suffix_specified_;
+ NarrowString fwd_suffix_;
+ bool fwd_suffix_specified_;
+ NarrowString hxx_regex_;
+ bool hxx_regex_specified_;
+ NarrowString ixx_regex_;
+ bool ixx_regex_specified_;
+ NarrowString cxx_regex_;
+ bool cxx_regex_specified_;
+ NarrowString fwd_regex_;
+ bool fwd_regex_specified_;
+ NarrowStrings hxx_prologue_;
+ bool hxx_prologue_specified_;
+ NarrowStrings ixx_prologue_;
+ bool ixx_prologue_specified_;
+ NarrowStrings cxx_prologue_;
+ bool cxx_prologue_specified_;
+ NarrowStrings fwd_prologue_;
+ bool fwd_prologue_specified_;
+ NarrowStrings prologue_;
+ bool prologue_specified_;
+ NarrowStrings hxx_epilogue_;
+ bool hxx_epilogue_specified_;
+ NarrowStrings ixx_epilogue_;
+ bool ixx_epilogue_specified_;
+ NarrowStrings cxx_epilogue_;
+ bool cxx_epilogue_specified_;
+ NarrowStrings fwd_epilogue_;
+ bool fwd_epilogue_specified_;
+ NarrowStrings epilogue_;
+ bool epilogue_specified_;
+ NarrowString hxx_prologue_file_;
+ bool hxx_prologue_file_specified_;
+ NarrowString ixx_prologue_file_;
+ bool ixx_prologue_file_specified_;
+ NarrowString cxx_prologue_file_;
+ bool cxx_prologue_file_specified_;
+ NarrowString fwd_prologue_file_;
+ bool fwd_prologue_file_specified_;
+ NarrowString prologue_file_;
+ bool prologue_file_specified_;
+ NarrowString hxx_epilogue_file_;
+ bool hxx_epilogue_file_specified_;
+ NarrowString ixx_epilogue_file_;
+ bool ixx_epilogue_file_specified_;
+ NarrowString cxx_epilogue_file_;
+ bool cxx_epilogue_file_specified_;
+ NarrowString fwd_epilogue_file_;
+ bool fwd_epilogue_file_specified_;
+ NarrowString epilogue_file_;
+ bool epilogue_file_specified_;
+ NarrowString export_symbol_;
+ bool export_symbol_specified_;
+ bool export_xml_schema_;
+ bool export_maps_;
+ bool import_maps_;
+ bool generate_dep_;
+ bool generate_dep_only_;
+ bool dep_phony_;
+ NarrowStrings dep_target_;
+ 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_;
+ };
+}
+
+#include <xsd/cxx/options.ixx>
+
+// Begin epilogue.
+//
+//
+// End epilogue.
+
+#endif // XSD_CXX_OPTIONS_HXX
diff --git a/xsd/xsd/pregenerated/xsd/cxx/options.ixx b/xsd/xsd/pregenerated/xsd/cxx/options.ixx
new file mode 100644
index 0000000..8266e31
--- /dev/null
+++ b/xsd/xsd/pregenerated/xsd/cxx/options.ixx
@@ -0,0 +1,615 @@
+// -*- C++ -*-
+//
+// This file was generated by CLI, a command line interface
+// compiler for C++.
+//
+
+// Begin prologue.
+//
+//
+// End prologue.
+
+namespace CXX
+{
+ // options
+ //
+
+ inline const cxx_version& options::
+ std () const
+ {
+ return this->std_;
+ }
+
+ inline bool options::
+ std_specified () const
+ {
+ return this->std_specified_;
+ }
+
+ inline const NarrowString& options::
+ char_type () const
+ {
+ return this->char_type_;
+ }
+
+ inline bool options::
+ char_type_specified () const
+ {
+ return this->char_type_specified_;
+ }
+
+ inline const NarrowString& options::
+ char_encoding () const
+ {
+ return this->char_encoding_;
+ }
+
+ inline bool options::
+ char_encoding_specified () const
+ {
+ return this->char_encoding_specified_;
+ }
+
+ inline const NarrowString& options::
+ output_dir () const
+ {
+ return this->output_dir_;
+ }
+
+ inline bool options::
+ output_dir_specified () const
+ {
+ return this->output_dir_specified_;
+ }
+
+ inline const bool& options::
+ generate_inline () const
+ {
+ return this->generate_inline_;
+ }
+
+ inline const bool& options::
+ generate_xml_schema () const
+ {
+ return this->generate_xml_schema_;
+ }
+
+ inline const NarrowString& options::
+ extern_xml_schema () const
+ {
+ return this->extern_xml_schema_;
+ }
+
+ inline bool options::
+ extern_xml_schema_specified () const
+ {
+ return this->extern_xml_schema_specified_;
+ }
+
+ inline const NarrowStrings& options::
+ namespace_map () const
+ {
+ return this->namespace_map_;
+ }
+
+ inline bool options::
+ namespace_map_specified () const
+ {
+ return this->namespace_map_specified_;
+ }
+
+ inline const NarrowStrings& options::
+ namespace_regex () const
+ {
+ return this->namespace_regex_;
+ }
+
+ inline bool options::
+ namespace_regex_specified () const
+ {
+ return this->namespace_regex_specified_;
+ }
+
+ inline const bool& options::
+ namespace_regex_trace () const
+ {
+ return this->namespace_regex_trace_;
+ }
+
+ inline const NarrowStrings& options::
+ reserved_name () const
+ {
+ return this->reserved_name_;
+ }
+
+ inline bool options::
+ reserved_name_specified () const
+ {
+ return this->reserved_name_specified_;
+ }
+
+ inline const bool& options::
+ include_with_brackets () const
+ {
+ return this->include_with_brackets_;
+ }
+
+ inline const NarrowString& options::
+ include_prefix () const
+ {
+ return this->include_prefix_;
+ }
+
+ inline bool options::
+ include_prefix_specified () const
+ {
+ return this->include_prefix_specified_;
+ }
+
+ inline const NarrowStrings& options::
+ include_regex () const
+ {
+ return this->include_regex_;
+ }
+
+ inline bool options::
+ include_regex_specified () const
+ {
+ return this->include_regex_specified_;
+ }
+
+ inline const bool& options::
+ include_regex_trace () const
+ {
+ return this->include_regex_trace_;
+ }
+
+ inline const NarrowString& options::
+ guard_prefix () const
+ {
+ return this->guard_prefix_;
+ }
+
+ inline bool options::
+ guard_prefix_specified () const
+ {
+ return this->guard_prefix_specified_;
+ }
+
+ inline const NarrowString& options::
+ hxx_suffix () const
+ {
+ return this->hxx_suffix_;
+ }
+
+ inline bool options::
+ hxx_suffix_specified () const
+ {
+ return this->hxx_suffix_specified_;
+ }
+
+ inline const NarrowString& options::
+ ixx_suffix () const
+ {
+ return this->ixx_suffix_;
+ }
+
+ inline bool options::
+ ixx_suffix_specified () const
+ {
+ return this->ixx_suffix_specified_;
+ }
+
+ inline const NarrowString& options::
+ cxx_suffix () const
+ {
+ return this->cxx_suffix_;
+ }
+
+ inline bool options::
+ cxx_suffix_specified () const
+ {
+ return this->cxx_suffix_specified_;
+ }
+
+ inline const NarrowString& options::
+ fwd_suffix () const
+ {
+ return this->fwd_suffix_;
+ }
+
+ inline bool options::
+ fwd_suffix_specified () const
+ {
+ return this->fwd_suffix_specified_;
+ }
+
+ inline const NarrowString& options::
+ hxx_regex () const
+ {
+ return this->hxx_regex_;
+ }
+
+ inline bool options::
+ hxx_regex_specified () const
+ {
+ return this->hxx_regex_specified_;
+ }
+
+ inline const NarrowString& options::
+ ixx_regex () const
+ {
+ return this->ixx_regex_;
+ }
+
+ inline bool options::
+ ixx_regex_specified () const
+ {
+ return this->ixx_regex_specified_;
+ }
+
+ inline const NarrowString& options::
+ cxx_regex () const
+ {
+ return this->cxx_regex_;
+ }
+
+ inline bool options::
+ cxx_regex_specified () const
+ {
+ return this->cxx_regex_specified_;
+ }
+
+ inline const NarrowString& options::
+ fwd_regex () const
+ {
+ return this->fwd_regex_;
+ }
+
+ inline bool options::
+ fwd_regex_specified () const
+ {
+ return this->fwd_regex_specified_;
+ }
+
+ inline const NarrowStrings& options::
+ hxx_prologue () const
+ {
+ return this->hxx_prologue_;
+ }
+
+ inline bool options::
+ hxx_prologue_specified () const
+ {
+ return this->hxx_prologue_specified_;
+ }
+
+ inline const NarrowStrings& options::
+ ixx_prologue () const
+ {
+ return this->ixx_prologue_;
+ }
+
+ inline bool options::
+ ixx_prologue_specified () const
+ {
+ return this->ixx_prologue_specified_;
+ }
+
+ inline const NarrowStrings& options::
+ cxx_prologue () const
+ {
+ return this->cxx_prologue_;
+ }
+
+ inline bool options::
+ cxx_prologue_specified () const
+ {
+ return this->cxx_prologue_specified_;
+ }
+
+ inline const NarrowStrings& options::
+ fwd_prologue () const
+ {
+ return this->fwd_prologue_;
+ }
+
+ inline bool options::
+ fwd_prologue_specified () const
+ {
+ return this->fwd_prologue_specified_;
+ }
+
+ inline const NarrowStrings& options::
+ prologue () const
+ {
+ return this->prologue_;
+ }
+
+ inline bool options::
+ prologue_specified () const
+ {
+ return this->prologue_specified_;
+ }
+
+ inline const NarrowStrings& options::
+ hxx_epilogue () const
+ {
+ return this->hxx_epilogue_;
+ }
+
+ inline bool options::
+ hxx_epilogue_specified () const
+ {
+ return this->hxx_epilogue_specified_;
+ }
+
+ inline const NarrowStrings& options::
+ ixx_epilogue () const
+ {
+ return this->ixx_epilogue_;
+ }
+
+ inline bool options::
+ ixx_epilogue_specified () const
+ {
+ return this->ixx_epilogue_specified_;
+ }
+
+ inline const NarrowStrings& options::
+ cxx_epilogue () const
+ {
+ return this->cxx_epilogue_;
+ }
+
+ inline bool options::
+ cxx_epilogue_specified () const
+ {
+ return this->cxx_epilogue_specified_;
+ }
+
+ inline const NarrowStrings& options::
+ fwd_epilogue () const
+ {
+ return this->fwd_epilogue_;
+ }
+
+ inline bool options::
+ fwd_epilogue_specified () const
+ {
+ return this->fwd_epilogue_specified_;
+ }
+
+ inline const NarrowStrings& options::
+ epilogue () const
+ {
+ return this->epilogue_;
+ }
+
+ inline bool options::
+ epilogue_specified () const
+ {
+ return this->epilogue_specified_;
+ }
+
+ inline const NarrowString& options::
+ hxx_prologue_file () const
+ {
+ return this->hxx_prologue_file_;
+ }
+
+ inline bool options::
+ hxx_prologue_file_specified () const
+ {
+ return this->hxx_prologue_file_specified_;
+ }
+
+ inline const NarrowString& options::
+ ixx_prologue_file () const
+ {
+ return this->ixx_prologue_file_;
+ }
+
+ inline bool options::
+ ixx_prologue_file_specified () const
+ {
+ return this->ixx_prologue_file_specified_;
+ }
+
+ inline const NarrowString& options::
+ cxx_prologue_file () const
+ {
+ return this->cxx_prologue_file_;
+ }
+
+ inline bool options::
+ cxx_prologue_file_specified () const
+ {
+ return this->cxx_prologue_file_specified_;
+ }
+
+ inline const NarrowString& options::
+ fwd_prologue_file () const
+ {
+ return this->fwd_prologue_file_;
+ }
+
+ inline bool options::
+ fwd_prologue_file_specified () const
+ {
+ return this->fwd_prologue_file_specified_;
+ }
+
+ inline const NarrowString& options::
+ prologue_file () const
+ {
+ return this->prologue_file_;
+ }
+
+ inline bool options::
+ prologue_file_specified () const
+ {
+ return this->prologue_file_specified_;
+ }
+
+ inline const NarrowString& options::
+ hxx_epilogue_file () const
+ {
+ return this->hxx_epilogue_file_;
+ }
+
+ inline bool options::
+ hxx_epilogue_file_specified () const
+ {
+ return this->hxx_epilogue_file_specified_;
+ }
+
+ inline const NarrowString& options::
+ ixx_epilogue_file () const
+ {
+ return this->ixx_epilogue_file_;
+ }
+
+ inline bool options::
+ ixx_epilogue_file_specified () const
+ {
+ return this->ixx_epilogue_file_specified_;
+ }
+
+ inline const NarrowString& options::
+ cxx_epilogue_file () const
+ {
+ return this->cxx_epilogue_file_;
+ }
+
+ inline bool options::
+ cxx_epilogue_file_specified () const
+ {
+ return this->cxx_epilogue_file_specified_;
+ }
+
+ inline const NarrowString& options::
+ fwd_epilogue_file () const
+ {
+ return this->fwd_epilogue_file_;
+ }
+
+ inline bool options::
+ fwd_epilogue_file_specified () const
+ {
+ return this->fwd_epilogue_file_specified_;
+ }
+
+ inline const NarrowString& options::
+ epilogue_file () const
+ {
+ return this->epilogue_file_;
+ }
+
+ inline bool options::
+ epilogue_file_specified () const
+ {
+ return this->epilogue_file_specified_;
+ }
+
+ inline const NarrowString& options::
+ export_symbol () const
+ {
+ return this->export_symbol_;
+ }
+
+ inline bool options::
+ export_symbol_specified () const
+ {
+ return this->export_symbol_specified_;
+ }
+
+ inline const bool& options::
+ export_xml_schema () const
+ {
+ return this->export_xml_schema_;
+ }
+
+ inline const bool& options::
+ export_maps () const
+ {
+ return this->export_maps_;
+ }
+
+ inline const bool& options::
+ import_maps () const
+ {
+ return this->import_maps_;
+ }
+
+ inline const bool& options::
+ generate_dep () const
+ {
+ return this->generate_dep_;
+ }
+
+ inline const bool& options::
+ generate_dep_only () const
+ {
+ return this->generate_dep_only_;
+ }
+
+ inline const bool& options::
+ dep_phony () const
+ {
+ return this->dep_phony_;
+ }
+
+ inline const NarrowStrings& options::
+ dep_target () const
+ {
+ return this->dep_target_;
+ }
+
+ inline bool options::
+ dep_target_specified () const
+ {
+ return this->dep_target_specified_;
+ }
+
+ inline const NarrowString& options::
+ dep_suffix () const
+ {
+ return this->dep_suffix_;
+ }
+
+ inline bool options::
+ dep_suffix_specified () const
+ {
+ return this->dep_suffix_specified_;
+ }
+
+ 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_;
+ }
+
+ inline bool options::
+ dep_regex_specified () const
+ {
+ return this->dep_regex_specified_;
+ }
+}
+
+// Begin epilogue.
+//
+//
+// End epilogue.
diff --git a/xsd/xsd/pregenerated/xsd/cxx/parser/options.cxx b/xsd/xsd/pregenerated/xsd/cxx/parser/options.cxx
new file mode 100644
index 0000000..60667ac
--- /dev/null
+++ b/xsd/xsd/pregenerated/xsd/cxx/parser/options.cxx
@@ -0,0 +1,776 @@
+// -*- C++ -*-
+//
+// This file was generated by CLI, a command line interface
+// compiler for C++.
+//
+
+// Begin prologue.
+//
+#include <xsd/options-parser.hxx>
+//
+// End prologue.
+
+#include <xsd/cxx/parser/options.hxx>
+
+#include <map>
+#include <set>
+#include <string>
+#include <vector>
+#include <utility>
+#include <ostream>
+#include <sstream>
+#include <cstring>
+
+namespace cli
+{
+ template <typename X>
+ struct parser
+ {
+ static void
+ parse (X& x, bool& xs, scanner& s)
+ {
+ using namespace std;
+
+ const char* o (s.next ());
+ if (s.more ())
+ {
+ string v (s.next ());
+ istringstream is (v);
+ if (!(is >> x && is.peek () == istringstream::traits_type::eof ()))
+ throw invalid_value (o, v);
+ }
+ else
+ throw missing_value (o);
+
+ xs = true;
+ }
+ };
+
+ template <>
+ struct parser<bool>
+ {
+ static void
+ parse (bool& x, bool& xs, scanner& s)
+ {
+ const char* o (s.next ());
+
+ if (s.more ())
+ {
+ const char* v (s.next ());
+
+ if (std::strcmp (v, "1") == 0 ||
+ std::strcmp (v, "true") == 0 ||
+ std::strcmp (v, "TRUE") == 0 ||
+ std::strcmp (v, "True") == 0)
+ x = true;
+ else if (std::strcmp (v, "0") == 0 ||
+ std::strcmp (v, "false") == 0 ||
+ std::strcmp (v, "FALSE") == 0 ||
+ std::strcmp (v, "False") == 0)
+ x = false;
+ else
+ throw invalid_value (o, v);
+ }
+ else
+ throw missing_value (o);
+
+ xs = true;
+ }
+ };
+
+ template <>
+ struct parser<std::string>
+ {
+ static void
+ parse (std::string& x, bool& xs, scanner& s)
+ {
+ const char* o (s.next ());
+
+ if (s.more ())
+ x = s.next ();
+ else
+ throw missing_value (o);
+
+ xs = true;
+ }
+ };
+
+ template <typename X>
+ struct parser<std::pair<X, std::size_t> >
+ {
+ static void
+ parse (std::pair<X, std::size_t>& x, bool& xs, scanner& s)
+ {
+ x.second = s.position ();
+ parser<X>::parse (x.first, xs, s);
+ }
+ };
+
+ template <typename X>
+ struct parser<std::vector<X> >
+ {
+ static void
+ parse (std::vector<X>& c, bool& xs, scanner& s)
+ {
+ X x;
+ bool dummy;
+ parser<X>::parse (x, dummy, s);
+ c.push_back (x);
+ xs = true;
+ }
+ };
+
+ template <typename X, typename C>
+ struct parser<std::set<X, C> >
+ {
+ static void
+ parse (std::set<X, C>& c, bool& xs, scanner& s)
+ {
+ X x;
+ bool dummy;
+ parser<X>::parse (x, dummy, s);
+ c.insert (x);
+ xs = true;
+ }
+ };
+
+ template <typename K, typename V, typename C>
+ struct parser<std::map<K, V, C> >
+ {
+ static void
+ parse (std::map<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[k] = v;
+ }
+ else
+ throw missing_value (o);
+
+ xs = true;
+ }
+ };
+
+ 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)
+ {
+ parser<T>::parse (x.*M, s);
+ }
+
+ template <typename X, bool X::*M>
+ void
+ thunk (X& x, scanner& s)
+ {
+ s.next ();
+ x.*M = true;
+ }
+
+ template <typename X, typename T, T X::*M, bool X::*S>
+ void
+ thunk (X& x, scanner& s)
+ {
+ parser<T>::parse (x.*M, x.*S, s);
+ }
+}
+
+#include <map>
+
+namespace CXX
+{
+ namespace Parser
+ {
+ // options
+ //
+
+ options::
+ options ()
+ : type_map_ (),
+ type_map_specified_ (false),
+ xml_parser_ ("xerces"),
+ xml_parser_specified_ (false),
+ generate_validation_ (),
+ suppress_validation_ (),
+ generate_polymorphic_ (),
+ generate_noop_impl_ (),
+ generate_print_impl_ (),
+ generate_test_driver_ (),
+ force_overwrite_ (),
+ root_element_first_ (),
+ root_element_last_ (),
+ root_element_ (),
+ root_element_specified_ (false),
+ skel_type_suffix_ ("_pskel"),
+ skel_type_suffix_specified_ (false),
+ skel_file_suffix_ ("-pskel"),
+ skel_file_suffix_specified_ (false),
+ impl_type_suffix_ ("_pimpl"),
+ impl_type_suffix_specified_ (false),
+ impl_file_suffix_ ("-pimpl"),
+ impl_file_suffix_specified_ (false)
+ {
+ }
+
+ options::
+ options (int& argc,
+ char** argv,
+ bool erase,
+ ::cli::unknown_mode opt,
+ ::cli::unknown_mode arg)
+ : type_map_ (),
+ type_map_specified_ (false),
+ xml_parser_ ("xerces"),
+ xml_parser_specified_ (false),
+ generate_validation_ (),
+ suppress_validation_ (),
+ generate_polymorphic_ (),
+ generate_noop_impl_ (),
+ generate_print_impl_ (),
+ generate_test_driver_ (),
+ force_overwrite_ (),
+ root_element_first_ (),
+ root_element_last_ (),
+ root_element_ (),
+ root_element_specified_ (false),
+ skel_type_suffix_ ("_pskel"),
+ skel_type_suffix_specified_ (false),
+ skel_file_suffix_ ("-pskel"),
+ skel_file_suffix_specified_ (false),
+ impl_type_suffix_ ("_pimpl"),
+ impl_type_suffix_specified_ (false),
+ impl_file_suffix_ ("-pimpl"),
+ impl_file_suffix_specified_ (false)
+ {
+ ::cli::argv_scanner s (argc, argv, erase);
+ _parse (s, opt, arg);
+ }
+
+ options::
+ options (int start,
+ int& argc,
+ char** argv,
+ bool erase,
+ ::cli::unknown_mode opt,
+ ::cli::unknown_mode arg)
+ : type_map_ (),
+ type_map_specified_ (false),
+ xml_parser_ ("xerces"),
+ xml_parser_specified_ (false),
+ generate_validation_ (),
+ suppress_validation_ (),
+ generate_polymorphic_ (),
+ generate_noop_impl_ (),
+ generate_print_impl_ (),
+ generate_test_driver_ (),
+ force_overwrite_ (),
+ root_element_first_ (),
+ root_element_last_ (),
+ root_element_ (),
+ root_element_specified_ (false),
+ skel_type_suffix_ ("_pskel"),
+ skel_type_suffix_specified_ (false),
+ skel_file_suffix_ ("-pskel"),
+ skel_file_suffix_specified_ (false),
+ impl_type_suffix_ ("_pimpl"),
+ impl_type_suffix_specified_ (false),
+ impl_file_suffix_ ("-pimpl"),
+ impl_file_suffix_specified_ (false)
+ {
+ ::cli::argv_scanner s (start, argc, argv, erase);
+ _parse (s, opt, arg);
+ }
+
+ options::
+ options (int& argc,
+ char** argv,
+ int& end,
+ bool erase,
+ ::cli::unknown_mode opt,
+ ::cli::unknown_mode arg)
+ : type_map_ (),
+ type_map_specified_ (false),
+ xml_parser_ ("xerces"),
+ xml_parser_specified_ (false),
+ generate_validation_ (),
+ suppress_validation_ (),
+ generate_polymorphic_ (),
+ generate_noop_impl_ (),
+ generate_print_impl_ (),
+ generate_test_driver_ (),
+ force_overwrite_ (),
+ root_element_first_ (),
+ root_element_last_ (),
+ root_element_ (),
+ root_element_specified_ (false),
+ skel_type_suffix_ ("_pskel"),
+ skel_type_suffix_specified_ (false),
+ skel_file_suffix_ ("-pskel"),
+ skel_file_suffix_specified_ (false),
+ impl_type_suffix_ ("_pimpl"),
+ impl_type_suffix_specified_ (false),
+ impl_file_suffix_ ("-pimpl"),
+ impl_file_suffix_specified_ (false)
+ {
+ ::cli::argv_scanner s (argc, argv, erase);
+ _parse (s, opt, arg);
+ end = s.end ();
+ }
+
+ options::
+ options (int start,
+ int& argc,
+ char** argv,
+ int& end,
+ bool erase,
+ ::cli::unknown_mode opt,
+ ::cli::unknown_mode arg)
+ : type_map_ (),
+ type_map_specified_ (false),
+ xml_parser_ ("xerces"),
+ xml_parser_specified_ (false),
+ generate_validation_ (),
+ suppress_validation_ (),
+ generate_polymorphic_ (),
+ generate_noop_impl_ (),
+ generate_print_impl_ (),
+ generate_test_driver_ (),
+ force_overwrite_ (),
+ root_element_first_ (),
+ root_element_last_ (),
+ root_element_ (),
+ root_element_specified_ (false),
+ skel_type_suffix_ ("_pskel"),
+ skel_type_suffix_specified_ (false),
+ skel_file_suffix_ ("-pskel"),
+ skel_file_suffix_specified_ (false),
+ impl_type_suffix_ ("_pimpl"),
+ impl_type_suffix_specified_ (false),
+ impl_file_suffix_ ("-pimpl"),
+ impl_file_suffix_specified_ (false)
+ {
+ ::cli::argv_scanner s (start, argc, argv, erase);
+ _parse (s, opt, arg);
+ end = s.end ();
+ }
+
+ options::
+ options (::cli::scanner& s,
+ ::cli::unknown_mode opt,
+ ::cli::unknown_mode arg)
+ : type_map_ (),
+ type_map_specified_ (false),
+ xml_parser_ ("xerces"),
+ xml_parser_specified_ (false),
+ generate_validation_ (),
+ suppress_validation_ (),
+ generate_polymorphic_ (),
+ generate_noop_impl_ (),
+ generate_print_impl_ (),
+ generate_test_driver_ (),
+ force_overwrite_ (),
+ root_element_first_ (),
+ root_element_last_ (),
+ root_element_ (),
+ root_element_specified_ (false),
+ skel_type_suffix_ ("_pskel"),
+ skel_type_suffix_specified_ (false),
+ skel_file_suffix_ ("-pskel"),
+ skel_file_suffix_specified_ (false),
+ impl_type_suffix_ ("_pimpl"),
+ impl_type_suffix_specified_ (false),
+ impl_file_suffix_ ("-pimpl"),
+ impl_file_suffix_specified_ (false)
+ {
+ _parse (s, opt, arg);
+ }
+
+ ::cli::usage_para options::
+ print_usage (::std::wostream& os, ::cli::usage_para p)
+ {
+ CLI_POTENTIALLY_UNUSED (os);
+
+ if (p == ::cli::usage_para::text)
+ os << ::std::endl;
+
+ os << "--type-map <mapfile> Read XML Schema to C++ type mapping information" << ::std::endl
+ << " from <mapfile>." << ::std::endl;
+
+ os << "--xml-parser <parser> Use <parser> as the underlying XML parser." << ::std::endl;
+
+ os << "--generate-validation Generate validation code." << ::std::endl;
+
+ os << "--suppress-validation Suppress the generation of validation code." << ::std::endl;
+
+ os << "--generate-polymorphic Generate polymorphism-aware code." << ::std::endl;
+
+ os << "--generate-noop-impl Generate a sample parser implementation that does" << ::std::endl
+ << " nothing (no operation)." << ::std::endl;
+
+ os << "--generate-print-impl Generate a sample parser implementation that" << ::std::endl
+ << " prints the XML data to STDOUT." << ::std::endl;
+
+ os << "--generate-test-driver Generate a test driver for the sample parser" << ::std::endl
+ << " implementation." << ::std::endl;
+
+ os << "--force-overwrite Force overwriting of the existing implementation" << ::std::endl
+ << " and test driver files." << ::std::endl;
+
+ os << "--root-element-first Indicate that the first global element is the" << ::std::endl
+ << " document root." << ::std::endl;
+
+ os << "--root-element-last Indicate that the last global element is the" << ::std::endl
+ << " document root." << ::std::endl;
+
+ os << "--root-element <element> Indicate that <element> is the document root." << ::std::endl;
+
+ os << "--skel-type-suffix <suffix> Use the provided <suffix> instead of the default" << ::std::endl
+ << " _pskel to construct the names of the generated" << ::std::endl
+ << " parser skeletons." << ::std::endl;
+
+ os << "--skel-file-suffix <suffix> Use the provided <suffix> instead of the default" << ::std::endl
+ << " -pskel to construct the names of the generated" << ::std::endl
+ << " parser skeleton files." << ::std::endl;
+
+ os << "--impl-type-suffix <suffix> Use the provided <suffix> instead of the default" << ::std::endl
+ << " _pimpl to construct the names of the parser" << ::std::endl
+ << " implementations for the built-in XML Schema types" << ::std::endl
+ << " as well as sample parser implementations." << ::std::endl;
+
+ os << "--impl-file-suffix <suffix> Use the provided <suffix> instead of the default" << ::std::endl
+ << " -pimpl to construct the names of the generated" << ::std::endl
+ << " sample parser implementation files." << ::std::endl;
+
+ p = ::cli::usage_para::option;
+
+ return p;
+ }
+
+ typedef
+ std::map<std::string, void (*) (options&, ::cli::scanner&)>
+ _cli_options_map;
+
+ static _cli_options_map _cli_options_map_;
+
+ struct _cli_options_map_init
+ {
+ _cli_options_map_init ()
+ {
+ _cli_options_map_["--type-map"] =
+ &::cli::thunk< options, NarrowStrings, &options::type_map_,
+ &options::type_map_specified_ >;
+ _cli_options_map_["--xml-parser"] =
+ &::cli::thunk< options, NarrowString, &options::xml_parser_,
+ &options::xml_parser_specified_ >;
+ _cli_options_map_["--generate-validation"] =
+ &::cli::thunk< options, &options::generate_validation_ >;
+ _cli_options_map_["--suppress-validation"] =
+ &::cli::thunk< options, &options::suppress_validation_ >;
+ _cli_options_map_["--generate-polymorphic"] =
+ &::cli::thunk< options, &options::generate_polymorphic_ >;
+ _cli_options_map_["--generate-noop-impl"] =
+ &::cli::thunk< options, &options::generate_noop_impl_ >;
+ _cli_options_map_["--generate-print-impl"] =
+ &::cli::thunk< options, &options::generate_print_impl_ >;
+ _cli_options_map_["--generate-test-driver"] =
+ &::cli::thunk< options, &options::generate_test_driver_ >;
+ _cli_options_map_["--force-overwrite"] =
+ &::cli::thunk< options, &options::force_overwrite_ >;
+ _cli_options_map_["--root-element-first"] =
+ &::cli::thunk< options, &options::root_element_first_ >;
+ _cli_options_map_["--root-element-last"] =
+ &::cli::thunk< options, &options::root_element_last_ >;
+ _cli_options_map_["--root-element"] =
+ &::cli::thunk< options, NarrowString, &options::root_element_,
+ &options::root_element_specified_ >;
+ _cli_options_map_["--skel-type-suffix"] =
+ &::cli::thunk< options, NarrowString, &options::skel_type_suffix_,
+ &options::skel_type_suffix_specified_ >;
+ _cli_options_map_["--skel-file-suffix"] =
+ &::cli::thunk< options, NarrowString, &options::skel_file_suffix_,
+ &options::skel_file_suffix_specified_ >;
+ _cli_options_map_["--impl-type-suffix"] =
+ &::cli::thunk< options, NarrowString, &options::impl_type_suffix_,
+ &options::impl_type_suffix_specified_ >;
+ _cli_options_map_["--impl-file-suffix"] =
+ &::cli::thunk< options, NarrowString, &options::impl_file_suffix_,
+ &options::impl_file_suffix_specified_ >;
+ }
+ };
+
+ static _cli_options_map_init _cli_options_map_init_;
+
+ bool options::
+ _parse (const char* o, ::cli::scanner& s)
+ {
+ _cli_options_map::const_iterator i (_cli_options_map_.find (o));
+
+ if (i != _cli_options_map_.end ())
+ {
+ (*(i->second)) (*this, s);
+ return true;
+ }
+
+ // options base
+ //
+ if (::CXX::options::_parse (o, s))
+ return true;
+
+ return false;
+ }
+
+ bool options::
+ _parse (::cli::scanner& s,
+ ::cli::unknown_mode opt_mode,
+ ::cli::unknown_mode arg_mode)
+ {
+ // Can't skip combined flags (--no-combined-flags).
+ //
+ assert (opt_mode != ::cli::unknown_mode::skip);
+
+ bool r = false;
+ bool opt = true;
+
+ while (s.more ())
+ {
+ const char* o = s.peek ();
+
+ if (std::strcmp (o, "--") == 0)
+ {
+ opt = false;
+ s.skip ();
+ r = true;
+ continue;
+ }
+
+ if (opt)
+ {
+ if (_parse (o, s))
+ {
+ r = true;
+ continue;
+ }
+
+ if (std::strncmp (o, "-", 1) == 0 && o[1] != '\0')
+ {
+ // Handle combined option values.
+ //
+ std::string co;
+ if (const char* v = std::strchr (o, '='))
+ {
+ co.assign (o, 0, v - o);
+ ++v;
+
+ int ac (2);
+ char* av[] =
+ {
+ const_cast<char*> (co.c_str ()),
+ const_cast<char*> (v)
+ };
+
+ ::cli::argv_scanner ns (0, ac, av);
+
+ if (_parse (co.c_str (), ns))
+ {
+ // Parsed the option but not its value?
+ //
+ if (ns.end () != 2)
+ throw ::cli::invalid_value (co, v);
+
+ s.next ();
+ r = true;
+ continue;
+ }
+ else
+ {
+ // Set the unknown option and fall through.
+ //
+ o = co.c_str ();
+ }
+ }
+
+ // Handle combined flags.
+ //
+ char cf[3];
+ {
+ const char* p = o + 1;
+ for (; *p != '\0'; ++p)
+ {
+ if (!((*p >= 'a' && *p <= 'z') ||
+ (*p >= 'A' && *p <= 'Z') ||
+ (*p >= '0' && *p <= '9')))
+ break;
+ }
+
+ if (*p == '\0')
+ {
+ for (p = o + 1; *p != '\0'; ++p)
+ {
+ std::strcpy (cf, "-");
+ cf[1] = *p;
+ cf[2] = '\0';
+
+ int ac (1);
+ char* av[] =
+ {
+ cf
+ };
+
+ ::cli::argv_scanner ns (0, ac, av);
+
+ if (!_parse (cf, ns))
+ break;
+ }
+
+ if (*p == '\0')
+ {
+ // All handled.
+ //
+ s.next ();
+ r = true;
+ continue;
+ }
+ else
+ {
+ // Set the unknown option and fall through.
+ //
+ o = cf;
+ }
+ }
+ }
+
+ switch (opt_mode)
+ {
+ case ::cli::unknown_mode::skip:
+ {
+ s.skip ();
+ r = true;
+ continue;
+ }
+ case ::cli::unknown_mode::stop:
+ {
+ break;
+ }
+ case ::cli::unknown_mode::fail:
+ {
+ throw ::cli::unknown_option (o);
+ }
+ }
+
+ break;
+ }
+ }
+
+ switch (arg_mode)
+ {
+ case ::cli::unknown_mode::skip:
+ {
+ s.skip ();
+ r = true;
+ continue;
+ }
+ case ::cli::unknown_mode::stop:
+ {
+ break;
+ }
+ case ::cli::unknown_mode::fail:
+ {
+ throw ::cli::unknown_argument (o);
+ }
+ }
+
+ break;
+ }
+
+ return r;
+ }
+ }
+}
+
+// Begin epilogue.
+//
+//
+// End epilogue.
+
diff --git a/xsd/xsd/pregenerated/xsd/cxx/parser/options.hxx b/xsd/xsd/pregenerated/xsd/cxx/parser/options.hxx
new file mode 100644
index 0000000..03b67fd
--- /dev/null
+++ b/xsd/xsd/pregenerated/xsd/cxx/parser/options.hxx
@@ -0,0 +1,186 @@
+// -*- C++ -*-
+//
+// This file was generated by CLI, a command line interface
+// compiler for C++.
+//
+
+#ifndef XSD_CXX_PARSER_OPTIONS_HXX
+#define XSD_CXX_PARSER_OPTIONS_HXX
+
+// Begin prologue.
+//
+//
+// End prologue.
+
+#include <cstddef>
+
+#include <xsd/types.hxx>
+
+#include <xsd/cxx/options.hxx>
+
+namespace CXX
+{
+ namespace Parser
+ {
+ class options: public ::CXX::options
+ {
+ public:
+ options ();
+
+ options (int& argc,
+ char** argv,
+ bool erase = false,
+ ::cli::unknown_mode option = ::cli::unknown_mode::fail,
+ ::cli::unknown_mode argument = ::cli::unknown_mode::stop);
+
+ options (int start,
+ int& argc,
+ char** argv,
+ bool erase = false,
+ ::cli::unknown_mode option = ::cli::unknown_mode::fail,
+ ::cli::unknown_mode argument = ::cli::unknown_mode::stop);
+
+ options (int& argc,
+ char** argv,
+ int& end,
+ bool erase = false,
+ ::cli::unknown_mode option = ::cli::unknown_mode::fail,
+ ::cli::unknown_mode argument = ::cli::unknown_mode::stop);
+
+ options (int start,
+ int& argc,
+ char** argv,
+ int& end,
+ bool erase = false,
+ ::cli::unknown_mode option = ::cli::unknown_mode::fail,
+ ::cli::unknown_mode argument = ::cli::unknown_mode::stop);
+
+ options (::cli::scanner&,
+ ::cli::unknown_mode option = ::cli::unknown_mode::fail,
+ ::cli::unknown_mode argument = ::cli::unknown_mode::stop);
+
+ // Option accessors.
+ //
+ const NarrowStrings&
+ type_map () const;
+
+ bool
+ type_map_specified () const;
+
+ const NarrowString&
+ xml_parser () const;
+
+ bool
+ xml_parser_specified () const;
+
+ const bool&
+ generate_validation () const;
+
+ const bool&
+ suppress_validation () const;
+
+ const bool&
+ generate_polymorphic () const;
+
+ const bool&
+ generate_noop_impl () const;
+
+ const bool&
+ generate_print_impl () const;
+
+ const bool&
+ generate_test_driver () const;
+
+ const bool&
+ force_overwrite () const;
+
+ const bool&
+ root_element_first () const;
+
+ const bool&
+ root_element_last () const;
+
+ const NarrowString&
+ root_element () const;
+
+ bool
+ root_element_specified () const;
+
+ const NarrowString&
+ skel_type_suffix () const;
+
+ bool
+ skel_type_suffix_specified () const;
+
+ const NarrowString&
+ skel_file_suffix () const;
+
+ bool
+ skel_file_suffix_specified () const;
+
+ const NarrowString&
+ impl_type_suffix () const;
+
+ bool
+ impl_type_suffix_specified () const;
+
+ const NarrowString&
+ impl_file_suffix () const;
+
+ bool
+ impl_file_suffix_specified () const;
+
+ // Print usage information.
+ //
+ static ::cli::usage_para
+ print_usage (::std::wostream&,
+ ::cli::usage_para = ::cli::usage_para::none);
+
+ // Implementation details.
+ //
+ protected:
+ bool
+ _parse (const char*, ::cli::scanner&);
+
+ private:
+ bool
+ _parse (::cli::scanner&,
+ ::cli::unknown_mode option,
+ ::cli::unknown_mode argument);
+
+ public:
+ NarrowStrings type_map_;
+ bool type_map_specified_;
+ NarrowString xml_parser_;
+ bool xml_parser_specified_;
+ bool generate_validation_;
+ bool suppress_validation_;
+ bool generate_polymorphic_;
+ bool generate_noop_impl_;
+ bool generate_print_impl_;
+ bool generate_test_driver_;
+ bool force_overwrite_;
+ bool root_element_first_;
+ bool root_element_last_;
+ NarrowString root_element_;
+ bool root_element_specified_;
+ NarrowString skel_type_suffix_;
+ bool skel_type_suffix_specified_;
+ NarrowString skel_file_suffix_;
+ bool skel_file_suffix_specified_;
+ NarrowString impl_type_suffix_;
+ bool impl_type_suffix_specified_;
+ NarrowString impl_file_suffix_;
+ bool impl_file_suffix_specified_;
+ };
+ }
+}
+
+#include <xsd/cxx/parser/options.ixx>
+
+// Begin epilogue.
+//
+//
+// End epilogue.
+
+#endif // XSD_CXX_PARSER_OPTIONS_HXX
diff --git a/xsd/xsd/pregenerated/xsd/cxx/parser/options.ixx b/xsd/xsd/pregenerated/xsd/cxx/parser/options.ixx
new file mode 100644
index 0000000..64c00c5
--- /dev/null
+++ b/xsd/xsd/pregenerated/xsd/cxx/parser/options.ixx
@@ -0,0 +1,162 @@
+// -*- C++ -*-
+//
+// This file was generated by CLI, a command line interface
+// compiler for C++.
+//
+
+// Begin prologue.
+//
+//
+// End prologue.
+
+namespace CXX
+{
+ namespace Parser
+ {
+ // options
+ //
+
+ inline const NarrowStrings& options::
+ type_map () const
+ {
+ return this->type_map_;
+ }
+
+ inline bool options::
+ type_map_specified () const
+ {
+ return this->type_map_specified_;
+ }
+
+ inline const NarrowString& options::
+ xml_parser () const
+ {
+ return this->xml_parser_;
+ }
+
+ inline bool options::
+ xml_parser_specified () const
+ {
+ return this->xml_parser_specified_;
+ }
+
+ inline const bool& options::
+ generate_validation () const
+ {
+ return this->generate_validation_;
+ }
+
+ inline const bool& options::
+ suppress_validation () const
+ {
+ return this->suppress_validation_;
+ }
+
+ inline const bool& options::
+ generate_polymorphic () const
+ {
+ return this->generate_polymorphic_;
+ }
+
+ inline const bool& options::
+ generate_noop_impl () const
+ {
+ return this->generate_noop_impl_;
+ }
+
+ inline const bool& options::
+ generate_print_impl () const
+ {
+ return this->generate_print_impl_;
+ }
+
+ inline const bool& options::
+ generate_test_driver () const
+ {
+ return this->generate_test_driver_;
+ }
+
+ inline const bool& options::
+ force_overwrite () const
+ {
+ return this->force_overwrite_;
+ }
+
+ inline const bool& options::
+ root_element_first () const
+ {
+ return this->root_element_first_;
+ }
+
+ inline const bool& options::
+ root_element_last () const
+ {
+ return this->root_element_last_;
+ }
+
+ inline const NarrowString& options::
+ root_element () const
+ {
+ return this->root_element_;
+ }
+
+ inline bool options::
+ root_element_specified () const
+ {
+ return this->root_element_specified_;
+ }
+
+ inline const NarrowString& options::
+ skel_type_suffix () const
+ {
+ return this->skel_type_suffix_;
+ }
+
+ inline bool options::
+ skel_type_suffix_specified () const
+ {
+ return this->skel_type_suffix_specified_;
+ }
+
+ inline const NarrowString& options::
+ skel_file_suffix () const
+ {
+ return this->skel_file_suffix_;
+ }
+
+ inline bool options::
+ skel_file_suffix_specified () const
+ {
+ return this->skel_file_suffix_specified_;
+ }
+
+ inline const NarrowString& options::
+ impl_type_suffix () const
+ {
+ return this->impl_type_suffix_;
+ }
+
+ inline bool options::
+ impl_type_suffix_specified () const
+ {
+ return this->impl_type_suffix_specified_;
+ }
+
+ inline const NarrowString& options::
+ impl_file_suffix () const
+ {
+ return this->impl_file_suffix_;
+ }
+
+ inline bool options::
+ impl_file_suffix_specified () const
+ {
+ return this->impl_file_suffix_specified_;
+ }
+ }
+}
+
+// Begin epilogue.
+//
+//
+// End epilogue.
diff --git a/xsd/xsd/pregenerated/xsd/cxx/tree/options.cxx b/xsd/xsd/pregenerated/xsd/cxx/tree/options.cxx
new file mode 100644
index 0000000..17214c1
--- /dev/null
+++ b/xsd/xsd/pregenerated/xsd/cxx/tree/options.cxx
@@ -0,0 +1,1343 @@
+// -*- C++ -*-
+//
+// This file was generated by CLI, a command line interface
+// compiler for C++.
+//
+
+// Begin prologue.
+//
+#include <xsd/options-parser.hxx>
+//
+// End prologue.
+
+#include <xsd/cxx/tree/options.hxx>
+
+#include <map>
+#include <set>
+#include <string>
+#include <vector>
+#include <utility>
+#include <ostream>
+#include <sstream>
+#include <cstring>
+
+namespace cli
+{
+ template <typename X>
+ struct parser
+ {
+ static void
+ parse (X& x, bool& xs, scanner& s)
+ {
+ using namespace std;
+
+ const char* o (s.next ());
+ if (s.more ())
+ {
+ string v (s.next ());
+ istringstream is (v);
+ if (!(is >> x && is.peek () == istringstream::traits_type::eof ()))
+ throw invalid_value (o, v);
+ }
+ else
+ throw missing_value (o);
+
+ xs = true;
+ }
+ };
+
+ template <>
+ struct parser<bool>
+ {
+ static void
+ parse (bool& x, bool& xs, scanner& s)
+ {
+ const char* o (s.next ());
+
+ if (s.more ())
+ {
+ const char* v (s.next ());
+
+ if (std::strcmp (v, "1") == 0 ||
+ std::strcmp (v, "true") == 0 ||
+ std::strcmp (v, "TRUE") == 0 ||
+ std::strcmp (v, "True") == 0)
+ x = true;
+ else if (std::strcmp (v, "0") == 0 ||
+ std::strcmp (v, "false") == 0 ||
+ std::strcmp (v, "FALSE") == 0 ||
+ std::strcmp (v, "False") == 0)
+ x = false;
+ else
+ throw invalid_value (o, v);
+ }
+ else
+ throw missing_value (o);
+
+ xs = true;
+ }
+ };
+
+ template <>
+ struct parser<std::string>
+ {
+ static void
+ parse (std::string& x, bool& xs, scanner& s)
+ {
+ const char* o (s.next ());
+
+ if (s.more ())
+ x = s.next ();
+ else
+ throw missing_value (o);
+
+ xs = true;
+ }
+ };
+
+ template <typename X>
+ struct parser<std::pair<X, std::size_t> >
+ {
+ static void
+ parse (std::pair<X, std::size_t>& x, bool& xs, scanner& s)
+ {
+ x.second = s.position ();
+ parser<X>::parse (x.first, xs, s);
+ }
+ };
+
+ template <typename X>
+ struct parser<std::vector<X> >
+ {
+ static void
+ parse (std::vector<X>& c, bool& xs, scanner& s)
+ {
+ X x;
+ bool dummy;
+ parser<X>::parse (x, dummy, s);
+ c.push_back (x);
+ xs = true;
+ }
+ };
+
+ template <typename X, typename C>
+ struct parser<std::set<X, C> >
+ {
+ static void
+ parse (std::set<X, C>& c, bool& xs, scanner& s)
+ {
+ X x;
+ bool dummy;
+ parser<X>::parse (x, dummy, s);
+ c.insert (x);
+ xs = true;
+ }
+ };
+
+ template <typename K, typename V, typename C>
+ struct parser<std::map<K, V, C> >
+ {
+ static void
+ parse (std::map<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[k] = v;
+ }
+ else
+ throw missing_value (o);
+
+ xs = true;
+ }
+ };
+
+ 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)
+ {
+ parser<T>::parse (x.*M, s);
+ }
+
+ template <typename X, bool X::*M>
+ void
+ thunk (X& x, scanner& s)
+ {
+ s.next ();
+ x.*M = true;
+ }
+
+ template <typename X, typename T, T X::*M, bool X::*S>
+ void
+ thunk (X& x, scanner& s)
+ {
+ parser<T>::parse (x.*M, x.*S, s);
+ }
+}
+
+#include <map>
+
+namespace CXX
+{
+ namespace Tree
+ {
+ // options
+ //
+
+ options::
+ options ()
+ : generate_polymorphic_ (),
+ polymorphic_type_ (),
+ polymorphic_type_specified_ (false),
+ polymorphic_type_all_ (),
+ polymorphic_plate_ (0),
+ polymorphic_plate_specified_ (false),
+ ordered_type_ (),
+ ordered_type_specified_ (false),
+ ordered_type_derived_ (),
+ ordered_type_mixed_ (),
+ ordered_type_all_ (),
+ order_container_ (),
+ order_container_specified_ (false),
+ generate_serialization_ (),
+ generate_ostream_ (),
+ generate_doxygen_ (),
+ generate_comparison_ (),
+ generate_default_ctor_ (),
+ generate_from_base_ctor_ (),
+ suppress_assignment_ (),
+ generate_detach_ (),
+ generate_wildcard_ (),
+ generate_any_type_ (),
+ generate_insertion_ (),
+ generate_insertion_specified_ (false),
+ generate_extraction_ (),
+ generate_extraction_specified_ (false),
+ generate_forward_ (),
+ suppress_parsing_ (),
+ generate_element_type_ (),
+ generate_element_map_ (),
+ generate_intellisense_ (),
+ omit_default_attributes_ (),
+ type_naming_ ("knr"),
+ type_naming_specified_ (false),
+ function_naming_ ("knr"),
+ function_naming_specified_ (false),
+ type_regex_ (),
+ type_regex_specified_ (false),
+ accessor_regex_ (),
+ accessor_regex_specified_ (false),
+ one_accessor_regex_ (),
+ one_accessor_regex_specified_ (false),
+ opt_accessor_regex_ (),
+ opt_accessor_regex_specified_ (false),
+ seq_accessor_regex_ (),
+ seq_accessor_regex_specified_ (false),
+ modifier_regex_ (),
+ modifier_regex_specified_ (false),
+ one_modifier_regex_ (),
+ one_modifier_regex_specified_ (false),
+ opt_modifier_regex_ (),
+ opt_modifier_regex_specified_ (false),
+ seq_modifier_regex_ (),
+ seq_modifier_regex_specified_ (false),
+ parser_regex_ (),
+ parser_regex_specified_ (false),
+ serializer_regex_ (),
+ serializer_regex_specified_ (false),
+ const_regex_ (),
+ const_regex_specified_ (false),
+ enumerator_regex_ (),
+ enumerator_regex_specified_ (false),
+ element_type_regex_ (),
+ element_type_regex_specified_ (false),
+ name_regex_trace_ (),
+ root_element_first_ (),
+ root_element_last_ (),
+ root_element_all_ (),
+ root_element_none_ (),
+ root_element_ (),
+ root_element_specified_ (false),
+ custom_type_ (),
+ custom_type_specified_ (false),
+ custom_type_regex_ (),
+ custom_type_regex_specified_ (false),
+ parts_ (1),
+ parts_specified_ (false),
+ parts_suffix_ ("-"),
+ parts_suffix_specified_ (false)
+ {
+ }
+
+ options::
+ options (int& argc,
+ char** argv,
+ bool erase,
+ ::cli::unknown_mode opt,
+ ::cli::unknown_mode arg)
+ : generate_polymorphic_ (),
+ polymorphic_type_ (),
+ polymorphic_type_specified_ (false),
+ polymorphic_type_all_ (),
+ polymorphic_plate_ (0),
+ polymorphic_plate_specified_ (false),
+ ordered_type_ (),
+ ordered_type_specified_ (false),
+ ordered_type_derived_ (),
+ ordered_type_mixed_ (),
+ ordered_type_all_ (),
+ order_container_ (),
+ order_container_specified_ (false),
+ generate_serialization_ (),
+ generate_ostream_ (),
+ generate_doxygen_ (),
+ generate_comparison_ (),
+ generate_default_ctor_ (),
+ generate_from_base_ctor_ (),
+ suppress_assignment_ (),
+ generate_detach_ (),
+ generate_wildcard_ (),
+ generate_any_type_ (),
+ generate_insertion_ (),
+ generate_insertion_specified_ (false),
+ generate_extraction_ (),
+ generate_extraction_specified_ (false),
+ generate_forward_ (),
+ suppress_parsing_ (),
+ generate_element_type_ (),
+ generate_element_map_ (),
+ generate_intellisense_ (),
+ omit_default_attributes_ (),
+ type_naming_ ("knr"),
+ type_naming_specified_ (false),
+ function_naming_ ("knr"),
+ function_naming_specified_ (false),
+ type_regex_ (),
+ type_regex_specified_ (false),
+ accessor_regex_ (),
+ accessor_regex_specified_ (false),
+ one_accessor_regex_ (),
+ one_accessor_regex_specified_ (false),
+ opt_accessor_regex_ (),
+ opt_accessor_regex_specified_ (false),
+ seq_accessor_regex_ (),
+ seq_accessor_regex_specified_ (false),
+ modifier_regex_ (),
+ modifier_regex_specified_ (false),
+ one_modifier_regex_ (),
+ one_modifier_regex_specified_ (false),
+ opt_modifier_regex_ (),
+ opt_modifier_regex_specified_ (false),
+ seq_modifier_regex_ (),
+ seq_modifier_regex_specified_ (false),
+ parser_regex_ (),
+ parser_regex_specified_ (false),
+ serializer_regex_ (),
+ serializer_regex_specified_ (false),
+ const_regex_ (),
+ const_regex_specified_ (false),
+ enumerator_regex_ (),
+ enumerator_regex_specified_ (false),
+ element_type_regex_ (),
+ element_type_regex_specified_ (false),
+ name_regex_trace_ (),
+ root_element_first_ (),
+ root_element_last_ (),
+ root_element_all_ (),
+ root_element_none_ (),
+ root_element_ (),
+ root_element_specified_ (false),
+ custom_type_ (),
+ custom_type_specified_ (false),
+ custom_type_regex_ (),
+ custom_type_regex_specified_ (false),
+ parts_ (1),
+ parts_specified_ (false),
+ parts_suffix_ ("-"),
+ parts_suffix_specified_ (false)
+ {
+ ::cli::argv_scanner s (argc, argv, erase);
+ _parse (s, opt, arg);
+ }
+
+ options::
+ options (int start,
+ int& argc,
+ char** argv,
+ bool erase,
+ ::cli::unknown_mode opt,
+ ::cli::unknown_mode arg)
+ : generate_polymorphic_ (),
+ polymorphic_type_ (),
+ polymorphic_type_specified_ (false),
+ polymorphic_type_all_ (),
+ polymorphic_plate_ (0),
+ polymorphic_plate_specified_ (false),
+ ordered_type_ (),
+ ordered_type_specified_ (false),
+ ordered_type_derived_ (),
+ ordered_type_mixed_ (),
+ ordered_type_all_ (),
+ order_container_ (),
+ order_container_specified_ (false),
+ generate_serialization_ (),
+ generate_ostream_ (),
+ generate_doxygen_ (),
+ generate_comparison_ (),
+ generate_default_ctor_ (),
+ generate_from_base_ctor_ (),
+ suppress_assignment_ (),
+ generate_detach_ (),
+ generate_wildcard_ (),
+ generate_any_type_ (),
+ generate_insertion_ (),
+ generate_insertion_specified_ (false),
+ generate_extraction_ (),
+ generate_extraction_specified_ (false),
+ generate_forward_ (),
+ suppress_parsing_ (),
+ generate_element_type_ (),
+ generate_element_map_ (),
+ generate_intellisense_ (),
+ omit_default_attributes_ (),
+ type_naming_ ("knr"),
+ type_naming_specified_ (false),
+ function_naming_ ("knr"),
+ function_naming_specified_ (false),
+ type_regex_ (),
+ type_regex_specified_ (false),
+ accessor_regex_ (),
+ accessor_regex_specified_ (false),
+ one_accessor_regex_ (),
+ one_accessor_regex_specified_ (false),
+ opt_accessor_regex_ (),
+ opt_accessor_regex_specified_ (false),
+ seq_accessor_regex_ (),
+ seq_accessor_regex_specified_ (false),
+ modifier_regex_ (),
+ modifier_regex_specified_ (false),
+ one_modifier_regex_ (),
+ one_modifier_regex_specified_ (false),
+ opt_modifier_regex_ (),
+ opt_modifier_regex_specified_ (false),
+ seq_modifier_regex_ (),
+ seq_modifier_regex_specified_ (false),
+ parser_regex_ (),
+ parser_regex_specified_ (false),
+ serializer_regex_ (),
+ serializer_regex_specified_ (false),
+ const_regex_ (),
+ const_regex_specified_ (false),
+ enumerator_regex_ (),
+ enumerator_regex_specified_ (false),
+ element_type_regex_ (),
+ element_type_regex_specified_ (false),
+ name_regex_trace_ (),
+ root_element_first_ (),
+ root_element_last_ (),
+ root_element_all_ (),
+ root_element_none_ (),
+ root_element_ (),
+ root_element_specified_ (false),
+ custom_type_ (),
+ custom_type_specified_ (false),
+ custom_type_regex_ (),
+ custom_type_regex_specified_ (false),
+ parts_ (1),
+ parts_specified_ (false),
+ parts_suffix_ ("-"),
+ parts_suffix_specified_ (false)
+ {
+ ::cli::argv_scanner s (start, argc, argv, erase);
+ _parse (s, opt, arg);
+ }
+
+ options::
+ options (int& argc,
+ char** argv,
+ int& end,
+ bool erase,
+ ::cli::unknown_mode opt,
+ ::cli::unknown_mode arg)
+ : generate_polymorphic_ (),
+ polymorphic_type_ (),
+ polymorphic_type_specified_ (false),
+ polymorphic_type_all_ (),
+ polymorphic_plate_ (0),
+ polymorphic_plate_specified_ (false),
+ ordered_type_ (),
+ ordered_type_specified_ (false),
+ ordered_type_derived_ (),
+ ordered_type_mixed_ (),
+ ordered_type_all_ (),
+ order_container_ (),
+ order_container_specified_ (false),
+ generate_serialization_ (),
+ generate_ostream_ (),
+ generate_doxygen_ (),
+ generate_comparison_ (),
+ generate_default_ctor_ (),
+ generate_from_base_ctor_ (),
+ suppress_assignment_ (),
+ generate_detach_ (),
+ generate_wildcard_ (),
+ generate_any_type_ (),
+ generate_insertion_ (),
+ generate_insertion_specified_ (false),
+ generate_extraction_ (),
+ generate_extraction_specified_ (false),
+ generate_forward_ (),
+ suppress_parsing_ (),
+ generate_element_type_ (),
+ generate_element_map_ (),
+ generate_intellisense_ (),
+ omit_default_attributes_ (),
+ type_naming_ ("knr"),
+ type_naming_specified_ (false),
+ function_naming_ ("knr"),
+ function_naming_specified_ (false),
+ type_regex_ (),
+ type_regex_specified_ (false),
+ accessor_regex_ (),
+ accessor_regex_specified_ (false),
+ one_accessor_regex_ (),
+ one_accessor_regex_specified_ (false),
+ opt_accessor_regex_ (),
+ opt_accessor_regex_specified_ (false),
+ seq_accessor_regex_ (),
+ seq_accessor_regex_specified_ (false),
+ modifier_regex_ (),
+ modifier_regex_specified_ (false),
+ one_modifier_regex_ (),
+ one_modifier_regex_specified_ (false),
+ opt_modifier_regex_ (),
+ opt_modifier_regex_specified_ (false),
+ seq_modifier_regex_ (),
+ seq_modifier_regex_specified_ (false),
+ parser_regex_ (),
+ parser_regex_specified_ (false),
+ serializer_regex_ (),
+ serializer_regex_specified_ (false),
+ const_regex_ (),
+ const_regex_specified_ (false),
+ enumerator_regex_ (),
+ enumerator_regex_specified_ (false),
+ element_type_regex_ (),
+ element_type_regex_specified_ (false),
+ name_regex_trace_ (),
+ root_element_first_ (),
+ root_element_last_ (),
+ root_element_all_ (),
+ root_element_none_ (),
+ root_element_ (),
+ root_element_specified_ (false),
+ custom_type_ (),
+ custom_type_specified_ (false),
+ custom_type_regex_ (),
+ custom_type_regex_specified_ (false),
+ parts_ (1),
+ parts_specified_ (false),
+ parts_suffix_ ("-"),
+ parts_suffix_specified_ (false)
+ {
+ ::cli::argv_scanner s (argc, argv, erase);
+ _parse (s, opt, arg);
+ end = s.end ();
+ }
+
+ options::
+ options (int start,
+ int& argc,
+ char** argv,
+ int& end,
+ bool erase,
+ ::cli::unknown_mode opt,
+ ::cli::unknown_mode arg)
+ : generate_polymorphic_ (),
+ polymorphic_type_ (),
+ polymorphic_type_specified_ (false),
+ polymorphic_type_all_ (),
+ polymorphic_plate_ (0),
+ polymorphic_plate_specified_ (false),
+ ordered_type_ (),
+ ordered_type_specified_ (false),
+ ordered_type_derived_ (),
+ ordered_type_mixed_ (),
+ ordered_type_all_ (),
+ order_container_ (),
+ order_container_specified_ (false),
+ generate_serialization_ (),
+ generate_ostream_ (),
+ generate_doxygen_ (),
+ generate_comparison_ (),
+ generate_default_ctor_ (),
+ generate_from_base_ctor_ (),
+ suppress_assignment_ (),
+ generate_detach_ (),
+ generate_wildcard_ (),
+ generate_any_type_ (),
+ generate_insertion_ (),
+ generate_insertion_specified_ (false),
+ generate_extraction_ (),
+ generate_extraction_specified_ (false),
+ generate_forward_ (),
+ suppress_parsing_ (),
+ generate_element_type_ (),
+ generate_element_map_ (),
+ generate_intellisense_ (),
+ omit_default_attributes_ (),
+ type_naming_ ("knr"),
+ type_naming_specified_ (false),
+ function_naming_ ("knr"),
+ function_naming_specified_ (false),
+ type_regex_ (),
+ type_regex_specified_ (false),
+ accessor_regex_ (),
+ accessor_regex_specified_ (false),
+ one_accessor_regex_ (),
+ one_accessor_regex_specified_ (false),
+ opt_accessor_regex_ (),
+ opt_accessor_regex_specified_ (false),
+ seq_accessor_regex_ (),
+ seq_accessor_regex_specified_ (false),
+ modifier_regex_ (),
+ modifier_regex_specified_ (false),
+ one_modifier_regex_ (),
+ one_modifier_regex_specified_ (false),
+ opt_modifier_regex_ (),
+ opt_modifier_regex_specified_ (false),
+ seq_modifier_regex_ (),
+ seq_modifier_regex_specified_ (false),
+ parser_regex_ (),
+ parser_regex_specified_ (false),
+ serializer_regex_ (),
+ serializer_regex_specified_ (false),
+ const_regex_ (),
+ const_regex_specified_ (false),
+ enumerator_regex_ (),
+ enumerator_regex_specified_ (false),
+ element_type_regex_ (),
+ element_type_regex_specified_ (false),
+ name_regex_trace_ (),
+ root_element_first_ (),
+ root_element_last_ (),
+ root_element_all_ (),
+ root_element_none_ (),
+ root_element_ (),
+ root_element_specified_ (false),
+ custom_type_ (),
+ custom_type_specified_ (false),
+ custom_type_regex_ (),
+ custom_type_regex_specified_ (false),
+ parts_ (1),
+ parts_specified_ (false),
+ parts_suffix_ ("-"),
+ parts_suffix_specified_ (false)
+ {
+ ::cli::argv_scanner s (start, argc, argv, erase);
+ _parse (s, opt, arg);
+ end = s.end ();
+ }
+
+ options::
+ options (::cli::scanner& s,
+ ::cli::unknown_mode opt,
+ ::cli::unknown_mode arg)
+ : generate_polymorphic_ (),
+ polymorphic_type_ (),
+ polymorphic_type_specified_ (false),
+ polymorphic_type_all_ (),
+ polymorphic_plate_ (0),
+ polymorphic_plate_specified_ (false),
+ ordered_type_ (),
+ ordered_type_specified_ (false),
+ ordered_type_derived_ (),
+ ordered_type_mixed_ (),
+ ordered_type_all_ (),
+ order_container_ (),
+ order_container_specified_ (false),
+ generate_serialization_ (),
+ generate_ostream_ (),
+ generate_doxygen_ (),
+ generate_comparison_ (),
+ generate_default_ctor_ (),
+ generate_from_base_ctor_ (),
+ suppress_assignment_ (),
+ generate_detach_ (),
+ generate_wildcard_ (),
+ generate_any_type_ (),
+ generate_insertion_ (),
+ generate_insertion_specified_ (false),
+ generate_extraction_ (),
+ generate_extraction_specified_ (false),
+ generate_forward_ (),
+ suppress_parsing_ (),
+ generate_element_type_ (),
+ generate_element_map_ (),
+ generate_intellisense_ (),
+ omit_default_attributes_ (),
+ type_naming_ ("knr"),
+ type_naming_specified_ (false),
+ function_naming_ ("knr"),
+ function_naming_specified_ (false),
+ type_regex_ (),
+ type_regex_specified_ (false),
+ accessor_regex_ (),
+ accessor_regex_specified_ (false),
+ one_accessor_regex_ (),
+ one_accessor_regex_specified_ (false),
+ opt_accessor_regex_ (),
+ opt_accessor_regex_specified_ (false),
+ seq_accessor_regex_ (),
+ seq_accessor_regex_specified_ (false),
+ modifier_regex_ (),
+ modifier_regex_specified_ (false),
+ one_modifier_regex_ (),
+ one_modifier_regex_specified_ (false),
+ opt_modifier_regex_ (),
+ opt_modifier_regex_specified_ (false),
+ seq_modifier_regex_ (),
+ seq_modifier_regex_specified_ (false),
+ parser_regex_ (),
+ parser_regex_specified_ (false),
+ serializer_regex_ (),
+ serializer_regex_specified_ (false),
+ const_regex_ (),
+ const_regex_specified_ (false),
+ enumerator_regex_ (),
+ enumerator_regex_specified_ (false),
+ element_type_regex_ (),
+ element_type_regex_specified_ (false),
+ name_regex_trace_ (),
+ root_element_first_ (),
+ root_element_last_ (),
+ root_element_all_ (),
+ root_element_none_ (),
+ root_element_ (),
+ root_element_specified_ (false),
+ custom_type_ (),
+ custom_type_specified_ (false),
+ custom_type_regex_ (),
+ custom_type_regex_specified_ (false),
+ parts_ (1),
+ parts_specified_ (false),
+ parts_suffix_ ("-"),
+ parts_suffix_specified_ (false)
+ {
+ _parse (s, opt, arg);
+ }
+
+ ::cli::usage_para options::
+ print_usage (::std::wostream& os, ::cli::usage_para p)
+ {
+ CLI_POTENTIALLY_UNUSED (os);
+
+ if (p == ::cli::usage_para::text)
+ os << ::std::endl;
+
+ os << "--generate-polymorphic Generate polymorphism-aware code." << ::std::endl;
+
+ os << "--polymorphic-type <type> Indicate that <type> is a root of a polymorphic" << ::std::endl
+ << " type hierarchy." << ::std::endl;
+
+ os << "--polymorphic-type-all Indicate that all types should be treated as" << ::std::endl
+ << " polymorphic." << ::std::endl;
+
+ os << "--polymorphic-plate <num> Specify the polymorphic map plate the generated" << ::std::endl
+ << " code should register on." << ::std::endl;
+
+ os << "--ordered-type <type> Indicate that element order in <type> is" << ::std::endl
+ << " significant." << ::std::endl;
+
+ os << "--ordered-type-derived Automatically treat types derived from ordered" << ::std::endl
+ << " bases as also ordered." << ::std::endl;
+
+ os << "--ordered-type-mixed Automatically treat complex types with mixed" << ::std::endl
+ << " content as ordered." << ::std::endl;
+
+ os << "--ordered-type-all Indicate that element order in all types is" << ::std::endl
+ << " significant." << ::std::endl;
+
+ os << "--order-container <type> Specify a custom class template that should be" << ::std::endl
+ << " used as a container for the content order in" << ::std::endl
+ << " ordered types instead of the default std::vector." << ::std::endl;
+
+ os << "--generate-serialization Generate serialization functions." << ::std::endl;
+
+ os << "--generate-ostream Generate ostream insertion operators (operator<<)" << ::std::endl
+ << " for generated types." << ::std::endl;
+
+ os << "--generate-doxygen Generate documentation comments suitable for" << ::std::endl
+ << " extraction by the Doxygen documentation system." << ::std::endl;
+
+ os << "--generate-comparison Generate comparison operators (operator== and" << ::std::endl
+ << " operator!=) for complex types." << ::std::endl;
+
+ os << "--generate-default-ctor Generate default constructors even for types that" << ::std::endl
+ << " have required members." << ::std::endl;
+
+ os << "--generate-from-base-ctor Generate constructors that expect an instance of a" << ::std::endl
+ << " base type followed by all required members." << ::std::endl;
+
+ os << "--suppress-assignment Suppress the generation of copy assignment" << ::std::endl
+ << " operators for complex types." << ::std::endl;
+
+ os << "--generate-detach Generate detach functions for required elements" << ::std::endl
+ << " and attributes." << ::std::endl;
+
+ os << "--generate-wildcard Generate accessors and modifiers as well as" << ::std::endl
+ << " parsing and serialization code for XML Schema" << ::std::endl
+ << " wildcards (any and anyAttribute)." << ::std::endl;
+
+ os << "--generate-any-type Extract and store content of the XML Schema" << ::std::endl
+ << " anyType type as a DOM fragment." << ::std::endl;
+
+ os << "--generate-insertion <os> Generate data representation stream insertion" << ::std::endl
+ << " operators for the <os> output stream type." << ::std::endl;
+
+ os << "--generate-extraction <is> Generate data representation stream extraction" << ::std::endl
+ << " constructors for the <is> input stream type." << ::std::endl;
+
+ os << "--generate-forward Generate a separate header file with forward" << ::std::endl
+ << " declarations for the types being generated." << ::std::endl;
+
+ os << "--suppress-parsing Suppress the generation of the parsing functions" << ::std::endl
+ << " and constructors." << ::std::endl;
+
+ os << "--generate-element-type Generate types instead of parsing and" << ::std::endl
+ << " serialization functions for root elements." << ::std::endl;
+
+ os << "--generate-element-map Generate a root element map that allows uniform" << ::std::endl
+ << " parsing and serialization of multiple root" << ::std::endl
+ << " elements." << ::std::endl;
+
+ os << "--generate-intellisense Generate workarounds for IntelliSense bugs in" << ::std::endl
+ << " Visual Studio 2005 (8.0)." << ::std::endl;
+
+ os << "--omit-default-attributes Omit attributes with default and fixed values from" << ::std::endl
+ << " serialized XML documents." << ::std::endl;
+
+ os << "--type-naming <style> Specify the type naming convention that should be" << ::std::endl
+ << " used in the generated code." << ::std::endl;
+
+ os << "--function-naming <style> Specify the function naming convention that should" << ::std::endl
+ << " be used in the generated code." << ::std::endl;
+
+ os << "--type-regex <regex> Add <regex> to the list of regular expressions" << ::std::endl
+ << " used to translate XML Schema type names to C++" << ::std::endl
+ << " type names." << ::std::endl;
+
+ os << "--accessor-regex <regex> Add <regex> to the list of regular expressions" << ::std::endl
+ << " used to translate XML Schema names of" << ::std::endl
+ << " elements/attributes to C++ accessor function" << ::std::endl
+ << " names." << ::std::endl;
+
+ os << "--one-accessor-regex <regex> Add <regex> to the list of regular expressions" << ::std::endl
+ << " used to translate XML Schema names of" << ::std::endl
+ << " elements/attributes with cardinality one to C++" << ::std::endl
+ << " accessor function names." << ::std::endl;
+
+ os << "--opt-accessor-regex <regex> Add <regex> to the list of regular expressions" << ::std::endl
+ << " used to translate XML Schema names of" << ::std::endl
+ << " elements/attributes with cardinality optional to" << ::std::endl
+ << " C++ accessor function names." << ::std::endl;
+
+ os << "--seq-accessor-regex <regex> Add <regex> to the list of regular expressions" << ::std::endl
+ << " used to translate XML Schema names of" << ::std::endl
+ << " elements/attributes with cardinality sequence to" << ::std::endl
+ << " C++ accessor function names." << ::std::endl;
+
+ os << "--modifier-regex <regex> Add <regex> to the list of regular expressions" << ::std::endl
+ << " used to translate XML Schema names of" << ::std::endl
+ << " elements/attributes to C++ modifier function" << ::std::endl
+ << " names." << ::std::endl;
+
+ os << "--one-modifier-regex <regex> Add <regex> to the list of regular expressions" << ::std::endl
+ << " used to translate XML Schema names of" << ::std::endl
+ << " elements/attributes with cardinality one to C++" << ::std::endl
+ << " modifier function names." << ::std::endl;
+
+ os << "--opt-modifier-regex <regex> Add <regex> to the list of regular expressions" << ::std::endl
+ << " used to translate XML Schema names of" << ::std::endl
+ << " elements/attributes with cardinality optional to" << ::std::endl
+ << " C++ modifier function names." << ::std::endl;
+
+ os << "--seq-modifier-regex <regex> Add <regex> to the list of regular expressions" << ::std::endl
+ << " used to translate XML Schema names of" << ::std::endl
+ << " elements/attributes with cardinality sequence to" << ::std::endl
+ << " C++ modifier function names." << ::std::endl;
+
+ os << "--parser-regex <regex> Add <regex> to the list of regular expressions" << ::std::endl
+ << " used to translate XML Schema element names to C++" << ::std::endl
+ << " parsing function names." << ::std::endl;
+
+ os << "--serializer-regex <regex> Add <regex> to the list of regular expressions" << ::std::endl
+ << " used to translate XML Schema element names to C++" << ::std::endl
+ << " serialization function names." << ::std::endl;
+
+ os << "--const-regex <regex> Add <regex> to the list of regular expressions" << ::std::endl
+ << " used to translate XML Schema-derived names to C++" << ::std::endl
+ << " constant names." << ::std::endl;
+
+ os << "--enumerator-regex <regex> Add <regex> to the list of regular expressions" << ::std::endl
+ << " used to translate XML Schema enumeration values to" << ::std::endl
+ << " C++ enumerator names." << ::std::endl;
+
+ os << "--element-type-regex <regex> Add <regex> to the list of regular expressions" << ::std::endl
+ << " used to translate XML Schema element names to C++" << ::std::endl
+ << " element type names." << ::std::endl;
+
+ os << "--name-regex-trace Trace the process of applying regular expressions" << ::std::endl
+ << " specified with the name transformation options." << ::std::endl;
+
+ os << "--root-element-first Treat only the first global element as a document" << ::std::endl
+ << " root." << ::std::endl;
+
+ os << "--root-element-last Treat only the last global element as a document" << ::std::endl
+ << " root." << ::std::endl;
+
+ os << "--root-element-all Treat all global elements as document roots." << ::std::endl;
+
+ os << "--root-element-none Do not treat any global elements as document" << ::std::endl
+ << " roots." << ::std::endl;
+
+ os << "--root-element <element> Treat only <element> as a document root." << ::std::endl;
+
+ os << "--custom-type <map> Use a custom C++ type instead of the generated" << ::std::endl
+ << " class." << ::std::endl;
+
+ os << "--custom-type-regex <regex> Use custom C++ types instead of the generated" << ::std::endl
+ << " classes." << ::std::endl;
+
+ os << "--parts <num> Split generated source code into <num> parts." << ::std::endl;
+
+ os << "--parts-suffix <suffix> Use <suffix> instead of the default '-' to" << ::std::endl
+ << " separate the file name from the part number." << ::std::endl;
+
+ p = ::cli::usage_para::option;
+
+ return p;
+ }
+
+ typedef
+ std::map<std::string, void (*) (options&, ::cli::scanner&)>
+ _cli_options_map;
+
+ static _cli_options_map _cli_options_map_;
+
+ struct _cli_options_map_init
+ {
+ _cli_options_map_init ()
+ {
+ _cli_options_map_["--generate-polymorphic"] =
+ &::cli::thunk< options, &options::generate_polymorphic_ >;
+ _cli_options_map_["--polymorphic-type"] =
+ &::cli::thunk< options, NarrowStrings, &options::polymorphic_type_,
+ &options::polymorphic_type_specified_ >;
+ _cli_options_map_["--polymorphic-type-all"] =
+ &::cli::thunk< options, &options::polymorphic_type_all_ >;
+ _cli_options_map_["--polymorphic-plate"] =
+ &::cli::thunk< options, unsigned long, &options::polymorphic_plate_,
+ &options::polymorphic_plate_specified_ >;
+ _cli_options_map_["--ordered-type"] =
+ &::cli::thunk< options, NarrowStrings, &options::ordered_type_,
+ &options::ordered_type_specified_ >;
+ _cli_options_map_["--ordered-type-derived"] =
+ &::cli::thunk< options, &options::ordered_type_derived_ >;
+ _cli_options_map_["--ordered-type-mixed"] =
+ &::cli::thunk< options, &options::ordered_type_mixed_ >;
+ _cli_options_map_["--ordered-type-all"] =
+ &::cli::thunk< options, &options::ordered_type_all_ >;
+ _cli_options_map_["--order-container"] =
+ &::cli::thunk< options, NarrowString, &options::order_container_,
+ &options::order_container_specified_ >;
+ _cli_options_map_["--generate-serialization"] =
+ &::cli::thunk< options, &options::generate_serialization_ >;
+ _cli_options_map_["--generate-ostream"] =
+ &::cli::thunk< options, &options::generate_ostream_ >;
+ _cli_options_map_["--generate-doxygen"] =
+ &::cli::thunk< options, &options::generate_doxygen_ >;
+ _cli_options_map_["--generate-comparison"] =
+ &::cli::thunk< options, &options::generate_comparison_ >;
+ _cli_options_map_["--generate-default-ctor"] =
+ &::cli::thunk< options, &options::generate_default_ctor_ >;
+ _cli_options_map_["--generate-from-base-ctor"] =
+ &::cli::thunk< options, &options::generate_from_base_ctor_ >;
+ _cli_options_map_["--suppress-assignment"] =
+ &::cli::thunk< options, &options::suppress_assignment_ >;
+ _cli_options_map_["--generate-detach"] =
+ &::cli::thunk< options, &options::generate_detach_ >;
+ _cli_options_map_["--generate-wildcard"] =
+ &::cli::thunk< options, &options::generate_wildcard_ >;
+ _cli_options_map_["--generate-any-type"] =
+ &::cli::thunk< options, &options::generate_any_type_ >;
+ _cli_options_map_["--generate-insertion"] =
+ &::cli::thunk< options, NarrowStrings, &options::generate_insertion_,
+ &options::generate_insertion_specified_ >;
+ _cli_options_map_["--generate-extraction"] =
+ &::cli::thunk< options, NarrowStrings, &options::generate_extraction_,
+ &options::generate_extraction_specified_ >;
+ _cli_options_map_["--generate-forward"] =
+ &::cli::thunk< options, &options::generate_forward_ >;
+ _cli_options_map_["--suppress-parsing"] =
+ &::cli::thunk< options, &options::suppress_parsing_ >;
+ _cli_options_map_["--generate-element-type"] =
+ &::cli::thunk< options, &options::generate_element_type_ >;
+ _cli_options_map_["--generate-element-map"] =
+ &::cli::thunk< options, &options::generate_element_map_ >;
+ _cli_options_map_["--generate-intellisense"] =
+ &::cli::thunk< options, &options::generate_intellisense_ >;
+ _cli_options_map_["--omit-default-attributes"] =
+ &::cli::thunk< options, &options::omit_default_attributes_ >;
+ _cli_options_map_["--type-naming"] =
+ &::cli::thunk< options, NarrowString, &options::type_naming_,
+ &options::type_naming_specified_ >;
+ _cli_options_map_["--function-naming"] =
+ &::cli::thunk< options, NarrowString, &options::function_naming_,
+ &options::function_naming_specified_ >;
+ _cli_options_map_["--type-regex"] =
+ &::cli::thunk< options, NarrowStrings, &options::type_regex_,
+ &options::type_regex_specified_ >;
+ _cli_options_map_["--accessor-regex"] =
+ &::cli::thunk< options, NarrowStrings, &options::accessor_regex_,
+ &options::accessor_regex_specified_ >;
+ _cli_options_map_["--one-accessor-regex"] =
+ &::cli::thunk< options, NarrowStrings, &options::one_accessor_regex_,
+ &options::one_accessor_regex_specified_ >;
+ _cli_options_map_["--opt-accessor-regex"] =
+ &::cli::thunk< options, NarrowStrings, &options::opt_accessor_regex_,
+ &options::opt_accessor_regex_specified_ >;
+ _cli_options_map_["--seq-accessor-regex"] =
+ &::cli::thunk< options, NarrowStrings, &options::seq_accessor_regex_,
+ &options::seq_accessor_regex_specified_ >;
+ _cli_options_map_["--modifier-regex"] =
+ &::cli::thunk< options, NarrowStrings, &options::modifier_regex_,
+ &options::modifier_regex_specified_ >;
+ _cli_options_map_["--one-modifier-regex"] =
+ &::cli::thunk< options, NarrowStrings, &options::one_modifier_regex_,
+ &options::one_modifier_regex_specified_ >;
+ _cli_options_map_["--opt-modifier-regex"] =
+ &::cli::thunk< options, NarrowStrings, &options::opt_modifier_regex_,
+ &options::opt_modifier_regex_specified_ >;
+ _cli_options_map_["--seq-modifier-regex"] =
+ &::cli::thunk< options, NarrowStrings, &options::seq_modifier_regex_,
+ &options::seq_modifier_regex_specified_ >;
+ _cli_options_map_["--parser-regex"] =
+ &::cli::thunk< options, NarrowStrings, &options::parser_regex_,
+ &options::parser_regex_specified_ >;
+ _cli_options_map_["--serializer-regex"] =
+ &::cli::thunk< options, NarrowStrings, &options::serializer_regex_,
+ &options::serializer_regex_specified_ >;
+ _cli_options_map_["--const-regex"] =
+ &::cli::thunk< options, NarrowStrings, &options::const_regex_,
+ &options::const_regex_specified_ >;
+ _cli_options_map_["--enumerator-regex"] =
+ &::cli::thunk< options, NarrowStrings, &options::enumerator_regex_,
+ &options::enumerator_regex_specified_ >;
+ _cli_options_map_["--element-type-regex"] =
+ &::cli::thunk< options, NarrowStrings, &options::element_type_regex_,
+ &options::element_type_regex_specified_ >;
+ _cli_options_map_["--name-regex-trace"] =
+ &::cli::thunk< options, &options::name_regex_trace_ >;
+ _cli_options_map_["--root-element-first"] =
+ &::cli::thunk< options, &options::root_element_first_ >;
+ _cli_options_map_["--root-element-last"] =
+ &::cli::thunk< options, &options::root_element_last_ >;
+ _cli_options_map_["--root-element-all"] =
+ &::cli::thunk< options, &options::root_element_all_ >;
+ _cli_options_map_["--root-element-none"] =
+ &::cli::thunk< options, &options::root_element_none_ >;
+ _cli_options_map_["--root-element"] =
+ &::cli::thunk< options, NarrowStrings, &options::root_element_,
+ &options::root_element_specified_ >;
+ _cli_options_map_["--custom-type"] =
+ &::cli::thunk< options, NarrowStrings, &options::custom_type_,
+ &options::custom_type_specified_ >;
+ _cli_options_map_["--custom-type-regex"] =
+ &::cli::thunk< options, NarrowStrings, &options::custom_type_regex_,
+ &options::custom_type_regex_specified_ >;
+ _cli_options_map_["--parts"] =
+ &::cli::thunk< options, std::size_t, &options::parts_,
+ &options::parts_specified_ >;
+ _cli_options_map_["--parts-suffix"] =
+ &::cli::thunk< options, NarrowString, &options::parts_suffix_,
+ &options::parts_suffix_specified_ >;
+ }
+ };
+
+ static _cli_options_map_init _cli_options_map_init_;
+
+ bool options::
+ _parse (const char* o, ::cli::scanner& s)
+ {
+ _cli_options_map::const_iterator i (_cli_options_map_.find (o));
+
+ if (i != _cli_options_map_.end ())
+ {
+ (*(i->second)) (*this, s);
+ return true;
+ }
+
+ // options base
+ //
+ if (::CXX::options::_parse (o, s))
+ return true;
+
+ return false;
+ }
+
+ bool options::
+ _parse (::cli::scanner& s,
+ ::cli::unknown_mode opt_mode,
+ ::cli::unknown_mode arg_mode)
+ {
+ // Can't skip combined flags (--no-combined-flags).
+ //
+ assert (opt_mode != ::cli::unknown_mode::skip);
+
+ bool r = false;
+ bool opt = true;
+
+ while (s.more ())
+ {
+ const char* o = s.peek ();
+
+ if (std::strcmp (o, "--") == 0)
+ {
+ opt = false;
+ s.skip ();
+ r = true;
+ continue;
+ }
+
+ if (opt)
+ {
+ if (_parse (o, s))
+ {
+ r = true;
+ continue;
+ }
+
+ if (std::strncmp (o, "-", 1) == 0 && o[1] != '\0')
+ {
+ // Handle combined option values.
+ //
+ std::string co;
+ if (const char* v = std::strchr (o, '='))
+ {
+ co.assign (o, 0, v - o);
+ ++v;
+
+ int ac (2);
+ char* av[] =
+ {
+ const_cast<char*> (co.c_str ()),
+ const_cast<char*> (v)
+ };
+
+ ::cli::argv_scanner ns (0, ac, av);
+
+ if (_parse (co.c_str (), ns))
+ {
+ // Parsed the option but not its value?
+ //
+ if (ns.end () != 2)
+ throw ::cli::invalid_value (co, v);
+
+ s.next ();
+ r = true;
+ continue;
+ }
+ else
+ {
+ // Set the unknown option and fall through.
+ //
+ o = co.c_str ();
+ }
+ }
+
+ // Handle combined flags.
+ //
+ char cf[3];
+ {
+ const char* p = o + 1;
+ for (; *p != '\0'; ++p)
+ {
+ if (!((*p >= 'a' && *p <= 'z') ||
+ (*p >= 'A' && *p <= 'Z') ||
+ (*p >= '0' && *p <= '9')))
+ break;
+ }
+
+ if (*p == '\0')
+ {
+ for (p = o + 1; *p != '\0'; ++p)
+ {
+ std::strcpy (cf, "-");
+ cf[1] = *p;
+ cf[2] = '\0';
+
+ int ac (1);
+ char* av[] =
+ {
+ cf
+ };
+
+ ::cli::argv_scanner ns (0, ac, av);
+
+ if (!_parse (cf, ns))
+ break;
+ }
+
+ if (*p == '\0')
+ {
+ // All handled.
+ //
+ s.next ();
+ r = true;
+ continue;
+ }
+ else
+ {
+ // Set the unknown option and fall through.
+ //
+ o = cf;
+ }
+ }
+ }
+
+ switch (opt_mode)
+ {
+ case ::cli::unknown_mode::skip:
+ {
+ s.skip ();
+ r = true;
+ continue;
+ }
+ case ::cli::unknown_mode::stop:
+ {
+ break;
+ }
+ case ::cli::unknown_mode::fail:
+ {
+ throw ::cli::unknown_option (o);
+ }
+ }
+
+ break;
+ }
+ }
+
+ switch (arg_mode)
+ {
+ case ::cli::unknown_mode::skip:
+ {
+ s.skip ();
+ r = true;
+ continue;
+ }
+ case ::cli::unknown_mode::stop:
+ {
+ break;
+ }
+ case ::cli::unknown_mode::fail:
+ {
+ throw ::cli::unknown_argument (o);
+ }
+ }
+
+ break;
+ }
+
+ return r;
+ }
+ }
+}
+
+// Begin epilogue.
+//
+//
+// End epilogue.
+
diff --git a/xsd/xsd/pregenerated/xsd/cxx/tree/options.hxx b/xsd/xsd/pregenerated/xsd/cxx/tree/options.hxx
new file mode 100644
index 0000000..f5a808c
--- /dev/null
+++ b/xsd/xsd/pregenerated/xsd/cxx/tree/options.hxx
@@ -0,0 +1,414 @@
+// -*- C++ -*-
+//
+// This file was generated by CLI, a command line interface
+// compiler for C++.
+//
+
+#ifndef XSD_CXX_TREE_OPTIONS_HXX
+#define XSD_CXX_TREE_OPTIONS_HXX
+
+// Begin prologue.
+//
+//
+// End prologue.
+
+#include <cstddef>
+
+#include <xsd/types.hxx>
+
+#include <xsd/cxx/options.hxx>
+
+namespace CXX
+{
+ namespace Tree
+ {
+ class options: public ::CXX::options
+ {
+ public:
+ options ();
+
+ options (int& argc,
+ char** argv,
+ bool erase = false,
+ ::cli::unknown_mode option = ::cli::unknown_mode::fail,
+ ::cli::unknown_mode argument = ::cli::unknown_mode::stop);
+
+ options (int start,
+ int& argc,
+ char** argv,
+ bool erase = false,
+ ::cli::unknown_mode option = ::cli::unknown_mode::fail,
+ ::cli::unknown_mode argument = ::cli::unknown_mode::stop);
+
+ options (int& argc,
+ char** argv,
+ int& end,
+ bool erase = false,
+ ::cli::unknown_mode option = ::cli::unknown_mode::fail,
+ ::cli::unknown_mode argument = ::cli::unknown_mode::stop);
+
+ options (int start,
+ int& argc,
+ char** argv,
+ int& end,
+ bool erase = false,
+ ::cli::unknown_mode option = ::cli::unknown_mode::fail,
+ ::cli::unknown_mode argument = ::cli::unknown_mode::stop);
+
+ options (::cli::scanner&,
+ ::cli::unknown_mode option = ::cli::unknown_mode::fail,
+ ::cli::unknown_mode argument = ::cli::unknown_mode::stop);
+
+ // Option accessors.
+ //
+ const bool&
+ generate_polymorphic () const;
+
+ const NarrowStrings&
+ polymorphic_type () const;
+
+ bool
+ polymorphic_type_specified () const;
+
+ const bool&
+ polymorphic_type_all () const;
+
+ const unsigned long&
+ polymorphic_plate () const;
+
+ bool
+ polymorphic_plate_specified () const;
+
+ const NarrowStrings&
+ ordered_type () const;
+
+ bool
+ ordered_type_specified () const;
+
+ const bool&
+ ordered_type_derived () const;
+
+ const bool&
+ ordered_type_mixed () const;
+
+ const bool&
+ ordered_type_all () const;
+
+ const NarrowString&
+ order_container () const;
+
+ bool
+ order_container_specified () const;
+
+ const bool&
+ generate_serialization () const;
+
+ const bool&
+ generate_ostream () const;
+
+ const bool&
+ generate_doxygen () const;
+
+ const bool&
+ generate_comparison () const;
+
+ const bool&
+ generate_default_ctor () const;
+
+ const bool&
+ generate_from_base_ctor () const;
+
+ const bool&
+ suppress_assignment () const;
+
+ const bool&
+ generate_detach () const;
+
+ const bool&
+ generate_wildcard () const;
+
+ const bool&
+ generate_any_type () const;
+
+ const NarrowStrings&
+ generate_insertion () const;
+
+ bool
+ generate_insertion_specified () const;
+
+ const NarrowStrings&
+ generate_extraction () const;
+
+ bool
+ generate_extraction_specified () const;
+
+ const bool&
+ generate_forward () const;
+
+ const bool&
+ suppress_parsing () const;
+
+ const bool&
+ generate_element_type () const;
+
+ const bool&
+ generate_element_map () const;
+
+ const bool&
+ generate_intellisense () const;
+
+ const bool&
+ omit_default_attributes () const;
+
+ const NarrowString&
+ type_naming () const;
+
+ bool
+ type_naming_specified () const;
+
+ const NarrowString&
+ function_naming () const;
+
+ bool
+ function_naming_specified () const;
+
+ const NarrowStrings&
+ type_regex () const;
+
+ bool
+ type_regex_specified () const;
+
+ const NarrowStrings&
+ accessor_regex () const;
+
+ bool
+ accessor_regex_specified () const;
+
+ const NarrowStrings&
+ one_accessor_regex () const;
+
+ bool
+ one_accessor_regex_specified () const;
+
+ const NarrowStrings&
+ opt_accessor_regex () const;
+
+ bool
+ opt_accessor_regex_specified () const;
+
+ const NarrowStrings&
+ seq_accessor_regex () const;
+
+ bool
+ seq_accessor_regex_specified () const;
+
+ const NarrowStrings&
+ modifier_regex () const;
+
+ bool
+ modifier_regex_specified () const;
+
+ const NarrowStrings&
+ one_modifier_regex () const;
+
+ bool
+ one_modifier_regex_specified () const;
+
+ const NarrowStrings&
+ opt_modifier_regex () const;
+
+ bool
+ opt_modifier_regex_specified () const;
+
+ const NarrowStrings&
+ seq_modifier_regex () const;
+
+ bool
+ seq_modifier_regex_specified () const;
+
+ const NarrowStrings&
+ parser_regex () const;
+
+ bool
+ parser_regex_specified () const;
+
+ const NarrowStrings&
+ serializer_regex () const;
+
+ bool
+ serializer_regex_specified () const;
+
+ const NarrowStrings&
+ const_regex () const;
+
+ bool
+ const_regex_specified () const;
+
+ const NarrowStrings&
+ enumerator_regex () const;
+
+ bool
+ enumerator_regex_specified () const;
+
+ const NarrowStrings&
+ element_type_regex () const;
+
+ bool
+ element_type_regex_specified () const;
+
+ const bool&
+ name_regex_trace () const;
+
+ const bool&
+ root_element_first () const;
+
+ const bool&
+ root_element_last () const;
+
+ const bool&
+ root_element_all () const;
+
+ const bool&
+ root_element_none () const;
+
+ const NarrowStrings&
+ root_element () const;
+
+ bool
+ root_element_specified () const;
+
+ const NarrowStrings&
+ custom_type () const;
+
+ bool
+ custom_type_specified () const;
+
+ const NarrowStrings&
+ custom_type_regex () const;
+
+ bool
+ custom_type_regex_specified () const;
+
+ const std::size_t&
+ parts () const;
+
+ bool
+ parts_specified () const;
+
+ const NarrowString&
+ parts_suffix () const;
+
+ bool
+ parts_suffix_specified () const;
+
+ // Print usage information.
+ //
+ static ::cli::usage_para
+ print_usage (::std::wostream&,
+ ::cli::usage_para = ::cli::usage_para::none);
+
+ // Implementation details.
+ //
+ protected:
+ bool
+ _parse (const char*, ::cli::scanner&);
+
+ private:
+ bool
+ _parse (::cli::scanner&,
+ ::cli::unknown_mode option,
+ ::cli::unknown_mode argument);
+
+ public:
+ bool generate_polymorphic_;
+ NarrowStrings polymorphic_type_;
+ bool polymorphic_type_specified_;
+ bool polymorphic_type_all_;
+ unsigned long polymorphic_plate_;
+ bool polymorphic_plate_specified_;
+ NarrowStrings ordered_type_;
+ bool ordered_type_specified_;
+ bool ordered_type_derived_;
+ bool ordered_type_mixed_;
+ bool ordered_type_all_;
+ NarrowString order_container_;
+ bool order_container_specified_;
+ bool generate_serialization_;
+ bool generate_ostream_;
+ bool generate_doxygen_;
+ bool generate_comparison_;
+ bool generate_default_ctor_;
+ bool generate_from_base_ctor_;
+ bool suppress_assignment_;
+ bool generate_detach_;
+ bool generate_wildcard_;
+ bool generate_any_type_;
+ NarrowStrings generate_insertion_;
+ bool generate_insertion_specified_;
+ NarrowStrings generate_extraction_;
+ bool generate_extraction_specified_;
+ bool generate_forward_;
+ bool suppress_parsing_;
+ bool generate_element_type_;
+ bool generate_element_map_;
+ bool generate_intellisense_;
+ bool omit_default_attributes_;
+ NarrowString type_naming_;
+ bool type_naming_specified_;
+ NarrowString function_naming_;
+ bool function_naming_specified_;
+ NarrowStrings type_regex_;
+ bool type_regex_specified_;
+ NarrowStrings accessor_regex_;
+ bool accessor_regex_specified_;
+ NarrowStrings one_accessor_regex_;
+ bool one_accessor_regex_specified_;
+ NarrowStrings opt_accessor_regex_;
+ bool opt_accessor_regex_specified_;
+ NarrowStrings seq_accessor_regex_;
+ bool seq_accessor_regex_specified_;
+ NarrowStrings modifier_regex_;
+ bool modifier_regex_specified_;
+ NarrowStrings one_modifier_regex_;
+ bool one_modifier_regex_specified_;
+ NarrowStrings opt_modifier_regex_;
+ bool opt_modifier_regex_specified_;
+ NarrowStrings seq_modifier_regex_;
+ bool seq_modifier_regex_specified_;
+ NarrowStrings parser_regex_;
+ bool parser_regex_specified_;
+ NarrowStrings serializer_regex_;
+ bool serializer_regex_specified_;
+ NarrowStrings const_regex_;
+ bool const_regex_specified_;
+ NarrowStrings enumerator_regex_;
+ bool enumerator_regex_specified_;
+ NarrowStrings element_type_regex_;
+ bool element_type_regex_specified_;
+ bool name_regex_trace_;
+ bool root_element_first_;
+ bool root_element_last_;
+ bool root_element_all_;
+ bool root_element_none_;
+ NarrowStrings root_element_;
+ bool root_element_specified_;
+ NarrowStrings custom_type_;
+ bool custom_type_specified_;
+ NarrowStrings custom_type_regex_;
+ bool custom_type_regex_specified_;
+ std::size_t parts_;
+ bool parts_specified_;
+ NarrowString parts_suffix_;
+ bool parts_suffix_specified_;
+ };
+ }
+}
+
+#include <xsd/cxx/tree/options.ixx>
+
+// Begin epilogue.
+//
+//
+// End epilogue.
+
+#endif // XSD_CXX_TREE_OPTIONS_HXX
diff --git a/xsd/xsd/pregenerated/xsd/cxx/tree/options.ixx b/xsd/xsd/pregenerated/xsd/cxx/tree/options.ixx
new file mode 100644
index 0000000..4d34fd9
--- /dev/null
+++ b/xsd/xsd/pregenerated/xsd/cxx/tree/options.ixx
@@ -0,0 +1,504 @@
+// -*- C++ -*-
+//
+// This file was generated by CLI, a command line interface
+// compiler for C++.
+//
+
+// Begin prologue.
+//
+//
+// End prologue.
+
+namespace CXX
+{
+ namespace Tree
+ {
+ // options
+ //
+
+ inline const bool& options::
+ generate_polymorphic () const
+ {
+ return this->generate_polymorphic_;
+ }
+
+ inline const NarrowStrings& options::
+ polymorphic_type () const
+ {
+ return this->polymorphic_type_;
+ }
+
+ inline bool options::
+ polymorphic_type_specified () const
+ {
+ return this->polymorphic_type_specified_;
+ }
+
+ inline const bool& options::
+ polymorphic_type_all () const
+ {
+ return this->polymorphic_type_all_;
+ }
+
+ inline const unsigned long& options::
+ polymorphic_plate () const
+ {
+ return this->polymorphic_plate_;
+ }
+
+ inline bool options::
+ polymorphic_plate_specified () const
+ {
+ return this->polymorphic_plate_specified_;
+ }
+
+ inline const NarrowStrings& options::
+ ordered_type () const
+ {
+ return this->ordered_type_;
+ }
+
+ inline bool options::
+ ordered_type_specified () const
+ {
+ return this->ordered_type_specified_;
+ }
+
+ inline const bool& options::
+ ordered_type_derived () const
+ {
+ return this->ordered_type_derived_;
+ }
+
+ inline const bool& options::
+ ordered_type_mixed () const
+ {
+ return this->ordered_type_mixed_;
+ }
+
+ inline const bool& options::
+ ordered_type_all () const
+ {
+ return this->ordered_type_all_;
+ }
+
+ inline const NarrowString& options::
+ order_container () const
+ {
+ return this->order_container_;
+ }
+
+ inline bool options::
+ order_container_specified () const
+ {
+ return this->order_container_specified_;
+ }
+
+ inline const bool& options::
+ generate_serialization () const
+ {
+ return this->generate_serialization_;
+ }
+
+ inline const bool& options::
+ generate_ostream () const
+ {
+ return this->generate_ostream_;
+ }
+
+ inline const bool& options::
+ generate_doxygen () const
+ {
+ return this->generate_doxygen_;
+ }
+
+ inline const bool& options::
+ generate_comparison () const
+ {
+ return this->generate_comparison_;
+ }
+
+ inline const bool& options::
+ generate_default_ctor () const
+ {
+ return this->generate_default_ctor_;
+ }
+
+ inline const bool& options::
+ generate_from_base_ctor () const
+ {
+ return this->generate_from_base_ctor_;
+ }
+
+ inline const bool& options::
+ suppress_assignment () const
+ {
+ return this->suppress_assignment_;
+ }
+
+ inline const bool& options::
+ generate_detach () const
+ {
+ return this->generate_detach_;
+ }
+
+ inline const bool& options::
+ generate_wildcard () const
+ {
+ return this->generate_wildcard_;
+ }
+
+ inline const bool& options::
+ generate_any_type () const
+ {
+ return this->generate_any_type_;
+ }
+
+ inline const NarrowStrings& options::
+ generate_insertion () const
+ {
+ return this->generate_insertion_;
+ }
+
+ inline bool options::
+ generate_insertion_specified () const
+ {
+ return this->generate_insertion_specified_;
+ }
+
+ inline const NarrowStrings& options::
+ generate_extraction () const
+ {
+ return this->generate_extraction_;
+ }
+
+ inline bool options::
+ generate_extraction_specified () const
+ {
+ return this->generate_extraction_specified_;
+ }
+
+ inline const bool& options::
+ generate_forward () const
+ {
+ return this->generate_forward_;
+ }
+
+ inline const bool& options::
+ suppress_parsing () const
+ {
+ return this->suppress_parsing_;
+ }
+
+ inline const bool& options::
+ generate_element_type () const
+ {
+ return this->generate_element_type_;
+ }
+
+ inline const bool& options::
+ generate_element_map () const
+ {
+ return this->generate_element_map_;
+ }
+
+ inline const bool& options::
+ generate_intellisense () const
+ {
+ return this->generate_intellisense_;
+ }
+
+ inline const bool& options::
+ omit_default_attributes () const
+ {
+ return this->omit_default_attributes_;
+ }
+
+ inline const NarrowString& options::
+ type_naming () const
+ {
+ return this->type_naming_;
+ }
+
+ inline bool options::
+ type_naming_specified () const
+ {
+ return this->type_naming_specified_;
+ }
+
+ inline const NarrowString& options::
+ function_naming () const
+ {
+ return this->function_naming_;
+ }
+
+ inline bool options::
+ function_naming_specified () const
+ {
+ return this->function_naming_specified_;
+ }
+
+ inline const NarrowStrings& options::
+ type_regex () const
+ {
+ return this->type_regex_;
+ }
+
+ inline bool options::
+ type_regex_specified () const
+ {
+ return this->type_regex_specified_;
+ }
+
+ inline const NarrowStrings& options::
+ accessor_regex () const
+ {
+ return this->accessor_regex_;
+ }
+
+ inline bool options::
+ accessor_regex_specified () const
+ {
+ return this->accessor_regex_specified_;
+ }
+
+ inline const NarrowStrings& options::
+ one_accessor_regex () const
+ {
+ return this->one_accessor_regex_;
+ }
+
+ inline bool options::
+ one_accessor_regex_specified () const
+ {
+ return this->one_accessor_regex_specified_;
+ }
+
+ inline const NarrowStrings& options::
+ opt_accessor_regex () const
+ {
+ return this->opt_accessor_regex_;
+ }
+
+ inline bool options::
+ opt_accessor_regex_specified () const
+ {
+ return this->opt_accessor_regex_specified_;
+ }
+
+ inline const NarrowStrings& options::
+ seq_accessor_regex () const
+ {
+ return this->seq_accessor_regex_;
+ }
+
+ inline bool options::
+ seq_accessor_regex_specified () const
+ {
+ return this->seq_accessor_regex_specified_;
+ }
+
+ inline const NarrowStrings& options::
+ modifier_regex () const
+ {
+ return this->modifier_regex_;
+ }
+
+ inline bool options::
+ modifier_regex_specified () const
+ {
+ return this->modifier_regex_specified_;
+ }
+
+ inline const NarrowStrings& options::
+ one_modifier_regex () const
+ {
+ return this->one_modifier_regex_;
+ }
+
+ inline bool options::
+ one_modifier_regex_specified () const
+ {
+ return this->one_modifier_regex_specified_;
+ }
+
+ inline const NarrowStrings& options::
+ opt_modifier_regex () const
+ {
+ return this->opt_modifier_regex_;
+ }
+
+ inline bool options::
+ opt_modifier_regex_specified () const
+ {
+ return this->opt_modifier_regex_specified_;
+ }
+
+ inline const NarrowStrings& options::
+ seq_modifier_regex () const
+ {
+ return this->seq_modifier_regex_;
+ }
+
+ inline bool options::
+ seq_modifier_regex_specified () const
+ {
+ return this->seq_modifier_regex_specified_;
+ }
+
+ inline const NarrowStrings& options::
+ parser_regex () const
+ {
+ return this->parser_regex_;
+ }
+
+ inline bool options::
+ parser_regex_specified () const
+ {
+ return this->parser_regex_specified_;
+ }
+
+ inline const NarrowStrings& options::
+ serializer_regex () const
+ {
+ return this->serializer_regex_;
+ }
+
+ inline bool options::
+ serializer_regex_specified () const
+ {
+ return this->serializer_regex_specified_;
+ }
+
+ inline const NarrowStrings& options::
+ const_regex () const
+ {
+ return this->const_regex_;
+ }
+
+ inline bool options::
+ const_regex_specified () const
+ {
+ return this->const_regex_specified_;
+ }
+
+ inline const NarrowStrings& options::
+ enumerator_regex () const
+ {
+ return this->enumerator_regex_;
+ }
+
+ inline bool options::
+ enumerator_regex_specified () const
+ {
+ return this->enumerator_regex_specified_;
+ }
+
+ inline const NarrowStrings& options::
+ element_type_regex () const
+ {
+ return this->element_type_regex_;
+ }
+
+ inline bool options::
+ element_type_regex_specified () const
+ {
+ return this->element_type_regex_specified_;
+ }
+
+ inline const bool& options::
+ name_regex_trace () const
+ {
+ return this->name_regex_trace_;
+ }
+
+ inline const bool& options::
+ root_element_first () const
+ {
+ return this->root_element_first_;
+ }
+
+ inline const bool& options::
+ root_element_last () const
+ {
+ return this->root_element_last_;
+ }
+
+ inline const bool& options::
+ root_element_all () const
+ {
+ return this->root_element_all_;
+ }
+
+ inline const bool& options::
+ root_element_none () const
+ {
+ return this->root_element_none_;
+ }
+
+ inline const NarrowStrings& options::
+ root_element () const
+ {
+ return this->root_element_;
+ }
+
+ inline bool options::
+ root_element_specified () const
+ {
+ return this->root_element_specified_;
+ }
+
+ inline const NarrowStrings& options::
+ custom_type () const
+ {
+ return this->custom_type_;
+ }
+
+ inline bool options::
+ custom_type_specified () const
+ {
+ return this->custom_type_specified_;
+ }
+
+ inline const NarrowStrings& options::
+ custom_type_regex () const
+ {
+ return this->custom_type_regex_;
+ }
+
+ inline bool options::
+ custom_type_regex_specified () const
+ {
+ return this->custom_type_regex_specified_;
+ }
+
+ inline const std::size_t& options::
+ parts () const
+ {
+ return this->parts_;
+ }
+
+ inline bool options::
+ parts_specified () const
+ {
+ return this->parts_specified_;
+ }
+
+ inline const NarrowString& options::
+ parts_suffix () const
+ {
+ return this->parts_suffix_;
+ }
+
+ inline bool options::
+ parts_suffix_specified () const
+ {
+ return this->parts_suffix_specified_;
+ }
+ }
+}
+
+// Begin epilogue.
+//
+//
+// End epilogue.
diff --git a/xsd/xsd/pregenerated/xsd/options.cxx b/xsd/xsd/pregenerated/xsd/options.cxx
new file mode 100644
index 0000000..3022ec4
--- /dev/null
+++ b/xsd/xsd/pregenerated/xsd/options.cxx
@@ -0,0 +1,1297 @@
+// -*- C++ -*-
+//
+// This file was generated by CLI, a command line interface
+// compiler for C++.
+//
+
+// Begin prologue.
+//
+#include <xsd/options-parser.hxx>
+//
+// End prologue.
+
+#include <xsd/options.hxx>
+
+#include <map>
+#include <set>
+#include <string>
+#include <vector>
+#include <utility>
+#include <ostream>
+#include <sstream>
+#include <cstring>
+#include <fstream>
+
+namespace cli
+{
+ // unknown_option
+ //
+ unknown_option::
+ ~unknown_option () noexcept
+ {
+ }
+
+ void unknown_option::
+ print (::std::wostream& os) const
+ {
+ os << "unknown option '" << option ().c_str () << "'";
+ }
+
+ const char* unknown_option::
+ what () const noexcept
+ {
+ return "unknown option";
+ }
+
+ // unknown_argument
+ //
+ unknown_argument::
+ ~unknown_argument () noexcept
+ {
+ }
+
+ void unknown_argument::
+ print (::std::wostream& os) const
+ {
+ os << "unknown argument '" << argument ().c_str () << "'";
+ }
+
+ const char* unknown_argument::
+ what () const noexcept
+ {
+ return "unknown argument";
+ }
+
+ // missing_value
+ //
+ missing_value::
+ ~missing_value () noexcept
+ {
+ }
+
+ void missing_value::
+ print (::std::wostream& os) const
+ {
+ os << "missing value for option '" << option ().c_str () << "'";
+ }
+
+ const char* missing_value::
+ what () const noexcept
+ {
+ return "missing option value";
+ }
+
+ // invalid_value
+ //
+ invalid_value::
+ ~invalid_value () noexcept
+ {
+ }
+
+ void invalid_value::
+ print (::std::wostream& os) const
+ {
+ os << "invalid value '" << value ().c_str () << "' for option '"
+ << option ().c_str () << "'";
+
+ if (!message ().empty ())
+ os << ": " << message ().c_str ();
+ }
+
+ const char* invalid_value::
+ what () const noexcept
+ {
+ return "invalid option value";
+ }
+
+ // eos_reached
+ //
+ void eos_reached::
+ print (::std::wostream& os) const
+ {
+ os << what ();
+ }
+
+ const char* eos_reached::
+ what () const noexcept
+ {
+ return "end of argument stream reached";
+ }
+
+ // file_io_failure
+ //
+ file_io_failure::
+ ~file_io_failure () noexcept
+ {
+ }
+
+ void file_io_failure::
+ print (::std::wostream& os) const
+ {
+ os << "unable to open file '" << file ().c_str () << "' or read failure";
+ }
+
+ const char* file_io_failure::
+ what () const noexcept
+ {
+ return "unable to open file or read failure";
+ }
+
+ // unmatched_quote
+ //
+ unmatched_quote::
+ ~unmatched_quote () noexcept
+ {
+ }
+
+ void unmatched_quote::
+ print (::std::wostream& os) const
+ {
+ os << "unmatched quote in argument '" << argument ().c_str () << "'";
+ }
+
+ const char* unmatched_quote::
+ what () const noexcept
+ {
+ return "unmatched quote";
+ }
+
+ // scanner
+ //
+ scanner::
+ ~scanner ()
+ {
+ }
+
+ // argv_scanner
+ //
+ bool argv_scanner::
+ more ()
+ {
+ return i_ < argc_;
+ }
+
+ const char* argv_scanner::
+ peek ()
+ {
+ if (i_ < argc_)
+ return argv_[i_];
+ else
+ throw eos_reached ();
+ }
+
+ const char* argv_scanner::
+ next ()
+ {
+ if (i_ < argc_)
+ {
+ const char* r (argv_[i_]);
+
+ if (erase_)
+ {
+ for (int i (i_ + 1); i < argc_; ++i)
+ argv_[i - 1] = argv_[i];
+
+ --argc_;
+ argv_[argc_] = 0;
+ }
+ else
+ ++i_;
+
+ ++start_position_;
+ return r;
+ }
+ else
+ throw eos_reached ();
+ }
+
+ void argv_scanner::
+ skip ()
+ {
+ if (i_ < argc_)
+ {
+ ++i_;
+ ++start_position_;
+ }
+ else
+ throw eos_reached ();
+ }
+
+ std::size_t argv_scanner::
+ position ()
+ {
+ return start_position_;
+ }
+
+ // argv_file_scanner
+ //
+ int argv_file_scanner::zero_argc_ = 0;
+ std::string argv_file_scanner::empty_string_;
+
+ bool argv_file_scanner::
+ more ()
+ {
+ if (!args_.empty ())
+ return true;
+
+ while (base::more ())
+ {
+ // See if the next argument is the file option.
+ //
+ const char* a (base::peek ());
+ const option_info* oi = 0;
+ const char* ov = 0;
+
+ if (!skip_)
+ {
+ if ((oi = find (a)) != 0)
+ {
+ base::next ();
+
+ if (!base::more ())
+ throw missing_value (a);
+
+ ov = base::next ();
+ }
+ else if (std::strncmp (a, "-", 1) == 0)
+ {
+ if ((ov = std::strchr (a, '=')) != 0)
+ {
+ std::string o (a, 0, ov - a);
+ if ((oi = find (o.c_str ())) != 0)
+ {
+ base::next ();
+ ++ov;
+ }
+ }
+ }
+ }
+
+ if (oi != 0)
+ {
+ if (oi->search_func != 0)
+ {
+ std::string f (oi->search_func (ov, oi->arg));
+
+ if (!f.empty ())
+ load (f);
+ }
+ else
+ load (ov);
+
+ if (!args_.empty ())
+ return true;
+ }
+ else
+ {
+ if (!skip_)
+ skip_ = (std::strcmp (a, "--") == 0);
+
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ const char* argv_file_scanner::
+ peek ()
+ {
+ if (!more ())
+ throw eos_reached ();
+
+ return args_.empty () ? base::peek () : args_.front ().value.c_str ();
+ }
+
+ const std::string& argv_file_scanner::
+ peek_file ()
+ {
+ if (!more ())
+ throw eos_reached ();
+
+ return args_.empty () ? empty_string_ : *args_.front ().file;
+ }
+
+ std::size_t argv_file_scanner::
+ peek_line ()
+ {
+ if (!more ())
+ throw eos_reached ();
+
+ return args_.empty () ? 0 : args_.front ().line;
+ }
+
+ const char* argv_file_scanner::
+ next ()
+ {
+ if (!more ())
+ throw eos_reached ();
+
+ if (args_.empty ())
+ return base::next ();
+ else
+ {
+ hold_[i_ == 0 ? ++i_ : --i_].swap (args_.front ().value);
+ args_.pop_front ();
+ ++start_position_;
+ return hold_[i_].c_str ();
+ }
+ }
+
+ void argv_file_scanner::
+ skip ()
+ {
+ if (!more ())
+ throw eos_reached ();
+
+ if (args_.empty ())
+ return base::skip ();
+ else
+ {
+ args_.pop_front ();
+ ++start_position_;
+ }
+ }
+
+ const argv_file_scanner::option_info* argv_file_scanner::
+ find (const char* a) const
+ {
+ for (std::size_t i (0); i < options_count_; ++i)
+ if (std::strcmp (a, options_[i].option) == 0)
+ return &options_[i];
+
+ return 0;
+ }
+
+ std::size_t argv_file_scanner::
+ position ()
+ {
+ return start_position_;
+ }
+
+ void argv_file_scanner::
+ load (const std::string& file)
+ {
+ using namespace std;
+
+ ifstream is (file.c_str ());
+
+ if (!is.is_open ())
+ throw file_io_failure (file);
+
+ files_.push_back (file);
+
+ arg a;
+ a.file = &*files_.rbegin ();
+
+ for (a.line = 1; !is.eof (); ++a.line)
+ {
+ string line;
+ getline (is, line);
+
+ if (is.fail () && !is.eof ())
+ throw file_io_failure (file);
+
+ string::size_type n (line.size ());
+
+ // Trim the line from leading and trailing whitespaces.
+ //
+ if (n != 0)
+ {
+ const char* f (line.c_str ());
+ const char* l (f + n);
+
+ const char* of (f);
+ while (f < l && (*f == ' ' || *f == '\t' || *f == '\r'))
+ ++f;
+
+ --l;
+
+ const char* ol (l);
+ while (l > f && (*l == ' ' || *l == '\t' || *l == '\r'))
+ --l;
+
+ if (f != of || l != ol)
+ line = f <= l ? string (f, l - f + 1) : string ();
+ }
+
+ // Ignore empty lines, those that start with #.
+ //
+ if (line.empty () || line[0] == '#')
+ continue;
+
+ string::size_type p (string::npos);
+ if (line.compare (0, 1, "-") == 0)
+ {
+ p = line.find (' ');
+
+ string::size_type q (line.find ('='));
+ if (q != string::npos && q < p)
+ p = q;
+ }
+
+ string s1;
+ if (p != string::npos)
+ {
+ s1.assign (line, 0, p);
+
+ // Skip leading whitespaces in the argument.
+ //
+ if (line[p] == '=')
+ ++p;
+ else
+ {
+ n = line.size ();
+ for (++p; p < n; ++p)
+ {
+ char c (line[p]);
+ if (c != ' ' && c != '\t' && c != '\r')
+ break;
+ }
+ }
+ }
+ else if (!skip_)
+ skip_ = (line == "--");
+
+ string s2 (line, p != string::npos ? p : 0);
+
+ // If the string (which is an option value or argument) is
+ // wrapped in quotes, remove them.
+ //
+ n = s2.size ();
+ char cf (s2[0]), cl (s2[n - 1]);
+
+ if (cf == '"' || cf == '\'' || cl == '"' || cl == '\'')
+ {
+ if (n == 1 || cf != cl)
+ throw unmatched_quote (s2);
+
+ s2 = string (s2, 1, n - 2);
+ }
+
+ if (!s1.empty ())
+ {
+ // See if this is another file option.
+ //
+ const option_info* oi;
+ if (!skip_ && (oi = find (s1.c_str ())))
+ {
+ if (s2.empty ())
+ throw missing_value (oi->option);
+
+ if (oi->search_func != 0)
+ {
+ string f (oi->search_func (s2.c_str (), oi->arg));
+ if (!f.empty ())
+ load (f);
+ }
+ else
+ {
+ // If the path of the file being parsed is not simple and the
+ // path of the file that needs to be loaded is relative, then
+ // complete the latter using the former as a base.
+ //
+#ifndef _WIN32
+ string::size_type p (file.find_last_of ('/'));
+ bool c (p != string::npos && s2[0] != '/');
+#else
+ string::size_type p (file.find_last_of ("/\\"));
+ bool c (p != string::npos && s2[1] != ':');
+#endif
+ if (c)
+ s2.insert (0, file, 0, p + 1);
+
+ load (s2);
+ }
+
+ continue;
+ }
+
+ a.value = s1;
+ args_.push_back (a);
+ }
+
+ a.value = s2;
+ args_.push_back (a);
+ }
+ }
+
+ template <typename X>
+ struct parser
+ {
+ static void
+ parse (X& x, bool& xs, scanner& s)
+ {
+ using namespace std;
+
+ const char* o (s.next ());
+ if (s.more ())
+ {
+ string v (s.next ());
+ istringstream is (v);
+ if (!(is >> x && is.peek () == istringstream::traits_type::eof ()))
+ throw invalid_value (o, v);
+ }
+ else
+ throw missing_value (o);
+
+ xs = true;
+ }
+ };
+
+ template <>
+ struct parser<bool>
+ {
+ static void
+ parse (bool& x, bool& xs, scanner& s)
+ {
+ const char* o (s.next ());
+
+ if (s.more ())
+ {
+ const char* v (s.next ());
+
+ if (std::strcmp (v, "1") == 0 ||
+ std::strcmp (v, "true") == 0 ||
+ std::strcmp (v, "TRUE") == 0 ||
+ std::strcmp (v, "True") == 0)
+ x = true;
+ else if (std::strcmp (v, "0") == 0 ||
+ std::strcmp (v, "false") == 0 ||
+ std::strcmp (v, "FALSE") == 0 ||
+ std::strcmp (v, "False") == 0)
+ x = false;
+ else
+ throw invalid_value (o, v);
+ }
+ else
+ throw missing_value (o);
+
+ xs = true;
+ }
+ };
+
+ template <>
+ struct parser<std::string>
+ {
+ static void
+ parse (std::string& x, bool& xs, scanner& s)
+ {
+ const char* o (s.next ());
+
+ if (s.more ())
+ x = s.next ();
+ else
+ throw missing_value (o);
+
+ xs = true;
+ }
+ };
+
+ template <typename X>
+ struct parser<std::pair<X, std::size_t> >
+ {
+ static void
+ parse (std::pair<X, std::size_t>& x, bool& xs, scanner& s)
+ {
+ x.second = s.position ();
+ parser<X>::parse (x.first, xs, s);
+ }
+ };
+
+ template <typename X>
+ struct parser<std::vector<X> >
+ {
+ static void
+ parse (std::vector<X>& c, bool& xs, scanner& s)
+ {
+ X x;
+ bool dummy;
+ parser<X>::parse (x, dummy, s);
+ c.push_back (x);
+ xs = true;
+ }
+ };
+
+ template <typename X, typename C>
+ struct parser<std::set<X, C> >
+ {
+ static void
+ parse (std::set<X, C>& c, bool& xs, scanner& s)
+ {
+ X x;
+ bool dummy;
+ parser<X>::parse (x, dummy, s);
+ c.insert (x);
+ xs = true;
+ }
+ };
+
+ template <typename K, typename V, typename C>
+ struct parser<std::map<K, V, C> >
+ {
+ static void
+ parse (std::map<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[k] = v;
+ }
+ else
+ throw missing_value (o);
+
+ xs = true;
+ }
+ };
+
+ 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)
+ {
+ parser<T>::parse (x.*M, s);
+ }
+
+ template <typename X, bool X::*M>
+ void
+ thunk (X& x, scanner& s)
+ {
+ s.next ();
+ x.*M = true;
+ }
+
+ template <typename X, typename T, T X::*M, bool X::*S>
+ void
+ thunk (X& x, scanner& s)
+ {
+ parser<T>::parse (x.*M, x.*S, s);
+ }
+}
+
+#include <map>
+
+// help_options
+//
+
+help_options::
+help_options ()
+: build2_metadata_ (),
+ build2_metadata_specified_ (false),
+ help_ (),
+ version_ (),
+ proprietary_license_ ()
+{
+}
+
+help_options::
+help_options (int& argc,
+ char** argv,
+ bool erase,
+ ::cli::unknown_mode opt,
+ ::cli::unknown_mode arg)
+: build2_metadata_ (),
+ build2_metadata_specified_ (false),
+ help_ (),
+ version_ (),
+ proprietary_license_ ()
+{
+ ::cli::argv_scanner s (argc, argv, erase);
+ _parse (s, opt, arg);
+}
+
+help_options::
+help_options (int start,
+ int& argc,
+ char** argv,
+ bool erase,
+ ::cli::unknown_mode opt,
+ ::cli::unknown_mode arg)
+: build2_metadata_ (),
+ build2_metadata_specified_ (false),
+ help_ (),
+ version_ (),
+ proprietary_license_ ()
+{
+ ::cli::argv_scanner s (start, argc, argv, erase);
+ _parse (s, opt, arg);
+}
+
+help_options::
+help_options (int& argc,
+ char** argv,
+ int& end,
+ bool erase,
+ ::cli::unknown_mode opt,
+ ::cli::unknown_mode arg)
+: build2_metadata_ (),
+ build2_metadata_specified_ (false),
+ help_ (),
+ version_ (),
+ proprietary_license_ ()
+{
+ ::cli::argv_scanner s (argc, argv, erase);
+ _parse (s, opt, arg);
+ end = s.end ();
+}
+
+help_options::
+help_options (int start,
+ int& argc,
+ char** argv,
+ int& end,
+ bool erase,
+ ::cli::unknown_mode opt,
+ ::cli::unknown_mode arg)
+: build2_metadata_ (),
+ build2_metadata_specified_ (false),
+ help_ (),
+ version_ (),
+ proprietary_license_ ()
+{
+ ::cli::argv_scanner s (start, argc, argv, erase);
+ _parse (s, opt, arg);
+ end = s.end ();
+}
+
+help_options::
+help_options (::cli::scanner& s,
+ ::cli::unknown_mode opt,
+ ::cli::unknown_mode arg)
+: build2_metadata_ (),
+ build2_metadata_specified_ (false),
+ help_ (),
+ version_ (),
+ proprietary_license_ ()
+{
+ _parse (s, opt, arg);
+}
+
+::cli::usage_para help_options::
+print_usage (::std::wostream& os, ::cli::usage_para p)
+{
+ CLI_POTENTIALLY_UNUSED (os);
+
+ return p;
+}
+
+typedef
+std::map<std::string, void (*) (help_options&, ::cli::scanner&)>
+_cli_help_options_map;
+
+static _cli_help_options_map _cli_help_options_map_;
+
+struct _cli_help_options_map_init
+{
+ _cli_help_options_map_init ()
+ {
+ _cli_help_options_map_["--build2-metadata"] =
+ &::cli::thunk< help_options, std::uint64_t, &help_options::build2_metadata_,
+ &help_options::build2_metadata_specified_ >;
+ _cli_help_options_map_["--help"] =
+ &::cli::thunk< help_options, &help_options::help_ >;
+ _cli_help_options_map_["--version"] =
+ &::cli::thunk< help_options, &help_options::version_ >;
+ _cli_help_options_map_["--proprietary-license"] =
+ &::cli::thunk< help_options, &help_options::proprietary_license_ >;
+ }
+};
+
+static _cli_help_options_map_init _cli_help_options_map_init_;
+
+bool help_options::
+_parse (const char* o, ::cli::scanner& s)
+{
+ _cli_help_options_map::const_iterator i (_cli_help_options_map_.find (o));
+
+ if (i != _cli_help_options_map_.end ())
+ {
+ (*(i->second)) (*this, s);
+ return true;
+ }
+
+ return false;
+}
+
+bool help_options::
+_parse (::cli::scanner& s,
+ ::cli::unknown_mode opt_mode,
+ ::cli::unknown_mode arg_mode)
+{
+ // Can't skip combined flags (--no-combined-flags).
+ //
+ assert (opt_mode != ::cli::unknown_mode::skip);
+
+ bool r = false;
+ bool opt = true;
+
+ while (s.more ())
+ {
+ const char* o = s.peek ();
+
+ if (std::strcmp (o, "--") == 0)
+ {
+ opt = false;
+ s.skip ();
+ r = true;
+ continue;
+ }
+
+ if (opt)
+ {
+ if (_parse (o, s))
+ {
+ r = true;
+ continue;
+ }
+
+ if (std::strncmp (o, "-", 1) == 0 && o[1] != '\0')
+ {
+ // Handle combined option values.
+ //
+ std::string co;
+ if (const char* v = std::strchr (o, '='))
+ {
+ co.assign (o, 0, v - o);
+ ++v;
+
+ int ac (2);
+ char* av[] =
+ {
+ const_cast<char*> (co.c_str ()),
+ const_cast<char*> (v)
+ };
+
+ ::cli::argv_scanner ns (0, ac, av);
+
+ if (_parse (co.c_str (), ns))
+ {
+ // Parsed the option but not its value?
+ //
+ if (ns.end () != 2)
+ throw ::cli::invalid_value (co, v);
+
+ s.next ();
+ r = true;
+ continue;
+ }
+ else
+ {
+ // Set the unknown option and fall through.
+ //
+ o = co.c_str ();
+ }
+ }
+
+ // Handle combined flags.
+ //
+ char cf[3];
+ {
+ const char* p = o + 1;
+ for (; *p != '\0'; ++p)
+ {
+ if (!((*p >= 'a' && *p <= 'z') ||
+ (*p >= 'A' && *p <= 'Z') ||
+ (*p >= '0' && *p <= '9')))
+ break;
+ }
+
+ if (*p == '\0')
+ {
+ for (p = o + 1; *p != '\0'; ++p)
+ {
+ std::strcpy (cf, "-");
+ cf[1] = *p;
+ cf[2] = '\0';
+
+ int ac (1);
+ char* av[] =
+ {
+ cf
+ };
+
+ ::cli::argv_scanner ns (0, ac, av);
+
+ if (!_parse (cf, ns))
+ break;
+ }
+
+ if (*p == '\0')
+ {
+ // All handled.
+ //
+ s.next ();
+ r = true;
+ continue;
+ }
+ else
+ {
+ // Set the unknown option and fall through.
+ //
+ o = cf;
+ }
+ }
+ }
+
+ switch (opt_mode)
+ {
+ case ::cli::unknown_mode::skip:
+ {
+ s.skip ();
+ r = true;
+ continue;
+ }
+ case ::cli::unknown_mode::stop:
+ {
+ break;
+ }
+ case ::cli::unknown_mode::fail:
+ {
+ throw ::cli::unknown_option (o);
+ }
+ }
+
+ break;
+ }
+ }
+
+ switch (arg_mode)
+ {
+ case ::cli::unknown_mode::skip:
+ {
+ s.skip ();
+ r = true;
+ continue;
+ }
+ case ::cli::unknown_mode::stop:
+ {
+ break;
+ }
+ case ::cli::unknown_mode::fail:
+ {
+ throw ::cli::unknown_argument (o);
+ }
+ }
+
+ break;
+ }
+
+ return r;
+}
+
+// options
+//
+
+options::
+options ()
+: disable_warning_ (),
+ disable_warning_specified_ (false),
+ options_file_ (),
+ options_file_specified_ (false),
+ show_sloc_ (),
+ sloc_limit_ (),
+ sloc_limit_specified_ (false),
+ proprietary_license_ (),
+ custom_literals_ (),
+ custom_literals_specified_ (false),
+ preserve_anonymous_ (),
+ show_anonymous_ (),
+ anonymous_regex_ (),
+ anonymous_regex_specified_ (false),
+ anonymous_regex_trace_ (),
+ morph_anonymous_ (),
+ location_map_ (),
+ location_map_specified_ (false),
+ location_regex_ (),
+ location_regex_specified_ (false),
+ location_regex_trace_ (),
+ file_per_type_ (),
+ type_file_regex_ (),
+ type_file_regex_specified_ (false),
+ type_file_regex_trace_ (),
+ schema_file_regex_ (),
+ schema_file_regex_specified_ (false),
+ schema_file_regex_trace_ (),
+ fat_type_file_ (),
+ file_list_ (),
+ file_list_specified_ (false),
+ file_list_only_ (),
+ file_list_prologue_ (),
+ file_list_prologue_specified_ (false),
+ file_list_epilogue_ (),
+ file_list_epilogue_specified_ (false),
+ file_list_delim_ ("\n"),
+ file_list_delim_specified_ (false),
+ disable_multi_import_ (),
+ disable_full_check_ ()
+{
+}
+
+::cli::usage_para options::
+print_usage (::std::wostream& os, ::cli::usage_para p)
+{
+ CLI_POTENTIALLY_UNUSED (os);
+
+ if (p == ::cli::usage_para::text)
+ os << ::std::endl;
+
+ os << "--disable-warning <warn> Disable printing warning with id <warn>." << ::std::endl;
+
+ os << "--options-file <file> Read additional options from <file>." << ::std::endl;
+
+ os << "--show-sloc Show the number of generated physical source lines" << ::std::endl
+ << " of code (SLOC)." << ::std::endl;
+
+ os << "--sloc-limit <num> Check that the number of generated physical source" << ::std::endl
+ << " lines of code (SLOC) does not exceed <num>." << ::std::endl;
+
+ os << "--proprietary-license Indicate that the generated code is licensed under" << ::std::endl
+ << " a proprietary license instead of the GPL." << ::std::endl;
+
+ os << "--custom-literals <file> Load custom XML string to C++ literal mappings" << ::std::endl
+ << " from <file>." << ::std::endl;
+
+ os << "--preserve-anonymous Preserve anonymous types." << ::std::endl;
+
+ os << "--show-anonymous Show elements and attributes that are of anonymous" << ::std::endl
+ << " types." << ::std::endl;
+
+ os << "--anonymous-regex <regex> Add <regex> to the list of regular expressions" << ::std::endl
+ << " used to derive names for anonymous types from the" << ::std::endl
+ << " enclosing attributes/elements." << ::std::endl;
+
+ os << "--anonymous-regex-trace Trace the process of applying regular expressions" << ::std::endl
+ << " specified with the --anonymous-regex option." << ::std::endl;
+
+ os << "--location-map <ol>=<nl> Map the original schema location <ol> that is" << ::std::endl
+ << " specified in the XML Schema include or import" << ::std::endl
+ << " elements to new schema location <nl>." << ::std::endl;
+
+ os << "--location-regex <regex> Add <regex> to the list of regular expressions" << ::std::endl
+ << " used to map schema locations that are specified in" << ::std::endl
+ << " the XML Schema include or import elements." << ::std::endl;
+
+ os << "--location-regex-trace Trace the process of applying regular expressions" << ::std::endl
+ << " specified with the --location-regex option." << ::std::endl;
+
+ os << "--file-per-type Generate a separate set of C++ files for each type" << ::std::endl
+ << " defined in XML Schema." << ::std::endl;
+
+ os << "--type-file-regex <regex> Add <regex> to the list of regular expressions" << ::std::endl
+ << " used to translate type names to file names when" << ::std::endl
+ << " the --file-per-type option is specified." << ::std::endl;
+
+ os << "--type-file-regex-trace Trace the process of applying regular expressions" << ::std::endl
+ << " specified with the --type-file-regex option." << ::std::endl;
+
+ os << "--schema-file-regex <regex> Add <regex> to the list of regular expressions" << ::std::endl
+ << " used to translate schema file names when the" << ::std::endl
+ << " --file-per-type option is specified." << ::std::endl;
+
+ os << "--schema-file-regex-trace Trace the process of applying regular expressions" << ::std::endl
+ << " specified with the --schema-file-regex option." << ::std::endl;
+
+ os << "--fat-type-file Generate code corresponding to global elements" << ::std::endl
+ << " 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> 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;
+
+ os << "--file-list-epilogue <text> Insert <text> at the end of the file list." << ::std::endl;
+
+ os << "--file-list-delim <text> Delimit file names written to the file list with" << ::std::endl
+ << " <text> instead of new lines." << ::std::endl;
+
+ p = ::cli::usage_para::option;
+
+ return p;
+}
+
+typedef
+std::map<std::string, void (*) (options&, ::cli::scanner&)>
+_cli_options_map;
+
+static _cli_options_map _cli_options_map_;
+
+struct _cli_options_map_init
+{
+ _cli_options_map_init ()
+ {
+ _cli_options_map_["--disable-warning"] =
+ &::cli::thunk< options, NarrowStrings, &options::disable_warning_,
+ &options::disable_warning_specified_ >;
+ _cli_options_map_["--options-file"] =
+ &::cli::thunk< options, std::string, &options::options_file_,
+ &options::options_file_specified_ >;
+ _cli_options_map_["--show-sloc"] =
+ &::cli::thunk< options, &options::show_sloc_ >;
+ _cli_options_map_["--sloc-limit"] =
+ &::cli::thunk< options, std::size_t, &options::sloc_limit_,
+ &options::sloc_limit_specified_ >;
+ _cli_options_map_["--proprietary-license"] =
+ &::cli::thunk< options, &options::proprietary_license_ >;
+ _cli_options_map_["--custom-literals"] =
+ &::cli::thunk< options, NarrowString, &options::custom_literals_,
+ &options::custom_literals_specified_ >;
+ _cli_options_map_["--preserve-anonymous"] =
+ &::cli::thunk< options, &options::preserve_anonymous_ >;
+ _cli_options_map_["--show-anonymous"] =
+ &::cli::thunk< options, &options::show_anonymous_ >;
+ _cli_options_map_["--anonymous-regex"] =
+ &::cli::thunk< options, NarrowStrings, &options::anonymous_regex_,
+ &options::anonymous_regex_specified_ >;
+ _cli_options_map_["--anonymous-regex-trace"] =
+ &::cli::thunk< options, &options::anonymous_regex_trace_ >;
+ _cli_options_map_["--morph-anonymous"] =
+ &::cli::thunk< options, &options::morph_anonymous_ >;
+ _cli_options_map_["--location-map"] =
+ &::cli::thunk< options, NarrowStrings, &options::location_map_,
+ &options::location_map_specified_ >;
+ _cli_options_map_["--location-regex"] =
+ &::cli::thunk< options, NarrowStrings, &options::location_regex_,
+ &options::location_regex_specified_ >;
+ _cli_options_map_["--location-regex-trace"] =
+ &::cli::thunk< options, &options::location_regex_trace_ >;
+ _cli_options_map_["--file-per-type"] =
+ &::cli::thunk< options, &options::file_per_type_ >;
+ _cli_options_map_["--type-file-regex"] =
+ &::cli::thunk< options, NarrowStrings, &options::type_file_regex_,
+ &options::type_file_regex_specified_ >;
+ _cli_options_map_["--type-file-regex-trace"] =
+ &::cli::thunk< options, &options::type_file_regex_trace_ >;
+ _cli_options_map_["--schema-file-regex"] =
+ &::cli::thunk< options, NarrowStrings, &options::schema_file_regex_,
+ &options::schema_file_regex_specified_ >;
+ _cli_options_map_["--schema-file-regex-trace"] =
+ &::cli::thunk< options, &options::schema_file_regex_trace_ >;
+ _cli_options_map_["--fat-type-file"] =
+ &::cli::thunk< options, &options::fat_type_file_ >;
+ _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_ >;
+ _cli_options_map_["--file-list-epilogue"] =
+ &::cli::thunk< options, NarrowString, &options::file_list_epilogue_,
+ &options::file_list_epilogue_specified_ >;
+ _cli_options_map_["--file-list-delim"] =
+ &::cli::thunk< options, NarrowString, &options::file_list_delim_,
+ &options::file_list_delim_specified_ >;
+ _cli_options_map_["--disable-multi-import"] =
+ &::cli::thunk< options, &options::disable_multi_import_ >;
+ _cli_options_map_["--disable-full-check"] =
+ &::cli::thunk< options, &options::disable_full_check_ >;
+ }
+};
+
+static _cli_options_map_init _cli_options_map_init_;
+
+bool options::
+_parse (const char* o, ::cli::scanner& s)
+{
+ _cli_options_map::const_iterator i (_cli_options_map_.find (o));
+
+ if (i != _cli_options_map_.end ())
+ {
+ (*(i->second)) (*this, s);
+ return true;
+ }
+
+ return false;
+}
+
+// Begin epilogue.
+//
+//
+// End epilogue.
+
diff --git a/xsd/xsd/pregenerated/xsd/options.hxx b/xsd/xsd/pregenerated/xsd/options.hxx
new file mode 100644
index 0000000..0f4383c
--- /dev/null
+++ b/xsd/xsd/pregenerated/xsd/options.hxx
@@ -0,0 +1,702 @@
+// -*- C++ -*-
+//
+// This file was generated by CLI, a command line interface
+// compiler for C++.
+//
+
+#ifndef XSD_OPTIONS_HXX
+#define XSD_OPTIONS_HXX
+
+// Begin prologue.
+//
+//
+// End prologue.
+
+#include <list>
+#include <deque>
+#include <iosfwd>
+#include <string>
+#include <cstddef>
+#include <exception>
+
+#ifndef CLI_POTENTIALLY_UNUSED
+# if defined(_MSC_VER) || defined(__xlC__)
+# define CLI_POTENTIALLY_UNUSED(x) (void*)&x
+# else
+# define CLI_POTENTIALLY_UNUSED(x) (void)x
+# endif
+#endif
+
+namespace cli
+{
+ class usage_para
+ {
+ public:
+ enum value
+ {
+ none,
+ text,
+ option
+ };
+
+ usage_para (value);
+
+ operator value () const
+ {
+ return v_;
+ }
+
+ private:
+ value v_;
+ };
+
+ class unknown_mode
+ {
+ public:
+ enum value
+ {
+ skip,
+ stop,
+ fail
+ };
+
+ unknown_mode (value);
+
+ operator value () const
+ {
+ return v_;
+ }
+
+ private:
+ value v_;
+ };
+
+ // Exceptions.
+ //
+
+ class exception: public std::exception
+ {
+ public:
+ virtual void
+ print (::std::wostream&) const = 0;
+ };
+
+ ::std::wostream&
+ operator<< (::std::wostream&, const exception&);
+
+ class unknown_option: public exception
+ {
+ public:
+ virtual
+ ~unknown_option () noexcept;
+
+ unknown_option (const std::string& option);
+
+ const std::string&
+ option () const;
+
+ virtual void
+ print (::std::wostream&) const;
+
+ virtual const char*
+ what () const noexcept;
+
+ private:
+ std::string option_;
+ };
+
+ class unknown_argument: public exception
+ {
+ public:
+ virtual
+ ~unknown_argument () noexcept;
+
+ unknown_argument (const std::string& argument);
+
+ const std::string&
+ argument () const;
+
+ virtual void
+ print (::std::wostream&) const;
+
+ virtual const char*
+ what () const noexcept;
+
+ private:
+ std::string argument_;
+ };
+
+ class missing_value: public exception
+ {
+ public:
+ virtual
+ ~missing_value () noexcept;
+
+ missing_value (const std::string& option);
+
+ const std::string&
+ option () const;
+
+ virtual void
+ print (::std::wostream&) const;
+
+ virtual const char*
+ what () const noexcept;
+
+ private:
+ std::string option_;
+ };
+
+ class invalid_value: public exception
+ {
+ public:
+ virtual
+ ~invalid_value () noexcept;
+
+ invalid_value (const std::string& option,
+ const std::string& value,
+ const std::string& message = std::string ());
+
+ const std::string&
+ option () const;
+
+ const std::string&
+ value () const;
+
+ const std::string&
+ message () const;
+
+ virtual void
+ print (::std::wostream&) const;
+
+ virtual const char*
+ what () const noexcept;
+
+ private:
+ std::string option_;
+ std::string value_;
+ std::string message_;
+ };
+
+ class eos_reached: public exception
+ {
+ public:
+ virtual void
+ print (::std::wostream&) const;
+
+ virtual const char*
+ what () const noexcept;
+ };
+
+ class file_io_failure: public exception
+ {
+ public:
+ virtual
+ ~file_io_failure () noexcept;
+
+ file_io_failure (const std::string& file);
+
+ const std::string&
+ file () const;
+
+ virtual void
+ print (::std::wostream&) const;
+
+ virtual const char*
+ what () const noexcept;
+
+ private:
+ std::string file_;
+ };
+
+ class unmatched_quote: public exception
+ {
+ public:
+ virtual
+ ~unmatched_quote () noexcept;
+
+ unmatched_quote (const std::string& argument);
+
+ const std::string&
+ argument () const;
+
+ virtual void
+ print (::std::wostream&) const;
+
+ virtual const char*
+ what () const noexcept;
+
+ private:
+ std::string argument_;
+ };
+
+ // Command line argument scanner interface.
+ //
+ // The values returned by next() are guaranteed to be valid
+ // for the two previous arguments up until a call to a third
+ // peek() or next().
+ //
+ // The position() function returns a monotonically-increasing
+ // number which, if stored, can later be used to determine the
+ // relative position of the argument returned by the following
+ // call to next(). Note that if multiple scanners are used to
+ // extract arguments from multiple sources, then the end
+ // position of the previous scanner should be used as the
+ // start position of the next.
+ //
+ class scanner
+ {
+ public:
+ virtual
+ ~scanner ();
+
+ virtual bool
+ more () = 0;
+
+ virtual const char*
+ peek () = 0;
+
+ virtual const char*
+ next () = 0;
+
+ virtual void
+ skip () = 0;
+
+ virtual std::size_t
+ position () = 0;
+ };
+
+ class argv_scanner: public scanner
+ {
+ public:
+ argv_scanner (int& argc,
+ char** argv,
+ bool erase = false,
+ std::size_t start_position = 0);
+
+ argv_scanner (int start,
+ int& argc,
+ char** argv,
+ bool erase = false,
+ std::size_t start_position = 0);
+
+ int
+ end () const;
+
+ virtual bool
+ more ();
+
+ virtual const char*
+ peek ();
+
+ virtual const char*
+ next ();
+
+ virtual void
+ skip ();
+
+ virtual std::size_t
+ position ();
+
+ protected:
+ std::size_t start_position_;
+ int i_;
+ int& argc_;
+ char** argv_;
+ bool erase_;
+ };
+
+ class argv_file_scanner: public argv_scanner
+ {
+ public:
+ argv_file_scanner (int& argc,
+ char** argv,
+ const std::string& option,
+ bool erase = false,
+ std::size_t start_position = 0);
+
+ argv_file_scanner (int start,
+ int& argc,
+ char** argv,
+ const std::string& option,
+ bool erase = false,
+ std::size_t start_position = 0);
+
+ argv_file_scanner (const std::string& file,
+ const std::string& option,
+ std::size_t start_position = 0);
+
+ struct option_info
+ {
+ // If search_func is not NULL, it is called, with the arg
+ // value as the second argument, to locate the options file.
+ // If it returns an empty string, then the file is ignored.
+ //
+ const char* option;
+ std::string (*search_func) (const char*, void* arg);
+ void* arg;
+ };
+
+ argv_file_scanner (int& argc,
+ char** argv,
+ const option_info* options,
+ std::size_t options_count,
+ bool erase = false,
+ std::size_t start_position = 0);
+
+ argv_file_scanner (int start,
+ int& argc,
+ char** argv,
+ const option_info* options,
+ std::size_t options_count,
+ bool erase = false,
+ std::size_t start_position = 0);
+
+ argv_file_scanner (const std::string& file,
+ const option_info* options = 0,
+ std::size_t options_count = 0,
+ std::size_t start_position = 0);
+
+ virtual bool
+ more ();
+
+ virtual const char*
+ peek ();
+
+ virtual const char*
+ next ();
+
+ virtual void
+ skip ();
+
+ virtual std::size_t
+ position ();
+
+ // Return the file path if the peeked at argument came from a file and
+ // the empty string otherwise. The reference is guaranteed to be valid
+ // till the end of the scanner lifetime.
+ //
+ const std::string&
+ peek_file ();
+
+ // Return the 1-based line number if the peeked at argument came from
+ // a file and zero otherwise.
+ //
+ std::size_t
+ peek_line ();
+
+ private:
+ const option_info*
+ find (const char*) const;
+
+ void
+ load (const std::string& file);
+
+ typedef argv_scanner base;
+
+ const std::string option_;
+ option_info option_info_;
+ const option_info* options_;
+ std::size_t options_count_;
+
+ struct arg
+ {
+ std::string value;
+ const std::string* file;
+ std::size_t line;
+ };
+
+ std::deque<arg> args_;
+ std::list<std::string> files_;
+
+ // Circular buffer of two arguments.
+ //
+ std::string hold_[2];
+ std::size_t i_;
+
+ bool skip_;
+
+ static int zero_argc_;
+ static std::string empty_string_;
+ };
+
+ template <typename X>
+ struct parser;
+}
+
+#include <cstddef>
+
+#include <cstdint>
+
+#include <xsd/types.hxx>
+
+class help_options
+{
+ public:
+ help_options ();
+
+ help_options (int& argc,
+ char** argv,
+ bool erase = false,
+ ::cli::unknown_mode option = ::cli::unknown_mode::fail,
+ ::cli::unknown_mode argument = ::cli::unknown_mode::stop);
+
+ help_options (int start,
+ int& argc,
+ char** argv,
+ bool erase = false,
+ ::cli::unknown_mode option = ::cli::unknown_mode::fail,
+ ::cli::unknown_mode argument = ::cli::unknown_mode::stop);
+
+ help_options (int& argc,
+ char** argv,
+ int& end,
+ bool erase = false,
+ ::cli::unknown_mode option = ::cli::unknown_mode::fail,
+ ::cli::unknown_mode argument = ::cli::unknown_mode::stop);
+
+ help_options (int start,
+ int& argc,
+ char** argv,
+ int& end,
+ bool erase = false,
+ ::cli::unknown_mode option = ::cli::unknown_mode::fail,
+ ::cli::unknown_mode argument = ::cli::unknown_mode::stop);
+
+ help_options (::cli::scanner&,
+ ::cli::unknown_mode option = ::cli::unknown_mode::fail,
+ ::cli::unknown_mode argument = ::cli::unknown_mode::stop);
+
+ // Option accessors.
+ //
+ const std::uint64_t&
+ build2_metadata () const;
+
+ bool
+ build2_metadata_specified () const;
+
+ const bool&
+ help () const;
+
+ const bool&
+ version () const;
+
+ const bool&
+ proprietary_license () const;
+
+ // Print usage information.
+ //
+ static ::cli::usage_para
+ print_usage (::std::wostream&,
+ ::cli::usage_para = ::cli::usage_para::none);
+
+ // Implementation details.
+ //
+ protected:
+ bool
+ _parse (const char*, ::cli::scanner&);
+
+ private:
+ bool
+ _parse (::cli::scanner&,
+ ::cli::unknown_mode option,
+ ::cli::unknown_mode argument);
+
+ public:
+ std::uint64_t build2_metadata_;
+ bool build2_metadata_specified_;
+ bool help_;
+ bool version_;
+ bool proprietary_license_;
+};
+
+class options
+{
+ public:
+ // Option accessors.
+ //
+ const NarrowStrings&
+ disable_warning () const;
+
+ bool
+ disable_warning_specified () const;
+
+ const std::string&
+ options_file () const;
+
+ bool
+ options_file_specified () const;
+
+ const bool&
+ show_sloc () const;
+
+ const std::size_t&
+ sloc_limit () const;
+
+ bool
+ sloc_limit_specified () const;
+
+ const bool&
+ proprietary_license () const;
+
+ const NarrowString&
+ custom_literals () const;
+
+ bool
+ custom_literals_specified () const;
+
+ const bool&
+ preserve_anonymous () const;
+
+ const bool&
+ show_anonymous () const;
+
+ const NarrowStrings&
+ anonymous_regex () const;
+
+ bool
+ anonymous_regex_specified () const;
+
+ const bool&
+ anonymous_regex_trace () const;
+
+ const bool&
+ morph_anonymous () const;
+
+ const NarrowStrings&
+ location_map () const;
+
+ bool
+ location_map_specified () const;
+
+ const NarrowStrings&
+ location_regex () const;
+
+ bool
+ location_regex_specified () const;
+
+ const bool&
+ location_regex_trace () const;
+
+ const bool&
+ file_per_type () const;
+
+ const NarrowStrings&
+ type_file_regex () const;
+
+ bool
+ type_file_regex_specified () const;
+
+ const bool&
+ type_file_regex_trace () const;
+
+ const NarrowStrings&
+ schema_file_regex () const;
+
+ bool
+ schema_file_regex_specified () const;
+
+ const bool&
+ schema_file_regex_trace () const;
+
+ const bool&
+ fat_type_file () const;
+
+ const NarrowString&
+ file_list () const;
+
+ bool
+ file_list_specified () const;
+
+ const bool&
+ file_list_only () const;
+
+ const NarrowString&
+ file_list_prologue () const;
+
+ bool
+ file_list_prologue_specified () const;
+
+ const NarrowString&
+ file_list_epilogue () const;
+
+ bool
+ file_list_epilogue_specified () const;
+
+ const NarrowString&
+ file_list_delim () const;
+
+ bool
+ file_list_delim_specified () const;
+
+ const bool&
+ disable_multi_import () const;
+
+ const bool&
+ disable_full_check () const;
+
+ // Print usage information.
+ //
+ static ::cli::usage_para
+ print_usage (::std::wostream&,
+ ::cli::usage_para = ::cli::usage_para::none);
+
+ // Implementation details.
+ //
+ protected:
+ options ();
+
+ bool
+ _parse (const char*, ::cli::scanner&);
+
+ public:
+ NarrowStrings disable_warning_;
+ bool disable_warning_specified_;
+ std::string options_file_;
+ bool options_file_specified_;
+ bool show_sloc_;
+ std::size_t sloc_limit_;
+ bool sloc_limit_specified_;
+ bool proprietary_license_;
+ NarrowString custom_literals_;
+ bool custom_literals_specified_;
+ bool preserve_anonymous_;
+ bool show_anonymous_;
+ NarrowStrings anonymous_regex_;
+ bool anonymous_regex_specified_;
+ bool anonymous_regex_trace_;
+ bool morph_anonymous_;
+ NarrowStrings location_map_;
+ bool location_map_specified_;
+ NarrowStrings location_regex_;
+ bool location_regex_specified_;
+ bool location_regex_trace_;
+ bool file_per_type_;
+ NarrowStrings type_file_regex_;
+ bool type_file_regex_specified_;
+ bool type_file_regex_trace_;
+ NarrowStrings schema_file_regex_;
+ bool schema_file_regex_specified_;
+ bool schema_file_regex_trace_;
+ 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_;
+ bool file_list_epilogue_specified_;
+ NarrowString file_list_delim_;
+ bool file_list_delim_specified_;
+ bool disable_multi_import_;
+ bool disable_full_check_;
+};
+
+#include <xsd/options.ixx>
+
+// Begin epilogue.
+//
+//
+// End epilogue.
+
+#endif // XSD_OPTIONS_HXX
diff --git a/xsd/xsd/pregenerated/xsd/options.ixx b/xsd/xsd/pregenerated/xsd/options.ixx
new file mode 100644
index 0000000..d87e59c
--- /dev/null
+++ b/xsd/xsd/pregenerated/xsd/options.ixx
@@ -0,0 +1,555 @@
+// -*- C++ -*-
+//
+// This file was generated by CLI, a command line interface
+// compiler for C++.
+//
+
+// Begin prologue.
+//
+//
+// End prologue.
+
+#include <cassert>
+
+namespace cli
+{
+ // usage_para
+ //
+ inline usage_para::
+ usage_para (value v)
+ : v_ (v)
+ {
+ }
+
+ // unknown_mode
+ //
+ inline unknown_mode::
+ unknown_mode (value v)
+ : v_ (v)
+ {
+ }
+
+ // exception
+ //
+ inline ::std::wostream&
+ operator<< (::std::wostream& os, const exception& e)
+ {
+ e.print (os);
+ return os;
+ }
+
+ // unknown_option
+ //
+ inline unknown_option::
+ unknown_option (const std::string& option)
+ : option_ (option)
+ {
+ }
+
+ inline const std::string& unknown_option::
+ option () const
+ {
+ return option_;
+ }
+
+ // unknown_argument
+ //
+ inline unknown_argument::
+ unknown_argument (const std::string& argument)
+ : argument_ (argument)
+ {
+ }
+
+ inline const std::string& unknown_argument::
+ argument () const
+ {
+ return argument_;
+ }
+
+ // missing_value
+ //
+ inline missing_value::
+ missing_value (const std::string& option)
+ : option_ (option)
+ {
+ }
+
+ inline const std::string& missing_value::
+ option () const
+ {
+ return option_;
+ }
+
+ // invalid_value
+ //
+ inline invalid_value::
+ invalid_value (const std::string& option,
+ const std::string& value,
+ const std::string& message)
+ : option_ (option),
+ value_ (value),
+ message_ (message)
+ {
+ }
+
+ inline const std::string& invalid_value::
+ option () const
+ {
+ return option_;
+ }
+
+ inline const std::string& invalid_value::
+ value () const
+ {
+ return value_;
+ }
+
+ inline const std::string& invalid_value::
+ message () const
+ {
+ return message_;
+ }
+
+ // file_io_failure
+ //
+ inline file_io_failure::
+ file_io_failure (const std::string& file)
+ : file_ (file)
+ {
+ }
+
+ inline const std::string& file_io_failure::
+ file () const
+ {
+ return file_;
+ }
+
+ // unmatched_quote
+ //
+ inline unmatched_quote::
+ unmatched_quote (const std::string& argument)
+ : argument_ (argument)
+ {
+ }
+
+ inline const std::string& unmatched_quote::
+ argument () const
+ {
+ return argument_;
+ }
+
+ // argv_scanner
+ //
+ inline argv_scanner::
+ argv_scanner (int& argc,
+ char** argv,
+ bool erase,
+ std::size_t sp)
+ : start_position_ (sp + 1),
+ i_ (1),
+ argc_ (argc),
+ argv_ (argv),
+ erase_ (erase)
+ {
+ }
+
+ inline argv_scanner::
+ argv_scanner (int start,
+ int& argc,
+ char** argv,
+ bool erase,
+ std::size_t sp)
+ : start_position_ (sp + static_cast<std::size_t> (start)),
+ i_ (start),
+ argc_ (argc),
+ argv_ (argv),
+ erase_ (erase)
+ {
+ }
+
+ inline int argv_scanner::
+ end () const
+ {
+ return i_;
+ }
+
+ // argv_file_scanner
+ //
+ inline argv_file_scanner::
+ argv_file_scanner (int& argc,
+ char** argv,
+ const std::string& option,
+ bool erase,
+ std::size_t sp)
+ : argv_scanner (argc, argv, erase, sp),
+ option_ (option),
+ options_ (&option_info_),
+ options_count_ (1),
+ i_ (1),
+ skip_ (false)
+ {
+ option_info_.option = option_.c_str ();
+ option_info_.search_func = 0;
+ }
+
+ inline argv_file_scanner::
+ argv_file_scanner (int start,
+ int& argc,
+ char** argv,
+ const std::string& option,
+ bool erase,
+ std::size_t sp)
+ : argv_scanner (start, argc, argv, erase, sp),
+ option_ (option),
+ options_ (&option_info_),
+ options_count_ (1),
+ i_ (1),
+ skip_ (false)
+ {
+ option_info_.option = option_.c_str ();
+ option_info_.search_func = 0;
+ }
+
+ inline argv_file_scanner::
+ argv_file_scanner (const std::string& file,
+ const std::string& option,
+ std::size_t sp)
+ : argv_scanner (0, zero_argc_, 0, sp),
+ option_ (option),
+ options_ (&option_info_),
+ options_count_ (1),
+ i_ (1),
+ skip_ (false)
+ {
+ option_info_.option = option_.c_str ();
+ option_info_.search_func = 0;
+
+ load (file);
+ }
+
+ inline argv_file_scanner::
+ argv_file_scanner (int& argc,
+ char** argv,
+ const option_info* options,
+ std::size_t options_count,
+ bool erase,
+ std::size_t sp)
+ : argv_scanner (argc, argv, erase, sp),
+ options_ (options),
+ options_count_ (options_count),
+ i_ (1),
+ skip_ (false)
+ {
+ }
+
+ inline argv_file_scanner::
+ argv_file_scanner (int start,
+ int& argc,
+ char** argv,
+ const option_info* options,
+ std::size_t options_count,
+ bool erase,
+ std::size_t sp)
+ : argv_scanner (start, argc, argv, erase, sp),
+ options_ (options),
+ options_count_ (options_count),
+ i_ (1),
+ skip_ (false)
+ {
+ }
+
+ inline argv_file_scanner::
+ argv_file_scanner (const std::string& file,
+ const option_info* options,
+ std::size_t options_count,
+ std::size_t sp)
+ : argv_scanner (0, zero_argc_, 0, sp),
+ options_ (options),
+ options_count_ (options_count),
+ i_ (1),
+ skip_ (false)
+ {
+ load (file);
+ }
+}
+
+// help_options
+//
+
+inline const std::uint64_t& help_options::
+build2_metadata () const
+{
+ return this->build2_metadata_;
+}
+
+inline bool help_options::
+build2_metadata_specified () const
+{
+ return this->build2_metadata_specified_;
+}
+
+inline const bool& help_options::
+help () const
+{
+ return this->help_;
+}
+
+inline const bool& help_options::
+version () const
+{
+ return this->version_;
+}
+
+inline const bool& help_options::
+proprietary_license () const
+{
+ return this->proprietary_license_;
+}
+
+// options
+//
+
+inline const NarrowStrings& options::
+disable_warning () const
+{
+ return this->disable_warning_;
+}
+
+inline bool options::
+disable_warning_specified () const
+{
+ return this->disable_warning_specified_;
+}
+
+inline const std::string& options::
+options_file () const
+{
+ return this->options_file_;
+}
+
+inline bool options::
+options_file_specified () const
+{
+ return this->options_file_specified_;
+}
+
+inline const bool& options::
+show_sloc () const
+{
+ return this->show_sloc_;
+}
+
+inline const std::size_t& options::
+sloc_limit () const
+{
+ return this->sloc_limit_;
+}
+
+inline bool options::
+sloc_limit_specified () const
+{
+ return this->sloc_limit_specified_;
+}
+
+inline const bool& options::
+proprietary_license () const
+{
+ return this->proprietary_license_;
+}
+
+inline const NarrowString& options::
+custom_literals () const
+{
+ return this->custom_literals_;
+}
+
+inline bool options::
+custom_literals_specified () const
+{
+ return this->custom_literals_specified_;
+}
+
+inline const bool& options::
+preserve_anonymous () const
+{
+ return this->preserve_anonymous_;
+}
+
+inline const bool& options::
+show_anonymous () const
+{
+ return this->show_anonymous_;
+}
+
+inline const NarrowStrings& options::
+anonymous_regex () const
+{
+ return this->anonymous_regex_;
+}
+
+inline bool options::
+anonymous_regex_specified () const
+{
+ return this->anonymous_regex_specified_;
+}
+
+inline const bool& options::
+anonymous_regex_trace () const
+{
+ return this->anonymous_regex_trace_;
+}
+
+inline const bool& options::
+morph_anonymous () const
+{
+ return this->morph_anonymous_;
+}
+
+inline const NarrowStrings& options::
+location_map () const
+{
+ return this->location_map_;
+}
+
+inline bool options::
+location_map_specified () const
+{
+ return this->location_map_specified_;
+}
+
+inline const NarrowStrings& options::
+location_regex () const
+{
+ return this->location_regex_;
+}
+
+inline bool options::
+location_regex_specified () const
+{
+ return this->location_regex_specified_;
+}
+
+inline const bool& options::
+location_regex_trace () const
+{
+ return this->location_regex_trace_;
+}
+
+inline const bool& options::
+file_per_type () const
+{
+ return this->file_per_type_;
+}
+
+inline const NarrowStrings& options::
+type_file_regex () const
+{
+ return this->type_file_regex_;
+}
+
+inline bool options::
+type_file_regex_specified () const
+{
+ return this->type_file_regex_specified_;
+}
+
+inline const bool& options::
+type_file_regex_trace () const
+{
+ return this->type_file_regex_trace_;
+}
+
+inline const NarrowStrings& options::
+schema_file_regex () const
+{
+ return this->schema_file_regex_;
+}
+
+inline bool options::
+schema_file_regex_specified () const
+{
+ return this->schema_file_regex_specified_;
+}
+
+inline const bool& options::
+schema_file_regex_trace () const
+{
+ return this->schema_file_regex_trace_;
+}
+
+inline const bool& options::
+fat_type_file () const
+{
+ return this->fat_type_file_;
+}
+
+inline const NarrowString& options::
+file_list () const
+{
+ return this->file_list_;
+}
+
+inline bool options::
+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
+{
+ return this->file_list_prologue_;
+}
+
+inline bool options::
+file_list_prologue_specified () const
+{
+ return this->file_list_prologue_specified_;
+}
+
+inline const NarrowString& options::
+file_list_epilogue () const
+{
+ return this->file_list_epilogue_;
+}
+
+inline bool options::
+file_list_epilogue_specified () const
+{
+ return this->file_list_epilogue_specified_;
+}
+
+inline const NarrowString& options::
+file_list_delim () const
+{
+ return this->file_list_delim_;
+}
+
+inline bool options::
+file_list_delim_specified () const
+{
+ return this->file_list_delim_specified_;
+}
+
+inline const bool& options::
+disable_multi_import () const
+{
+ return this->disable_multi_import_;
+}
+
+inline const bool& options::
+disable_full_check () const
+{
+ return this->disable_full_check_;
+}
+
+// Begin epilogue.
+//
+//
+// End epilogue.
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&)