aboutsummaryrefslogtreecommitdiff
path: root/libxsde/xsde/cxx/parser/validating
diff options
context:
space:
mode:
Diffstat (limited to 'libxsde/xsde/cxx/parser/validating')
-rw-r--r--libxsde/xsde/cxx/parser/validating/any-type.hxx43
-rw-r--r--libxsde/xsde/cxx/parser/validating/base64-binary.cxx281
-rw-r--r--libxsde/xsde/cxx/parser/validating/base64-binary.hxx58
-rw-r--r--libxsde/xsde/cxx/parser/validating/boolean.cxx93
-rw-r--r--libxsde/xsde/cxx/parser/validating/boolean.hxx54
-rw-r--r--libxsde/xsde/cxx/parser/validating/byte.cxx71
-rw-r--r--libxsde/xsde/cxx/parser/validating/byte.hxx52
-rw-r--r--libxsde/xsde/cxx/parser/validating/date-time.cxx259
-rw-r--r--libxsde/xsde/cxx/parser/validating/date-time.hxx53
-rw-r--r--libxsde/xsde/cxx/parser/validating/date.cxx182
-rw-r--r--libxsde/xsde/cxx/parser/validating/date.hxx51
-rw-r--r--libxsde/xsde/cxx/parser/validating/decimal.cxx74
-rw-r--r--libxsde/xsde/cxx/parser/validating/decimal.hxx50
-rw-r--r--libxsde/xsde/cxx/parser/validating/double.cxx99
-rw-r--r--libxsde/xsde/cxx/parser/validating/double.hxx50
-rw-r--r--libxsde/xsde/cxx/parser/validating/duration.cxx265
-rw-r--r--libxsde/xsde/cxx/parser/validating/duration.hxx51
-rw-r--r--libxsde/xsde/cxx/parser/validating/float.cxx118
-rw-r--r--libxsde/xsde/cxx/parser/validating/float.hxx50
-rw-r--r--libxsde/xsde/cxx/parser/validating/gday.cxx112
-rw-r--r--libxsde/xsde/cxx/parser/validating/gday.hxx50
-rw-r--r--libxsde/xsde/cxx/parser/validating/gmonth-day.cxx137
-rw-r--r--libxsde/xsde/cxx/parser/validating/gmonth-day.hxx50
-rw-r--r--libxsde/xsde/cxx/parser/validating/gmonth.cxx112
-rw-r--r--libxsde/xsde/cxx/parser/validating/gmonth.hxx50
-rw-r--r--libxsde/xsde/cxx/parser/validating/gyear-month.cxx161
-rw-r--r--libxsde/xsde/cxx/parser/validating/gyear-month.hxx51
-rw-r--r--libxsde/xsde/cxx/parser/validating/gyear.cxx138
-rw-r--r--libxsde/xsde/cxx/parser/validating/gyear.hxx50
-rw-r--r--libxsde/xsde/cxx/parser/validating/hex-binary.cxx172
-rw-r--r--libxsde/xsde/cxx/parser/validating/hex-binary.hxx58
-rw-r--r--libxsde/xsde/cxx/parser/validating/id-stl.cxx60
-rw-r--r--libxsde/xsde/cxx/parser/validating/id-stl.hxx47
-rw-r--r--libxsde/xsde/cxx/parser/validating/id.cxx80
-rw-r--r--libxsde/xsde/cxx/parser/validating/id.hxx47
-rw-r--r--libxsde/xsde/cxx/parser/validating/idref-stl.cxx60
-rw-r--r--libxsde/xsde/cxx/parser/validating/idref-stl.hxx47
-rw-r--r--libxsde/xsde/cxx/parser/validating/idref.cxx79
-rw-r--r--libxsde/xsde/cxx/parser/validating/idref.hxx47
-rw-r--r--libxsde/xsde/cxx/parser/validating/idrefs-stl.cxx133
-rw-r--r--libxsde/xsde/cxx/parser/validating/idrefs-stl.hxx57
-rw-r--r--libxsde/xsde/cxx/parser/validating/idrefs.cxx136
-rw-r--r--libxsde/xsde/cxx/parser/validating/idrefs.hxx57
-rw-r--r--libxsde/xsde/cxx/parser/validating/inheritance-map-load.hxx35
-rw-r--r--libxsde/xsde/cxx/parser/validating/inheritance-map.cxx111
-rw-r--r--libxsde/xsde/cxx/parser/validating/inheritance-map.hxx63
-rw-r--r--libxsde/xsde/cxx/parser/validating/inheritance-map.ixx34
-rw-r--r--libxsde/xsde/cxx/parser/validating/int.cxx75
-rw-r--r--libxsde/xsde/cxx/parser/validating/int.hxx52
-rw-r--r--libxsde/xsde/cxx/parser/validating/integer.cxx75
-rw-r--r--libxsde/xsde/cxx/parser/validating/integer.hxx53
-rw-r--r--libxsde/xsde/cxx/parser/validating/language-stl.cxx95
-rw-r--r--libxsde/xsde/cxx/parser/validating/language-stl.hxx47
-rw-r--r--libxsde/xsde/cxx/parser/validating/language.cxx114
-rw-r--r--libxsde/xsde/cxx/parser/validating/language.hxx47
-rw-r--r--libxsde/xsde/cxx/parser/validating/long-long.cxx75
-rw-r--r--libxsde/xsde/cxx/parser/validating/long-long.hxx52
-rw-r--r--libxsde/xsde/cxx/parser/validating/long.cxx75
-rw-r--r--libxsde/xsde/cxx/parser/validating/long.hxx52
-rw-r--r--libxsde/xsde/cxx/parser/validating/name-stl.cxx86
-rw-r--r--libxsde/xsde/cxx/parser/validating/name-stl.hxx47
-rw-r--r--libxsde/xsde/cxx/parser/validating/name.cxx105
-rw-r--r--libxsde/xsde/cxx/parser/validating/name.hxx47
-rw-r--r--libxsde/xsde/cxx/parser/validating/ncname-stl.cxx60
-rw-r--r--libxsde/xsde/cxx/parser/validating/ncname-stl.hxx47
-rw-r--r--libxsde/xsde/cxx/parser/validating/ncname.cxx79
-rw-r--r--libxsde/xsde/cxx/parser/validating/ncname.hxx47
-rw-r--r--libxsde/xsde/cxx/parser/validating/negative-integer.cxx71
-rw-r--r--libxsde/xsde/cxx/parser/validating/negative-integer.hxx53
-rw-r--r--libxsde/xsde/cxx/parser/validating/nmtoken-stl.cxx79
-rw-r--r--libxsde/xsde/cxx/parser/validating/nmtoken-stl.hxx47
-rw-r--r--libxsde/xsde/cxx/parser/validating/nmtoken.cxx98
-rw-r--r--libxsde/xsde/cxx/parser/validating/nmtoken.hxx47
-rw-r--r--libxsde/xsde/cxx/parser/validating/nmtokens-stl.cxx127
-rw-r--r--libxsde/xsde/cxx/parser/validating/nmtokens-stl.hxx57
-rw-r--r--libxsde/xsde/cxx/parser/validating/nmtokens.cxx132
-rw-r--r--libxsde/xsde/cxx/parser/validating/nmtokens.hxx57
-rw-r--r--libxsde/xsde/cxx/parser/validating/non-negative-integer.cxx66
-rw-r--r--libxsde/xsde/cxx/parser/validating/non-negative-integer.hxx54
-rw-r--r--libxsde/xsde/cxx/parser/validating/non-positive-integer.cxx71
-rw-r--r--libxsde/xsde/cxx/parser/validating/non-positive-integer.hxx54
-rw-r--r--libxsde/xsde/cxx/parser/validating/normalized-string-stl.cxx48
-rw-r--r--libxsde/xsde/cxx/parser/validating/normalized-string-stl.hxx44
-rw-r--r--libxsde/xsde/cxx/parser/validating/normalized-string.cxx60
-rw-r--r--libxsde/xsde/cxx/parser/validating/normalized-string.hxx44
-rw-r--r--libxsde/xsde/cxx/parser/validating/number.cxx133
-rw-r--r--libxsde/xsde/cxx/parser/validating/number.hxx37
-rw-r--r--libxsde/xsde/cxx/parser/validating/parser.cxx633
-rw-r--r--libxsde/xsde/cxx/parser/validating/parser.hxx304
-rw-r--r--libxsde/xsde/cxx/parser/validating/parser.ixx121
-rw-r--r--libxsde/xsde/cxx/parser/validating/positive-integer.cxx64
-rw-r--r--libxsde/xsde/cxx/parser/validating/positive-integer.hxx53
-rw-r--r--libxsde/xsde/cxx/parser/validating/qname-stl.cxx79
-rw-r--r--libxsde/xsde/cxx/parser/validating/qname-stl.hxx49
-rw-r--r--libxsde/xsde/cxx/parser/validating/qname.cxx180
-rw-r--r--libxsde/xsde/cxx/parser/validating/qname.hxx58
-rw-r--r--libxsde/xsde/cxx/parser/validating/short.cxx70
-rw-r--r--libxsde/xsde/cxx/parser/validating/short.hxx52
-rw-r--r--libxsde/xsde/cxx/parser/validating/string-stl.cxx38
-rw-r--r--libxsde/xsde/cxx/parser/validating/string-stl.hxx44
-rw-r--r--libxsde/xsde/cxx/parser/validating/string.cxx48
-rw-r--r--libxsde/xsde/cxx/parser/validating/string.hxx44
-rw-r--r--libxsde/xsde/cxx/parser/validating/time-zone.cxx79
-rw-r--r--libxsde/xsde/cxx/parser/validating/time-zone.hxx32
-rw-r--r--libxsde/xsde/cxx/parser/validating/time.cxx181
-rw-r--r--libxsde/xsde/cxx/parser/validating/time.hxx51
-rw-r--r--libxsde/xsde/cxx/parser/validating/token-stl.cxx73
-rw-r--r--libxsde/xsde/cxx/parser/validating/token-stl.hxx44
-rw-r--r--libxsde/xsde/cxx/parser/validating/token.cxx94
-rw-r--r--libxsde/xsde/cxx/parser/validating/token.hxx44
-rw-r--r--libxsde/xsde/cxx/parser/validating/unsigned-byte.cxx66
-rw-r--r--libxsde/xsde/cxx/parser/validating/unsigned-byte.hxx52
-rw-r--r--libxsde/xsde/cxx/parser/validating/unsigned-int.cxx66
-rw-r--r--libxsde/xsde/cxx/parser/validating/unsigned-int.hxx52
-rw-r--r--libxsde/xsde/cxx/parser/validating/unsigned-long-long.cxx64
-rw-r--r--libxsde/xsde/cxx/parser/validating/unsigned-long-long.hxx53
-rw-r--r--libxsde/xsde/cxx/parser/validating/unsigned-long.cxx64
-rw-r--r--libxsde/xsde/cxx/parser/validating/unsigned-long.hxx53
-rw-r--r--libxsde/xsde/cxx/parser/validating/unsigned-short.cxx66
-rw-r--r--libxsde/xsde/cxx/parser/validating/unsigned-short.hxx52
-rw-r--r--libxsde/xsde/cxx/parser/validating/uri-stl.cxx53
-rw-r--r--libxsde/xsde/cxx/parser/validating/uri-stl.hxx44
-rw-r--r--libxsde/xsde/cxx/parser/validating/uri.cxx71
-rw-r--r--libxsde/xsde/cxx/parser/validating/uri.hxx44
-rw-r--r--libxsde/xsde/cxx/parser/validating/xml-schema-pimpl.hxx82
-rw-r--r--libxsde/xsde/cxx/parser/validating/xml-schema-pskel.cxx617
-rw-r--r--libxsde/xsde/cxx/parser/validating/xml-schema-pskel.hxx1385
-rw-r--r--libxsde/xsde/cxx/parser/validating/xml-schema-pskel.ixx704
128 files changed, 12920 insertions, 0 deletions
diff --git a/libxsde/xsde/cxx/parser/validating/any-type.hxx b/libxsde/xsde/cxx/parser/validating/any-type.hxx
new file mode 100644
index 0000000..6f183d4
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/any-type.hxx
@@ -0,0 +1,43 @@
+// file : xsde/cxx/parser/validating/any-type.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_ANY_TYPE_HXX
+#define XSDE_CXX_PARSER_VALIDATING_ANY_TYPE_HXX
+
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ // any_type
+ //
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct any_type_pimpl: virtual any_type_pskel
+#else
+ struct any_type_pimpl: any_type_pskel
+#endif
+ {
+ };
+
+ // any_simple_type
+ //
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct any_simple_type_pimpl: virtual any_simple_type_pskel
+#else
+ struct any_simple_type_pimpl: any_simple_type_pskel
+#endif
+ {
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_ANY_TYPE_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/base64-binary.cxx b/libxsde/xsde/cxx/parser/validating/base64-binary.cxx
new file mode 100644
index 0000000..994c14b
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/base64-binary.cxx
@@ -0,0 +1,281 @@
+// file : xsde/cxx/parser/validating/base64-binary.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <xsde/cxx/config.hxx>
+
+#include <xsde/cxx/parser/validating/base64-binary.hxx>
+
+static unsigned char
+base64_decode (char c)
+{
+ unsigned char r = 0xFF;
+
+ if (c >= 'A' && c <= 'Z')
+ r = static_cast<unsigned char> (c - 'A');
+ else if (c >= 'a' && c <= 'z')
+ r = static_cast<unsigned char> (c - 'a' + 26);
+ else if (c >= '0' && c <= '9')
+ r = static_cast<unsigned char> (c - '0' + 52);
+ else if (c == '+')
+ r = 62;
+ else if (c == '/')
+ r = 63;
+
+ return r;
+}
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ base64_binary_pimpl::
+ ~base64_binary_pimpl ()
+ {
+ if (!base_)
+ delete buf_;
+ }
+
+ void base64_binary_pimpl::
+ _reset ()
+ {
+ base64_binary_pskel::_reset ();
+
+ if (!base_)
+ {
+ delete buf_;
+ buf_ = 0;
+ }
+ }
+
+ base64_binary_pimpl::
+ base64_binary_pimpl (bool base)
+ : base_ (base), buf_ (0)
+ {
+ }
+
+ void base64_binary_pimpl::
+ pre_impl (buffer* b)
+ {
+ buf_ = b;
+ }
+
+ void base64_binary_pimpl::
+ _pre ()
+ {
+ if (buf_ == 0)
+ {
+ buf_ = new buffer ();
+
+#ifndef XSDE_EXCEPTIONS
+ if (buf_ == 0)
+ {
+ _sys_error (sys_error::no_memory);
+ return;
+ }
+#endif
+ }
+
+#ifdef XSDE_EXCEPTIONS
+ str_.assign ("", 0);
+#else
+ if (str_.assign ("", 0))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+
+ void base64_binary_pimpl::
+ _characters (const ro_string& s)
+ {
+ if (str_.size () == 0)
+ {
+ ro_string tmp (s.data (), s.size ());
+
+ if (trim_left (tmp) != 0)
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.append (tmp.data (), tmp.size ());
+#else
+ if (str_.append (tmp.data (), tmp.size ()))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+ }
+ else
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.append (s.data (), s.size ());
+#else
+ if (str_.append (s.data (), s.size ()))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+ }
+
+ void base64_binary_pimpl::
+ _post ()
+ {
+ typedef string::size_type size_type;
+
+ size_type size = str_.size ();
+ const char* src = str_.data ();
+
+ // Remove all whitespaces.
+ //
+ {
+ size_type j = 0;
+ bool subs = false;
+
+ for (size_type i = 0; i < size; ++i)
+ {
+ char c = str_[i];
+
+ if (c == 0x20 || c == 0x0A || c == 0x0D || c == 0x09)
+ {
+ subs = true;
+ }
+ else
+ {
+ if (subs)
+ subs = false;
+
+ str_[j++] = c;
+ }
+ }
+
+ size = j;
+ str_.truncate (size);
+ }
+
+ // Our length should be a multiple of four.
+ //
+ if (size == 0 || size % 4 != 0)
+ {
+ _schema_error (schema_error::invalid_base64_binary_value);
+ return;
+ }
+
+ size_type quad_count = size / 4;
+ size_type capacity = quad_count * 3 + 1;
+
+#ifdef XSDE_EXCEPTIONS
+ buf_->size (capacity);
+#else
+ if (buf_->size (capacity))
+ {
+ _sys_error (sys_error::no_memory);
+ return;
+ }
+#endif
+ char* dst = buf_->data ();
+
+ // Source and destination indexes.
+ //
+ size_type si = 0;
+ size_type di = 0;
+
+ // Process all quads except the last one.
+ //
+ unsigned char b1, b2, b3, b4;
+
+ for (size_type q = 0; q < quad_count - 1; ++q)
+ {
+ b1 = base64_decode (src[si++]);
+ b2 = base64_decode (src[si++]);
+ b3 = base64_decode (src[si++]);
+ b4 = base64_decode (src[si++]);
+
+ if (b1 == 0xFF || b2 == 0xFF || b3 == 0xFF || b4 == 0xFF)
+ {
+ _schema_error (schema_error::invalid_base64_binary_value);
+ return;
+ }
+
+ dst[di++] = (b1 << 2) | (b2 >> 4);
+ dst[di++] = (b2 << 4) | (b3 >> 2);
+ dst[di++] = (b3 << 6) | b4;
+ }
+
+ // Process the last quad. The first two octets are always there.
+ //
+ b1 = base64_decode (src[si++]);
+ b2 = base64_decode (src[si++]);
+
+ if (b1 == 0xFF || b2 == 0xFF)
+ {
+ _schema_error (schema_error::invalid_base64_binary_value);
+ return;
+ }
+
+ char e3 = src[si++];
+ char e4 = src[si++];
+
+ if (e4 == '=')
+ {
+ if (e3 == '=')
+ {
+ // Two pads. Last 4 bits in b2 should be zero.
+ //
+ if ((b2 & 0x0F) != 0)
+ {
+ _schema_error (schema_error::invalid_base64_binary_value);
+ return;
+ }
+
+ dst[di++] = (b1 << 2) | (b2 >> 4);
+ }
+ else
+ {
+ // One pad. Last 2 bits in b3 should be zero.
+ //
+ b3 = base64_decode (e3);
+
+ if (b3 == 0xFF || (b3 & 0x03) != 0)
+ {
+ _schema_error (schema_error::invalid_base64_binary_value);
+ return;
+ }
+
+ dst[di++] = (b1 << 2) | (b2 >> 4);
+ dst[di++] = (b2 << 4) | (b3 >> 2);
+ }
+ }
+ else
+ {
+ // No pads.
+ //
+ b3 = base64_decode (e3);
+ b4 = base64_decode (e4);
+
+ if (b3 == 0xFF || b4 == 0xFF)
+ {
+ _schema_error (schema_error::invalid_base64_binary_value);
+ return;
+ }
+
+ dst[di++] = (b1 << 2) | (b2 >> 4);
+ dst[di++] = (b2 << 4) | (b3 >> 2);
+ dst[di++] = (b3 << 6) | b4;
+ }
+
+ // Set the real size.
+ //
+ buf_->size (di);
+ }
+
+ buffer* base64_binary_pimpl::
+ post_base64_binary ()
+ {
+ buffer* r = buf_;
+ buf_ = 0;
+ return r;
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/base64-binary.hxx b/libxsde/xsde/cxx/parser/validating/base64-binary.hxx
new file mode 100644
index 0000000..656bf9b
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/base64-binary.hxx
@@ -0,0 +1,58 @@
+// file : xsde/cxx/parser/validating/base64-binary.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_BASE64_BINARY_HXX
+#define XSDE_CXX_PARSER_VALIDATING_BASE64_BINARY_HXX
+
+#include <xsde/cxx/string.hxx>
+
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct base64_binary_pimpl: virtual base64_binary_pskel
+#else
+ struct base64_binary_pimpl: base64_binary_pskel
+#endif
+ {
+ ~base64_binary_pimpl ();
+ base64_binary_pimpl (bool base = false);
+
+ void
+ pre_impl (buffer*);
+
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual buffer*
+ post_base64_binary ();
+
+ virtual void
+ _reset ();
+
+ protected:
+ bool base_;
+ string str_;
+ buffer* buf_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_BASE64_BINARY_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/boolean.cxx b/libxsde/xsde/cxx/parser/validating/boolean.cxx
new file mode 100644
index 0000000..80d88f8
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/boolean.cxx
@@ -0,0 +1,93 @@
+// file : xsde/cxx/parser/validating/boolean.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <xsde/cxx/parser/validating/boolean.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void boolean_pimpl::
+ _pre ()
+ {
+ size_ = 0;
+ state_ = leading_ws;
+ }
+
+ void boolean_pimpl::
+ _characters (const ro_string& s)
+ {
+ ro_string tmp (s.data (), s.size ());
+
+ size_t size = tmp.size ();
+
+ switch (state_)
+ {
+ case leading_ws:
+ {
+ size = trim_left (tmp);
+
+ if (size != 0)
+ state_ = literal;
+ else
+ break;
+ // Fall through.
+ }
+ case literal:
+ {
+ // If this chunk is too long then it has to be the last so trim
+ // trailing ws.
+ //
+ if ((5 - size_) < size)
+ {
+ size = trim_right (tmp);
+ state_ = trailing_ws; // It either had ws or is too large.
+ }
+
+ if ((5 - size_) >= size)
+ {
+ memcpy (str_ + size_, tmp.data (), size);
+ size_ += size;
+ }
+ else
+ _schema_error (schema_error::invalid_boolean_value);
+
+ break;
+ }
+ case trailing_ws:
+ {
+ if (trim_left (tmp) != 0)
+ _schema_error (schema_error::invalid_boolean_value);
+ }
+ }
+ }
+
+ void boolean_pimpl::
+ _post ()
+ {
+ ro_string tmp (str_, size_);
+ trim_right (tmp);
+
+ if (tmp == "1" || tmp == "true")
+ value_ = true;
+ else if (tmp == "0" || tmp == "false")
+ value_ = false;
+ else
+ _schema_error (schema_error::invalid_boolean_value);
+ }
+
+ bool boolean_pimpl::
+ post_boolean ()
+ {
+ return value_;
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/boolean.hxx b/libxsde/xsde/cxx/parser/validating/boolean.hxx
new file mode 100644
index 0000000..81c1e29
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/boolean.hxx
@@ -0,0 +1,54 @@
+// file : xsde/cxx/parser/validating/boolean.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_BOOLEAN_HXX
+#define XSDE_CXX_PARSER_VALIDATING_BOOLEAN_HXX
+
+#include <stddef.h> // size_t
+
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct boolean_pimpl: virtual boolean_pskel
+#else
+ struct boolean_pimpl: boolean_pskel
+#endif
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual bool
+ post_boolean ();
+
+ protected:
+ // We only need strlen("false") + 1 characters to hold all valid
+ // and trimmed string representations of boolean.
+ //
+ char str_[6];
+ size_t size_;
+ enum { leading_ws, literal, trailing_ws } state_;
+
+ bool value_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_BOOLEAN_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/byte.cxx b/libxsde/xsde/cxx/parser/validating/byte.cxx
new file mode 100644
index 0000000..a18c26a
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/byte.cxx
@@ -0,0 +1,71 @@
+// file : xsde/cxx/parser/validating/byte.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <stdlib.h> // strtoul
+
+#include <xsde/cxx/parser/validating/byte.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void byte_pimpl::
+ _pre ()
+ {
+ size_ = 0;
+ sign_ = none;
+ state_ = leading_ws;
+ }
+
+ void byte_pimpl::
+ _characters (const ro_string& s)
+ {
+ if (!parse (s, str_, 4))
+ _schema_error (schema_error::invalid_byte_value);
+ }
+
+ void byte_pimpl::
+ _post ()
+ {
+ ro_string tmp (str_, size_);
+ size_t size = trim_right (tmp);
+
+ if (size != 0 && tmp[0] != '-' && tmp[0] != '+')
+ {
+ str_[size] = '\0';
+
+ // No need to check errno since our string representation
+ // can never overflow an unsigned long.
+ //
+ char* p;
+ unsigned long ul = strtoul (str_, &p, 10);
+
+ bool neg = (sign_ == minus);
+
+ if (*p != '\0' || (neg && ul > 128) || (!neg && ul > 127))
+ _schema_error (schema_error::invalid_byte_value);
+
+ value_ = neg
+ ? static_cast<signed char> (-static_cast<short> (ul))
+ : static_cast<signed char> (ul);
+ }
+ else
+ _schema_error (schema_error::invalid_byte_value);
+ }
+
+ signed char byte_pimpl::
+ post_byte ()
+ {
+ return value_;
+ }
+ }
+ }
+ }
+}
+
diff --git a/libxsde/xsde/cxx/parser/validating/byte.hxx b/libxsde/xsde/cxx/parser/validating/byte.hxx
new file mode 100644
index 0000000..6a3abce
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/byte.hxx
@@ -0,0 +1,52 @@
+// file : xsde/cxx/parser/validating/byte.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_BYTE_HXX
+#define XSDE_CXX_PARSER_VALIDATING_BYTE_HXX
+
+#include <xsde/cxx/parser/validating/number.hxx>
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ // 8-bit signed integer
+ //
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct byte_pimpl: virtual byte_pskel, number
+#else
+ struct byte_pimpl: byte_pskel, number
+#endif
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual signed char
+ post_byte ();
+
+ protected:
+ // We only need strlen("0128") + 1 characters to hold all valid
+ // and trimmed string representations of signed byte.
+ //
+ char str_[5];
+ signed char value_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_BYTE_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/date-time.cxx b/libxsde/xsde/cxx/parser/validating/date-time.cxx
new file mode 100644
index 0000000..32f33a7
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/date-time.cxx
@@ -0,0 +1,259 @@
+// file : xsde/cxx/parser/validating/date-time.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <stdlib.h> // strtoul, strtod
+
+#include <xsde/cxx/config.hxx>
+#include <xsde/cxx/errno.hxx>
+
+#include <xsde/cxx/parser/validating/date-time.hxx>
+#include <xsde/cxx/parser/validating/time-zone.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void date_time_pimpl::
+ _pre ()
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.assign ("", 0);
+#else
+ if (str_.assign ("", 0))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+
+ void date_time_pimpl::
+ _characters (const ro_string& s)
+ {
+ if (str_.size () == 0)
+ {
+ ro_string tmp (s.data (), s.size ());
+
+ if (trim_left (tmp) != 0)
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.append (tmp.data (), tmp.size ());
+#else
+ if (str_.append (tmp.data (), tmp.size ()))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+ }
+ else
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.append (s.data (), s.size ());
+#else
+ if (str_.append (s.data (), s.size ()))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+ }
+
+ void date_time_pimpl::
+ _post ()
+ {
+ char* s = str_.data ();
+ ro_string tmp (s, str_.size ());
+ ro_string::size_type n = trim_right (tmp);
+
+ // date_time := [-]CCYY[N]*-MM-DDTHH:MM:SS[.S+][Z|(+|-)HH:MM]
+ //
+
+ if (n < 19 || (s[0] == '-' && n < 20))
+ {
+ _schema_error (schema_error::invalid_date_time_value);
+ return;
+ }
+
+ // Find the end of the year token.
+ //
+ ro_string::size_type yp = tmp.find ('-', s[0] == '-' ? 5 : 4);
+
+ if (yp == ro_string::npos || (n - yp - 1) < 14
+ || s[yp + 3] != '-' || s[yp + 6] != 'T'
+ || s[yp + 9] != ':' || s[yp + 12] != ':')
+ {
+ _schema_error (schema_error::invalid_date_time_value);
+ return;
+ }
+
+ // Find the end of the seconds fragment.
+ //
+ ro_string::size_type sp = yp + 15;
+ for (; sp < n; ++sp)
+ {
+ char c = s[sp];
+
+ if (c == 'Z' || c == '+' || c == '-')
+ break;
+ }
+
+ // At least one digit should follow the fraction point.
+ //
+ if ((sp - yp - 13) == 3)
+ {
+ _schema_error (schema_error::invalid_date_time_value);
+ return;
+ }
+
+ // Parse it backwards so that we can truncate and reuse
+ // the string.
+ //
+
+ // zone
+ //
+ if (sp < n)
+ {
+ if (!bits::parse_time_zone (s + sp, n - sp, zh_, zm_))
+ {
+ _schema_error (schema_error::invalid_date_time_value);
+ return;
+ }
+
+ z_ = true;
+ }
+ else
+ z_ = false;
+
+ // seconds
+ //
+ str_.truncate (sp);
+
+ char* p;
+ set_errno (0);
+ seconds_ = strtod (s + yp + 13, &p);
+
+ if (*p != '\0' || get_errno () != 0 || seconds_ >= 60.0)
+ {
+ _schema_error (schema_error::invalid_date_time_value);
+ return;
+ }
+
+ // minutes
+ //
+ char d1 = s[yp + 10];
+ char d2 = s[yp + 11];
+
+ if (d1 < '0' || d1 > '9' || d2 < '0' || d2 > '9')
+ {
+ _schema_error (schema_error::invalid_date_time_value);
+ return;
+ }
+
+ minutes_ = 10 * (d1 - '0') + (d2 - '0');
+
+ if (minutes_ > 59)
+ {
+ _schema_error (schema_error::invalid_date_time_value);
+ return;
+ }
+
+ // hours
+ //
+ d1 = s[yp + 7];
+ d2 = s[yp + 8];
+
+ if (d1 < '0' || d1 > '9' || d2 < '0' || d2 > '9')
+ {
+ _schema_error (schema_error::invalid_date_time_value);
+ return;
+ }
+
+ hours_ = 10 * (d1 - '0') + (d2 - '0');
+
+ if (hours_ > 24)
+ {
+ _schema_error (schema_error::invalid_date_time_value);
+ return;
+ }
+
+ if (hours_ == 24 && (minutes_ != 0 || seconds_ != 0.0))
+ {
+ _schema_error (schema_error::invalid_date_time_value);
+ return;
+ }
+
+ // day
+ //
+ d1 = s[yp + 4];
+ d2 = s[yp + 5];
+
+ if (d1 < '0' || d1 > '9' || d2 < '0' || d2 > '9')
+ {
+ _schema_error (schema_error::invalid_date_time_value);
+ return;
+ }
+
+ day_ = 10 * (d1 - '0') + (d2 - '0');
+
+ if (day_ < 1 || day_ > 31)
+ {
+ _schema_error (schema_error::invalid_date_time_value);
+ return;
+ }
+
+ // month
+ //
+ d1 = s[yp + 1];
+ d2 = s[yp + 2];
+
+ if (d1 < '0' || d1 > '9' || d2 < '0' || d2 > '9')
+ {
+ _schema_error (schema_error::invalid_date_time_value);
+ return;
+ }
+
+ month_ = 10 * (d1 - '0') + (d2 - '0');
+
+ if (month_ < 1 || month_ > 12)
+ {
+ _schema_error (schema_error::invalid_date_time_value);
+ return;
+ }
+
+ // year
+ //
+ str_.truncate (yp);
+
+ set_errno (0);
+ bool neg = (s[0] == '-');
+ unsigned long ul = strtoul (neg ? s + 1 : s, &p, 10);
+
+ if (*p != '\0' ||
+ get_errno () != 0 ||
+ (neg && ul > 2147483648UL) ||
+ (!neg && ul > 2147483647UL) ||
+ ul == 0)
+ {
+ _schema_error (schema_error::invalid_date_time_value);
+ return;
+ }
+
+ year_ = neg
+ ? (ul == 2147483648UL
+ ? (-2147483647 - 1)
+ : -static_cast<int> (ul))
+ : static_cast<int> (ul);
+ }
+
+ date_time date_time_pimpl::
+ post_date_time ()
+ {
+ return z_
+ ? date_time (year_, month_, day_, hours_,
+ minutes_, seconds_, zh_, zm_)
+ : date_time (year_, month_, day_, hours_, minutes_, seconds_);
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/date-time.hxx b/libxsde/xsde/cxx/parser/validating/date-time.hxx
new file mode 100644
index 0000000..dcbbaa9
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/date-time.hxx
@@ -0,0 +1,53 @@
+// file : xsde/cxx/parser/validating/date-time.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_DATE_TIME_HXX
+#define XSDE_CXX_PARSER_VALIDATING_DATE_TIME_HXX
+
+#include <xsde/cxx/string.hxx>
+
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct date_time_pimpl: virtual date_time_pskel
+#else
+ struct date_time_pimpl: date_time_pskel
+#endif
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual date_time
+ post_date_time ();
+
+ protected:
+ string str_;
+ int year_;
+ unsigned short month_, day_;
+ unsigned short hours_, minutes_;
+ double seconds_;
+ bool z_;
+ short zh_, zm_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_DATE_TIME_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/date.cxx b/libxsde/xsde/cxx/parser/validating/date.cxx
new file mode 100644
index 0000000..9efc52f
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/date.cxx
@@ -0,0 +1,182 @@
+// file : xsde/cxx/parser/validating/date.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <stdlib.h> // strtoul
+
+#include <xsde/cxx/config.hxx>
+#include <xsde/cxx/errno.hxx>
+
+#include <xsde/cxx/parser/validating/date.hxx>
+#include <xsde/cxx/parser/validating/time-zone.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void date_pimpl::
+ _pre ()
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.assign ("", 0);
+#else
+ if (str_.assign ("", 0))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+
+ void date_pimpl::
+ _characters (const ro_string& s)
+ {
+ if (str_.size () == 0)
+ {
+ ro_string tmp (s.data (), s.size ());
+
+ if (trim_left (tmp) != 0)
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.append (tmp.data (), tmp.size ());
+#else
+ if (str_.append (tmp.data (), tmp.size ()))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+ }
+ else
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.append (s.data (), s.size ());
+#else
+ if (str_.append (s.data (), s.size ()))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+ }
+
+ void date_pimpl::
+ _post ()
+ {
+ char* s = str_.data ();
+ ro_string tmp (s, str_.size ());
+ ro_string::size_type n = trim_right (tmp);
+
+ // date := [-]CCYY[N]*-MM-DD[Z|(+|-)HH:MM]
+ //
+
+ if (n < 10 || (s[0] == '-' && n < 11))
+ {
+ _schema_error (schema_error::invalid_date_value);
+ return;
+ }
+
+ // Find the end of the year token.
+ //
+ ro_string::size_type pos = tmp.find ('-', s[0] == '-' ? 5 : 4);
+
+ if (pos == ro_string::npos ||
+ (n - pos - 1) < 5 ||
+ s[pos + 3] != '-')
+ {
+ _schema_error (schema_error::invalid_date_value);
+ return;
+ }
+
+ // Parse the month, day values and time zone first so that we
+ // can truncate and reuse the string.
+ //
+
+ // month
+ //
+ char d1 = s[pos + 1];
+ char d2 = s[pos + 2];
+
+ if (d1 < '0' || d1 > '9' || d2 < '0' || d2 > '9')
+ {
+ _schema_error (schema_error::invalid_date_value);
+ return;
+ }
+
+ month_ = 10 * (d1 - '0') + (d2 - '0');
+
+ if (month_ < 1 || month_ > 12)
+ {
+ _schema_error (schema_error::invalid_date_value);
+ return;
+ }
+
+ // day
+ //
+ d1 = s[pos + 4];
+ d2 = s[pos + 5];
+
+ if (d1 < '0' || d1 > '9' || d2 < '0' || d2 > '9')
+ {
+ _schema_error (schema_error::invalid_date_value);
+ return;
+ }
+
+ day_ = 10 * (d1 - '0') + (d2 - '0');
+
+ if (day_ < 1 || day_ > 31)
+ {
+ _schema_error (schema_error::invalid_date_value);
+ return;
+ }
+
+ // zone
+ //
+ if ((pos + 6) < n)
+ {
+ if (!bits::parse_time_zone (s + pos + 6, n - pos - 6, zh_, zm_))
+ {
+ _schema_error (schema_error::invalid_date_value);
+ return;
+ }
+
+ z_ = true;
+ }
+ else
+ z_ = false;
+
+ // year
+ //
+ str_.truncate (pos);
+
+ char* p;
+ set_errno (0);
+ bool neg = (s[0] == '-');
+ unsigned long ul = strtoul (neg ? s + 1 : s, &p, 10);
+
+ if (*p != '\0' ||
+ get_errno () != 0 ||
+ (neg && ul > 2147483648UL) ||
+ (!neg && ul > 2147483647UL) ||
+ ul == 0)
+ {
+ _schema_error (schema_error::invalid_date_value);
+ return;
+ }
+
+ year_ = neg
+ ? (ul == 2147483648UL
+ ? (-2147483647 - 1)
+ : -static_cast<int> (ul))
+ : static_cast<int> (ul);
+ }
+
+ date date_pimpl::
+ post_date ()
+ {
+ return z_
+ ? date (year_, month_, day_, zh_, zm_)
+ : date (year_, month_, day_);
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/date.hxx b/libxsde/xsde/cxx/parser/validating/date.hxx
new file mode 100644
index 0000000..feb4738
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/date.hxx
@@ -0,0 +1,51 @@
+// file : xsde/cxx/parser/validating/date.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_DATE_HXX
+#define XSDE_CXX_PARSER_VALIDATING_DATE_HXX
+
+#include <xsde/cxx/string.hxx>
+
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct date_pimpl: virtual date_pskel
+#else
+ struct date_pimpl: date_pskel
+#endif
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual date
+ post_date ();
+
+ protected:
+ string str_;
+ int year_;
+ unsigned short month_, day_;
+ bool z_;
+ short zh_, zm_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_DATE_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/decimal.cxx b/libxsde/xsde/cxx/parser/validating/decimal.cxx
new file mode 100644
index 0000000..15aa4e9
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/decimal.cxx
@@ -0,0 +1,74 @@
+// file : xsde/cxx/parser/validating/decimal.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <stdlib.h> // strtod
+
+#include <xsde/cxx/errno.hxx>
+
+#include <xsde/cxx/parser/validating/decimal.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void decimal_pimpl::
+ _pre ()
+ {
+ size_ = 0;
+ sign_ = none;
+ state_ = leading_ws;
+ }
+
+ void decimal_pimpl::
+ _characters (const ro_string& s)
+ {
+ if (!parse (s, str_, 127))
+ _schema_error (schema_error::invalid_decimal_value);
+ }
+
+ void decimal_pimpl::
+ _post ()
+ {
+ ro_string tmp (str_, size_);
+ size_t size = trim_right (tmp);
+
+ if (size != 0 && tmp[0] != '-' && tmp[0] != '+')
+ {
+ str_[size] = '\0';
+
+ if (tmp == "INF" || tmp == "NaN" || tmp == "NAN")
+ {
+ _schema_error (schema_error::invalid_decimal_value);
+ }
+ else
+ {
+ char* p;
+ set_errno (0);
+ value_ = strtod (str_, &p);
+
+ if (*p != '\0' || get_errno () != 0)
+ _schema_error (schema_error::invalid_decimal_value);
+
+ if (sign_ == minus)
+ value_ = -value_;
+ }
+ }
+ else
+ _schema_error (schema_error::invalid_decimal_value);
+ }
+
+ double decimal_pimpl::
+ post_decimal ()
+ {
+ return value_;
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/decimal.hxx b/libxsde/xsde/cxx/parser/validating/decimal.hxx
new file mode 100644
index 0000000..0669ce6
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/decimal.hxx
@@ -0,0 +1,50 @@
+// file : xsde/cxx/parser/validating/decimal.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_DECIMAL_HXX
+#define XSDE_CXX_PARSER_VALIDATING_DECIMAL_HXX
+
+#include <xsde/cxx/parser/validating/number.hxx>
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct decimal_pimpl: virtual decimal_pskel, number
+#else
+ struct decimal_pimpl: decimal_pskel, number
+#endif
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual double
+ post_decimal ();
+
+ protected:
+ // Assume decimal values (without leading and trailing whitespaces)
+ // cannot be longer than 127 characters.
+ //
+ char str_[128];
+ double value_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_DECIMAL_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/double.cxx b/libxsde/xsde/cxx/parser/validating/double.cxx
new file mode 100644
index 0000000..947f983
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/double.cxx
@@ -0,0 +1,99 @@
+// file : xsde/cxx/parser/validating/double.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <stdlib.h> // strtod
+
+#include <xsde/cxx/errno.hxx>
+
+#include <xsde/cxx/parser/validating/double.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void double_pimpl::
+ _pre ()
+ {
+ size_ = 0;
+ sign_ = none;
+ state_ = leading_ws;
+ }
+
+ void double_pimpl::
+ _characters (const ro_string& s)
+ {
+ if (!parse (s, str_, 127))
+ _schema_error (schema_error::invalid_double_value);
+ }
+
+ void double_pimpl::
+ _post ()
+ {
+ ro_string tmp (str_, size_);
+ size_t size = trim_right (tmp);
+
+ if (size != 0 && tmp[0] != '-' && tmp[0] != '+')
+ {
+ str_[size] = '\0';
+
+ if (tmp == "INF")
+ {
+ switch (sign_)
+ {
+ case none:
+ {
+ value_ = strtod ("INF", 0);
+ break;
+ }
+ case plus:
+ {
+ _schema_error (schema_error::invalid_double_value);
+ break;
+ }
+ case minus:
+ {
+ value_ = strtod ("-INF", 0);
+ break;
+ }
+ }
+ }
+ else if (tmp == "NaN")
+ {
+ if (sign_ == none)
+ value_ = strtod ("NAN", 0);
+ else
+ _schema_error (schema_error::invalid_double_value);
+
+ }
+ else
+ {
+ char* p;
+ set_errno (0);
+ value_ = strtod (str_, &p);
+
+ if (*p != '\0' || get_errno () != 0)
+ _schema_error (schema_error::invalid_double_value);
+
+ if (sign_ == minus)
+ value_ = -value_;
+ }
+ }
+ else
+ _schema_error (schema_error::invalid_double_value);
+ }
+
+ double double_pimpl::
+ post_double ()
+ {
+ return value_;
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/double.hxx b/libxsde/xsde/cxx/parser/validating/double.hxx
new file mode 100644
index 0000000..afae038
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/double.hxx
@@ -0,0 +1,50 @@
+// file : xsde/cxx/parser/validating/double.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_DOUBLE_HXX
+#define XSDE_CXX_PARSER_VALIDATING_DOUBLE_HXX
+
+#include <xsde/cxx/parser/validating/number.hxx>
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct double_pimpl: virtual double_pskel, number
+#else
+ struct double_pimpl: double_pskel, number
+#endif
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual double
+ post_double ();
+
+ protected:
+ // Assume double values (without leading and trailing whitespaces)
+ // cannot be longer than 127 characters.
+ //
+ char str_[128];
+ double value_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_DOUBLE_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/duration.cxx b/libxsde/xsde/cxx/parser/validating/duration.cxx
new file mode 100644
index 0000000..9d72609
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/duration.cxx
@@ -0,0 +1,265 @@
+// file : xsde/cxx/parser/validating/duration.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <stdlib.h> // strtoul, strtod
+
+#include <xsde/cxx/config.hxx>
+#include <xsde/cxx/errno.hxx>
+
+#include <xsde/cxx/parser/validating/duration.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void duration_pimpl::
+ _pre ()
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.assign ("", 0);
+#else
+ if (str_.assign ("", 0))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+
+ void duration_pimpl::
+ _characters (const ro_string& s)
+ {
+ if (str_.size () == 0)
+ {
+ ro_string tmp (s.data (), s.size ());
+
+ if (trim_left (tmp) != 0)
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.append (tmp.data (), tmp.size ());
+#else
+ if (str_.append (tmp.data (), tmp.size ()))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+ }
+ else
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.append (s.data (), s.size ());
+#else
+ if (str_.append (s.data (), s.size ()))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+ }
+
+ static ro_string::size_type
+ rfind_delim (const char* s, ro_string::size_type pos)
+ {
+ const char* p = s + pos;
+ for (; p >= s; --p)
+ {
+ if (*p == 'Y' || *p == 'D' || *p == 'M' ||
+ *p == 'H' || *p == 'M' || *p == 'S' ||
+ *p == 'T' || *p == 'P')
+ break;
+ }
+
+ return p >= s ? p - s : ro_string::npos;
+ }
+
+
+ void duration_pimpl::
+ _post ()
+ {
+ typedef ro_string::size_type size_type;
+
+ char* s = str_.data ();
+ ro_string tmp (s, str_.size ());
+ size_type n = trim_right (tmp);
+
+ negative_ = false;
+ years_ = 0;
+ months_ = 0;
+ days_ = 0;
+ hours_ = 0;
+ minutes_ = 0;
+ seconds_ = 0.0;
+
+ // duration := [-]P[nY][nM][nD][TnHnMn[.n+]S]
+ //
+
+ if (n < 3 || (s[0] == '-' && n < 4))
+ {
+ _schema_error (schema_error::invalid_duration_value);
+ return;
+ }
+
+ if (s[0] == '-')
+ negative_ = true;
+
+ if (s[negative_ ? 1 : 0] != 'P')
+ {
+ _schema_error (schema_error::invalid_duration_value);
+ return;
+ }
+
+ // Parse it backwards so that we can truncate and reuse
+ // the string.
+ //
+
+ bool need_t = false;
+ size_type pos = n - 1;
+ size_type t_pos = tmp.find ('T');
+
+ char* p;
+ unsigned long ul;
+
+ if (s[pos] == 'S')
+ {
+ need_t = true;
+
+ str_.truncate (pos);
+ pos = rfind_delim (s, pos - 1);
+
+ set_errno (0);
+ seconds_ = strtod (s + pos + 1, &p);
+
+ if (*p != '\0' || get_errno () != 0 || seconds_ < 0.0)
+ {
+ _schema_error (schema_error::invalid_duration_value);
+ return;
+ }
+ }
+
+ if (s[pos] == 'M' && t_pos != ro_string::npos && t_pos < pos)
+ {
+ need_t = true;
+
+ str_.truncate (pos);
+ pos = rfind_delim (s, pos - 1);
+
+ set_errno (0);
+ ul = strtoul (s + pos + 1, &p, 10);
+
+ if (*p != '\0' || get_errno () != 0 || ul > 4294967295UL)
+ {
+ _schema_error (schema_error::invalid_duration_value);
+ return;
+ }
+
+ minutes_ = static_cast<unsigned int> (ul);
+ }
+
+ if (s[pos] == 'H')
+ {
+ need_t = true;
+
+ str_.truncate (pos);
+ pos = rfind_delim (s, pos - 1);
+
+ set_errno (0);
+ ul = strtoul (s + pos + 1, &p, 10);
+
+ if (*p != '\0' || get_errno () != 0 || ul > 4294967295UL)
+ {
+ _schema_error (schema_error::invalid_duration_value);
+ return;
+ }
+
+ hours_ = static_cast<unsigned int> (ul);
+ }
+
+ if (need_t)
+ {
+ if (s[pos] == 'T')
+ pos = rfind_delim (s, pos - 1);
+ else
+ {
+ _schema_error (schema_error::invalid_duration_value);
+ return;
+ }
+ }
+ else
+ {
+ if (s[pos] == 'T')
+ {
+ _schema_error (schema_error::invalid_duration_value);
+ return;
+ }
+ }
+
+ if (s[pos] == 'D')
+ {
+ str_.truncate (pos);
+ pos = rfind_delim (s, pos - 1);
+
+ set_errno (0);
+ ul = strtoul (s + pos + 1, &p, 10);
+
+ if (*p != '\0' || get_errno () != 0 || ul > 4294967295UL)
+ {
+ _schema_error (schema_error::invalid_duration_value);
+ return;
+ }
+
+ days_ = static_cast<unsigned int> (ul);
+ }
+
+ if (s[pos] == 'M')
+ {
+ str_.truncate (pos);
+ pos = rfind_delim (s, pos - 1);
+
+ set_errno (0);
+ ul = strtoul (s + pos + 1, &p, 10);
+
+ if (*p != '\0' || get_errno () != 0 || ul > 4294967295UL)
+ {
+ _schema_error (schema_error::invalid_duration_value);
+ return;
+ }
+
+ months_ = static_cast<unsigned int> (ul);
+ }
+
+ if (s[pos] == 'Y')
+ {
+ str_.truncate (pos);
+ pos = rfind_delim (s, pos - 1);
+
+ set_errno (0);
+ ul = strtoul (s + pos + 1, &p, 10);
+
+ if (*p != '\0' || get_errno () != 0 || ul > 4294967295UL)
+ {
+ _schema_error (schema_error::invalid_duration_value);
+ return;
+ }
+
+ years_ = static_cast<unsigned int> (ul);
+ }
+
+ // Something did not match or appeared in the wrong order.
+ //
+ if (pos != static_cast<size_type> (negative_ ? 1 : 0))
+ {
+ _schema_error (schema_error::invalid_duration_value);
+ return;
+ }
+ }
+
+ duration duration_pimpl::
+ post_duration ()
+ {
+ return duration (
+ negative_, years_, months_, days_, hours_, minutes_, seconds_);
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/duration.hxx b/libxsde/xsde/cxx/parser/validating/duration.hxx
new file mode 100644
index 0000000..3ee53db
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/duration.hxx
@@ -0,0 +1,51 @@
+// file : xsde/cxx/parser/validating/duration.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_DURATION_HXX
+#define XSDE_CXX_PARSER_VALIDATING_DURATION_HXX
+
+#include <xsde/cxx/string.hxx>
+
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct duration_pimpl: virtual duration_pskel
+#else
+ struct duration_pimpl: duration_pskel
+#endif
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual duration
+ post_duration ();
+
+ protected:
+ string str_;
+ bool negative_;
+ unsigned int years_, months_, days_;
+ unsigned int hours_, minutes_;
+ double seconds_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_DURATION_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/float.cxx b/libxsde/xsde/cxx/parser/validating/float.cxx
new file mode 100644
index 0000000..7bbbcca
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/float.cxx
@@ -0,0 +1,118 @@
+// file : xsde/cxx/parser/validating/float.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <stdlib.h> // strtof, strtod
+
+#include <xsde/cxx/config.hxx>
+#include <xsde/cxx/errno.hxx>
+
+#include <xsde/cxx/parser/validating/float.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void float_pimpl::
+ _pre ()
+ {
+ size_ = 0;
+ sign_ = none;
+ state_ = leading_ws;
+ }
+
+ void float_pimpl::
+ _characters (const ro_string& s)
+ {
+ if (!parse (s, str_, 127))
+ _schema_error (schema_error::invalid_float_value);
+ }
+
+ void float_pimpl::
+ _post ()
+ {
+ ro_string tmp (str_, size_);
+ size_t size = trim_right (tmp);
+
+ if (size != 0 && tmp[0] != '-' && tmp[0] != '+')
+ {
+ str_[size] = '\0';
+
+ if (tmp == "INF")
+ {
+ switch (sign_)
+ {
+ case none:
+ {
+#ifdef XSDE_STRTOF
+ value_ = strtof ("INF", 0);
+#else
+ value_ = static_cast<float> (strtod ("INF", 0));
+#endif
+ break;
+ }
+ case plus:
+ {
+ _schema_error (schema_error::invalid_float_value);
+ break;
+ }
+ case minus:
+ {
+#ifdef XSDE_STRTOF
+ value_ = strtof ("-INF", 0);
+#else
+ value_ = static_cast<float> (strtod ("-INF", 0));
+#endif
+ break;
+ }
+ }
+ }
+ else if (tmp == "NaN")
+ {
+ if (sign_ == none)
+ {
+#ifdef XSDE_STRTOF
+ value_ = strtof ("NAN", 0);
+#else
+ value_ = static_cast<float> (strtod ("NAN", 0));
+#endif
+ }
+ else
+ _schema_error (schema_error::invalid_float_value);
+
+ }
+ else
+ {
+ char* p;
+ set_errno (0);
+#ifdef XSDE_STRTOF
+ value_ = strtof (str_, &p);
+#else
+ value_ = static_cast<float> (strtod (str_, &p));
+#endif
+
+ if (*p != '\0' || get_errno () != 0)
+ _schema_error (schema_error::invalid_float_value);
+
+ if (sign_ == minus)
+ value_ = -value_;
+ }
+ }
+ else
+ _schema_error (schema_error::invalid_float_value);
+ }
+
+ float float_pimpl::
+ post_float ()
+ {
+ return value_;
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/float.hxx b/libxsde/xsde/cxx/parser/validating/float.hxx
new file mode 100644
index 0000000..2bb6e7d
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/float.hxx
@@ -0,0 +1,50 @@
+// file : xsde/cxx/parser/validating/float.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_FLOAT_HXX
+#define XSDE_CXX_PARSER_VALIDATING_FLOAT_HXX
+
+#include <xsde/cxx/parser/validating/number.hxx>
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct float_pimpl: virtual float_pskel, number
+#else
+ struct float_pimpl: float_pskel, number
+#endif
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual float
+ post_float ();
+
+ protected:
+ // Assume float values (without leading and trailing whitespaces)
+ // cannot be longer than 127 characters.
+ //
+ char str_[128];
+ float value_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_FLOAT_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/gday.cxx b/libxsde/xsde/cxx/parser/validating/gday.cxx
new file mode 100644
index 0000000..a743eee
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/gday.cxx
@@ -0,0 +1,112 @@
+// file : xsde/cxx/parser/validating/gday.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <xsde/cxx/config.hxx>
+
+#include <xsde/cxx/parser/validating/gday.hxx>
+#include <xsde/cxx/parser/validating/time-zone.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void gday_pimpl::
+ _pre ()
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.assign ("", 0);
+#else
+ if (str_.assign ("", 0))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+
+ void gday_pimpl::
+ _characters (const ro_string& s)
+ {
+ if (str_.size () == 0)
+ {
+ ro_string tmp (s.data (), s.size ());
+
+ if (trim_left (tmp) != 0)
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.append (tmp.data (), tmp.size ());
+#else
+ if (str_.append (tmp.data (), tmp.size ()))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+ }
+ else
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.append (s.data (), s.size ());
+#else
+ if (str_.append (s.data (), s.size ()))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+ }
+
+ void gday_pimpl::
+ _post ()
+ {
+ char* s = str_.data ();
+ ro_string tmp (s, str_.size ());
+ ro_string::size_type n = trim_right (tmp);
+
+ // gday := ---DD[Z|(+|-)HH:MM]
+ //
+ if (n < 5 || s[0] != '-' || s[1] != '-' || s[2] != '-')
+ {
+ _schema_error (schema_error::invalid_gday_value);
+ return;
+ }
+
+ char d1 = s[3];
+ char d2 = s[4];
+
+ if (d1 < '0' || d1 > '9' || d2 < '0' || d2 > '9')
+ {
+ _schema_error (schema_error::invalid_gday_value);
+ return;
+ }
+
+ day_ = 10 * (d1 - '0') + (d2 - '0');
+
+ if (day_ < 1 || day_ > 31)
+ {
+ _schema_error (schema_error::invalid_gday_value);
+ return;
+ }
+
+ if (n > 5)
+ {
+ if (!bits::parse_time_zone (s + 5, n - 5, zh_, zm_))
+ {
+ _schema_error (schema_error::invalid_gday_value);
+ return;
+ }
+
+ z_ = true;
+ }
+ else
+ z_ = false;
+ }
+
+ gday gday_pimpl::
+ post_gday ()
+ {
+ return z_ ? gday (day_, zh_, zm_) : gday (day_);
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/gday.hxx b/libxsde/xsde/cxx/parser/validating/gday.hxx
new file mode 100644
index 0000000..21f8fcd
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/gday.hxx
@@ -0,0 +1,50 @@
+// file : xsde/cxx/parser/validating/gday.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_GDAY_HXX
+#define XSDE_CXX_PARSER_VALIDATING_GDAY_HXX
+
+#include <xsde/cxx/string.hxx>
+
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct gday_pimpl: virtual gday_pskel
+#else
+ struct gday_pimpl: gday_pskel
+#endif
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual gday
+ post_gday ();
+
+ protected:
+ string str_;
+ unsigned short day_;
+ bool z_;
+ short zh_, zm_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_GDAY_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/gmonth-day.cxx b/libxsde/xsde/cxx/parser/validating/gmonth-day.cxx
new file mode 100644
index 0000000..3b4b4ea
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/gmonth-day.cxx
@@ -0,0 +1,137 @@
+// file : xsde/cxx/parser/validating/gmonth-day.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <xsde/cxx/config.hxx>
+
+#include <xsde/cxx/parser/validating/gmonth-day.hxx>
+#include <xsde/cxx/parser/validating/time-zone.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void gmonth_day_pimpl::
+ _pre ()
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.assign ("", 0);
+#else
+ if (str_.assign ("", 0))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+
+ void gmonth_day_pimpl::
+ _characters (const ro_string& s)
+ {
+ if (str_.size () == 0)
+ {
+ ro_string tmp (s.data (), s.size ());
+
+ if (trim_left (tmp) != 0)
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.append (tmp.data (), tmp.size ());
+#else
+ if (str_.append (tmp.data (), tmp.size ()))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+ }
+ else
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.append (s.data (), s.size ());
+#else
+ if (str_.append (s.data (), s.size ()))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+ }
+
+ void gmonth_day_pimpl::
+ _post ()
+ {
+ char* s = str_.data ();
+ ro_string tmp (s, str_.size ());
+ ro_string::size_type n = trim_right (tmp);
+
+ // gmonth_day := --MM-DD[Z|(+|-)HH:MM]
+ //
+ if (n < 7 || s[0] != '-' || s[1] != '-' || s[4] != '-')
+ {
+ _schema_error (schema_error::invalid_gmonth_day_value);
+ return;
+ }
+
+ // month
+ //
+ char d1 = s[2];
+ char d2 = s[3];
+
+ if (d1 < '0' || d1 > '9' || d2 < '0' || d2 > '9')
+ {
+ _schema_error (schema_error::invalid_gmonth_day_value);
+ return;
+ }
+
+ month_ = 10 * (d1 - '0') + (d2 - '0');
+
+ if (month_ < 1 || month_ > 12)
+ {
+ _schema_error (schema_error::invalid_gmonth_day_value);
+ return;
+ }
+
+ // day
+ //
+ d1 = s[5];
+ d2 = s[6];
+
+ if (d1 < '0' || d1 > '9' || d2 < '0' || d2 > '9')
+ {
+ _schema_error (schema_error::invalid_gmonth_day_value);
+ return;
+ }
+
+ day_ = 10 * (d1 - '0') + (d2 - '0');
+
+ if (day_ < 1 || day_ > 31)
+ {
+ _schema_error (schema_error::invalid_gmonth_day_value);
+ return;
+ }
+
+ // zone
+ //
+ if (n > 7)
+ {
+ if (!bits::parse_time_zone (s + 7, n - 7, zh_, zm_))
+ {
+ _schema_error (schema_error::invalid_gmonth_day_value);
+ return;
+ }
+
+ z_ = true;
+ }
+ else
+ z_ = false;
+ }
+
+ gmonth_day gmonth_day_pimpl::
+ post_gmonth_day ()
+ {
+ return z_
+ ? gmonth_day (month_, day_, zh_, zm_)
+ : gmonth_day (month_, day_);
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/gmonth-day.hxx b/libxsde/xsde/cxx/parser/validating/gmonth-day.hxx
new file mode 100644
index 0000000..7ec4d59
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/gmonth-day.hxx
@@ -0,0 +1,50 @@
+// file : xsde/cxx/parser/validating/gmonth-day.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_GMONTH_DAY_HXX
+#define XSDE_CXX_PARSER_VALIDATING_GMONTH_DAY_HXX
+
+#include <xsde/cxx/string.hxx>
+
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct gmonth_day_pimpl: virtual gmonth_day_pskel
+#else
+ struct gmonth_day_pimpl: gmonth_day_pskel
+#endif
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual gmonth_day
+ post_gmonth_day ();
+
+ protected:
+ string str_;
+ unsigned short month_, day_;
+ bool z_;
+ short zh_, zm_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_GMONTH_DAY_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/gmonth.cxx b/libxsde/xsde/cxx/parser/validating/gmonth.cxx
new file mode 100644
index 0000000..a6f5fc1
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/gmonth.cxx
@@ -0,0 +1,112 @@
+// file : xsde/cxx/parser/validating/gmonth.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <xsde/cxx/config.hxx>
+
+#include <xsde/cxx/parser/validating/gmonth.hxx>
+#include <xsde/cxx/parser/validating/time-zone.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void gmonth_pimpl::
+ _pre ()
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.assign ("", 0);
+#else
+ if (str_.assign ("", 0))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+
+ void gmonth_pimpl::
+ _characters (const ro_string& s)
+ {
+ if (str_.size () == 0)
+ {
+ ro_string tmp (s.data (), s.size ());
+
+ if (trim_left (tmp) != 0)
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.append (tmp.data (), tmp.size ());
+#else
+ if (str_.append (tmp.data (), tmp.size ()))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+ }
+ else
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.append (s.data (), s.size ());
+#else
+ if (str_.append (s.data (), s.size ()))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+ }
+
+ void gmonth_pimpl::
+ _post ()
+ {
+ char* s = str_.data ();
+ ro_string tmp (s, str_.size ());
+ ro_string::size_type n = trim_right (tmp);
+
+ // gmonth := --MM[Z|(+|-)HH:MM]
+ //
+ if (n < 4 || s[0] != '-' || s[1] != '-')
+ {
+ _schema_error (schema_error::invalid_gmonth_value);
+ return;
+ }
+
+ char d1 = s[2];
+ char d2 = s[3];
+
+ if (d1 < '0' || d1 > '9' || d2 < '0' || d2 > '9')
+ {
+ _schema_error (schema_error::invalid_gmonth_value);
+ return;
+ }
+
+ month_ = 10 * (d1 - '0') + (d2 - '0');
+
+ if (month_ < 1 || month_ > 12)
+ {
+ _schema_error (schema_error::invalid_gmonth_value);
+ return;
+ }
+
+ if (n > 4)
+ {
+ if (!bits::parse_time_zone (s + 4, n - 4, zh_, zm_))
+ {
+ _schema_error (schema_error::invalid_gmonth_value);
+ return;
+ }
+
+ z_ = true;
+ }
+ else
+ z_ = false;
+ }
+
+ gmonth gmonth_pimpl::
+ post_gmonth ()
+ {
+ return z_ ? gmonth (month_, zh_, zm_) : gmonth (month_);
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/gmonth.hxx b/libxsde/xsde/cxx/parser/validating/gmonth.hxx
new file mode 100644
index 0000000..cfd0e92
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/gmonth.hxx
@@ -0,0 +1,50 @@
+// file : xsde/cxx/parser/validating/gmonth.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_GMONTH_HXX
+#define XSDE_CXX_PARSER_VALIDATING_GMONTH_HXX
+
+#include <xsde/cxx/string.hxx>
+
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct gmonth_pimpl: virtual gmonth_pskel
+#else
+ struct gmonth_pimpl: gmonth_pskel
+#endif
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual gmonth
+ post_gmonth ();
+
+ protected:
+ string str_;
+ unsigned short month_;
+ bool z_;
+ short zh_, zm_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_GMONTH_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/gyear-month.cxx b/libxsde/xsde/cxx/parser/validating/gyear-month.cxx
new file mode 100644
index 0000000..023b06c
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/gyear-month.cxx
@@ -0,0 +1,161 @@
+// file : xsde/cxx/parser/validating/gyear-month.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <stdlib.h> // strtoul
+
+#include <xsde/cxx/config.hxx>
+#include <xsde/cxx/errno.hxx>
+
+#include <xsde/cxx/parser/validating/gyear-month.hxx>
+#include <xsde/cxx/parser/validating/time-zone.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void gyear_month_pimpl::
+ _pre ()
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.assign ("", 0);
+#else
+ if (str_.assign ("", 0))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+
+ void gyear_month_pimpl::
+ _characters (const ro_string& s)
+ {
+ if (str_.size () == 0)
+ {
+ ro_string tmp (s.data (), s.size ());
+
+ if (trim_left (tmp) != 0)
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.append (tmp.data (), tmp.size ());
+#else
+ if (str_.append (tmp.data (), tmp.size ()))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+ }
+ else
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.append (s.data (), s.size ());
+#else
+ if (str_.append (s.data (), s.size ()))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+ }
+
+ void gyear_month_pimpl::
+ _post ()
+ {
+ char* s = str_.data ();
+ ro_string tmp (s, str_.size ());
+ ro_string::size_type n = trim_right (tmp);
+
+ // gyear_month := [-]CCYY[N]*-MM[Z|(+|-)HH:MM]
+ //
+
+ if (n < 7 || (s[0] == '-' && n < 8))
+ {
+ _schema_error (schema_error::invalid_gyear_month_value);
+ return;
+ }
+
+ // Find the end of the year token.
+ //
+ ro_string::size_type pos = tmp.find ('-', s[0] == '-' ? 5 : 4);
+
+ if (pos == ro_string::npos || (n - pos - 1) < 2)
+ {
+ _schema_error (schema_error::invalid_gyear_month_value);
+ return;
+ }
+
+ // Parse the month value and time zone first so that we can
+ // truncate and reuse the string.
+ //
+
+ // month
+ //
+ char d1 = s[pos + 1];
+ char d2 = s[pos + 2];
+
+ if (d1 < '0' || d1 > '9' || d2 < '0' || d2 > '9')
+ {
+ _schema_error (schema_error::invalid_gyear_month_value);
+ return;
+ }
+
+ month_ = 10 * (d1 - '0') + (d2 - '0');
+
+ if (month_ < 1 || month_ > 12)
+ {
+ _schema_error (schema_error::invalid_gyear_month_value);
+ return;
+ }
+
+ // zone
+ //
+ if ((pos + 3) < n)
+ {
+ if (!bits::parse_time_zone (s + pos + 3, n - pos - 3, zh_, zm_))
+ {
+ _schema_error (schema_error::invalid_gyear_month_value);
+ return;
+ }
+
+ z_ = true;
+ }
+ else
+ z_ = false;
+
+ // year
+ //
+ str_.truncate (pos);
+
+ char* p;
+ set_errno (0);
+ bool neg = (s[0] == '-');
+ unsigned long ul = strtoul (neg ? s + 1 : s, &p, 10);
+
+ if (*p != '\0' ||
+ get_errno () != 0 ||
+ (neg && ul > 2147483648UL) ||
+ (!neg && ul > 2147483647UL) ||
+ ul == 0)
+ {
+ _schema_error (schema_error::invalid_gyear_month_value);
+ return;
+ }
+
+ year_ = neg
+ ? (ul == 2147483648UL
+ ? (-2147483647 - 1)
+ : -static_cast<int> (ul))
+ : static_cast<int> (ul);
+ }
+
+ gyear_month gyear_month_pimpl::
+ post_gyear_month ()
+ {
+ return z_
+ ? gyear_month (year_, month_, zh_, zm_)
+ : gyear_month (year_, month_);
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/gyear-month.hxx b/libxsde/xsde/cxx/parser/validating/gyear-month.hxx
new file mode 100644
index 0000000..4e7933c
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/gyear-month.hxx
@@ -0,0 +1,51 @@
+// file : xsde/cxx/parser/validating/gyear-month.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_GYEAR_MONTH_HXX
+#define XSDE_CXX_PARSER_VALIDATING_GYEAR_MONTH_HXX
+
+#include <xsde/cxx/string.hxx>
+
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct gyear_month_pimpl: virtual gyear_month_pskel
+#else
+ struct gyear_month_pimpl: gyear_month_pskel
+#endif
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual gyear_month
+ post_gyear_month ();
+
+ protected:
+ string str_;
+ int year_;
+ unsigned short month_;
+ bool z_;
+ short zh_, zm_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_GYEAR_MONTH_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/gyear.cxx b/libxsde/xsde/cxx/parser/validating/gyear.cxx
new file mode 100644
index 0000000..cbe87e1
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/gyear.cxx
@@ -0,0 +1,138 @@
+// file : xsde/cxx/parser/validating/gyear.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <stdlib.h> // strtoul
+
+#include <xsde/cxx/config.hxx>
+#include <xsde/cxx/errno.hxx>
+
+#include <xsde/cxx/parser/validating/gyear.hxx>
+#include <xsde/cxx/parser/validating/time-zone.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void gyear_pimpl::
+ _pre ()
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.assign ("", 0);
+#else
+ if (str_.assign ("", 0))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+
+ void gyear_pimpl::
+ _characters (const ro_string& s)
+ {
+ if (str_.size () == 0)
+ {
+ ro_string tmp (s.data (), s.size ());
+
+ if (trim_left (tmp) != 0)
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.append (tmp.data (), tmp.size ());
+#else
+ if (str_.append (tmp.data (), tmp.size ()))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+ }
+ else
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.append (s.data (), s.size ());
+#else
+ if (str_.append (s.data (), s.size ()))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+ }
+
+ void gyear_pimpl::
+ _post ()
+ {
+ char* s = str_.data ();
+ ro_string tmp (s, str_.size ());
+ ro_string::size_type n = trim_right (tmp);
+
+ // gyear := [-]CCYY[N]*[Z|(+|-)HH:MM]
+ //
+
+ if (n < 4 || (s[0] == '-' && n < 5))
+ {
+ _schema_error (schema_error::invalid_gyear_value);
+ return;
+ }
+
+ // Find the end of the year token.
+ //
+ ro_string::size_type pos = (s[0] == '-' ? 5 : 4);
+ for (; pos < n; ++pos)
+ {
+ char c = s[pos];
+
+ if (c == 'Z' || c == '+' || c == '-')
+ break;
+ }
+
+ // Parse the time zone first so that we can truncate and
+ // reuse the string.
+ //
+ if (pos < n)
+ {
+ if (!bits::parse_time_zone (s + pos, n - pos, zh_, zm_))
+ {
+ _schema_error (schema_error::invalid_gyear_value);
+ return;
+ }
+
+ z_ = true;
+ }
+ else
+ z_ = false;
+
+ // Parse the year value.
+ //
+ str_.truncate (pos);
+
+ char* p;
+ set_errno (0);
+ bool neg = (s[0] == '-');
+ unsigned long ul = strtoul (neg ? s + 1 : s, &p, 10);
+
+ if (*p != '\0' ||
+ get_errno () != 0 ||
+ (neg && ul > 2147483648UL) ||
+ (!neg && ul > 2147483647UL) ||
+ ul == 0)
+ {
+ _schema_error (schema_error::invalid_gyear_value);
+ return;
+ }
+
+ year_ = neg
+ ? (ul == 2147483648UL
+ ? (-2147483647 - 1)
+ : -static_cast<int> (ul))
+ : static_cast<int> (ul);
+ }
+
+ gyear gyear_pimpl::
+ post_gyear ()
+ {
+ return z_ ? gyear (year_, zh_, zm_) : gyear (year_);
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/gyear.hxx b/libxsde/xsde/cxx/parser/validating/gyear.hxx
new file mode 100644
index 0000000..557a6e4
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/gyear.hxx
@@ -0,0 +1,50 @@
+// file : xsde/cxx/parser/validating/gyear.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_GYEAR_HXX
+#define XSDE_CXX_PARSER_VALIDATING_GYEAR_HXX
+
+#include <xsde/cxx/string.hxx>
+
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct gyear_pimpl: virtual gyear_pskel
+#else
+ struct gyear_pimpl: gyear_pskel
+#endif
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual gyear
+ post_gyear ();
+
+ protected:
+ string str_;
+ int year_;
+ bool z_;
+ short zh_, zm_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_GYEAR_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/hex-binary.cxx b/libxsde/xsde/cxx/parser/validating/hex-binary.cxx
new file mode 100644
index 0000000..5f5a02c
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/hex-binary.cxx
@@ -0,0 +1,172 @@
+// file : xsde/cxx/parser/validating/hex-binary.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <xsde/cxx/config.hxx>
+
+#include <xsde/cxx/parser/validating/hex-binary.hxx>
+
+static unsigned char
+hex_decode (char c)
+{
+ unsigned char r = 0xFF;
+
+ if (c >= '0' && c <= '9')
+ r = static_cast<unsigned char> (c - '0');
+ else if (c >= 'A' && c <= 'F')
+ r = static_cast<unsigned char> (10 + (c - 'A'));
+ else if (c >= 'a' && c <= 'f')
+ r = static_cast<unsigned char> (10 + (c - 'a'));
+
+ return r;
+}
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ hex_binary_pimpl::
+ ~hex_binary_pimpl ()
+ {
+ if (!base_)
+ delete buf_;
+ }
+
+ void hex_binary_pimpl::
+ _reset ()
+ {
+ hex_binary_pskel::_reset ();
+
+ if (!base_)
+ {
+ delete buf_;
+ buf_ = 0;
+ }
+ }
+
+ hex_binary_pimpl::
+ hex_binary_pimpl (bool base)
+ : base_ (base), buf_ (0)
+ {
+ }
+
+ void hex_binary_pimpl::
+ pre_impl (buffer* b)
+ {
+ buf_ = b;
+ }
+
+ void hex_binary_pimpl::
+ _pre ()
+ {
+ if (buf_ == 0)
+ {
+ buf_ = new buffer ();
+
+#ifndef XSDE_EXCEPTIONS
+ if (buf_ == 0)
+ {
+ _sys_error (sys_error::no_memory);
+ return;
+ }
+#endif
+ }
+
+#ifdef XSDE_EXCEPTIONS
+ str_.assign ("", 0);
+#else
+ if (str_.assign ("", 0))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+
+ void hex_binary_pimpl::
+ _characters (const ro_string& s)
+ {
+ if (str_.size () == 0)
+ {
+ ro_string tmp (s.data (), s.size ());
+
+ if (trim_left (tmp) != 0)
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.append (tmp.data (), tmp.size ());
+#else
+ if (str_.append (tmp.data (), tmp.size ()))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+ }
+ else
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.append (s.data (), s.size ());
+#else
+ if (str_.append (s.data (), s.size ()))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+ }
+
+ void hex_binary_pimpl::
+ _post ()
+ {
+ ro_string tmp (str_);
+ ro_string::size_type size = trim_right (tmp);
+
+ if (size % 2 != 0)
+ {
+ _schema_error (schema_error::invalid_hex_binary_value);
+ return;
+ }
+
+ size_t n = size / 2;
+
+#ifdef XSDE_EXCEPTIONS
+ buf_->size (n);
+#else
+ if (buf_->size (n))
+ {
+ _sys_error (sys_error::no_memory);
+ return;
+ }
+#endif
+
+ if (n != 0)
+ {
+ const char* src = tmp.data ();
+ char* dst = buf_->data ();
+ size_t i = 0;
+
+ for (; i < n; ++i)
+ {
+ unsigned char h = hex_decode (src[2 * i]);
+ unsigned char l = hex_decode (src[2 * i + 1]);
+
+ if (h == 0xFF || l == 0xFF)
+ break;
+
+ dst[i] = (h << 4) | l;
+ }
+
+ if (i != n)
+ _schema_error (schema_error::invalid_hex_binary_value);
+ }
+ }
+
+ buffer* hex_binary_pimpl::
+ post_hex_binary ()
+ {
+ buffer* r = buf_;
+ buf_ = 0;
+ return r;
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/hex-binary.hxx b/libxsde/xsde/cxx/parser/validating/hex-binary.hxx
new file mode 100644
index 0000000..4ba0e96
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/hex-binary.hxx
@@ -0,0 +1,58 @@
+// file : xsde/cxx/parser/validating/hex-binary.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_HEX_BINARY_HXX
+#define XSDE_CXX_PARSER_VALIDATING_HEX_BINARY_HXX
+
+#include <xsde/cxx/string.hxx>
+
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct hex_binary_pimpl: virtual hex_binary_pskel
+#else
+ struct hex_binary_pimpl: hex_binary_pskel
+#endif
+ {
+ ~hex_binary_pimpl ();
+ hex_binary_pimpl (bool base = false);
+
+ void
+ pre_impl (buffer*);
+
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual buffer*
+ post_hex_binary ();
+
+ virtual void
+ _reset ();
+
+ protected:
+ bool base_;
+ string str_;
+ buffer* buf_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_HEX_BINARY_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/id-stl.cxx b/libxsde/xsde/cxx/parser/validating/id-stl.cxx
new file mode 100644
index 0000000..84d487c
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/id-stl.cxx
@@ -0,0 +1,60 @@
+// file : xsde/cxx/parser/validating/id-stl.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <xsde/cxx/xml/ncname.hxx>
+
+#include <xsde/cxx/parser/validating/id-stl.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void id_pimpl::
+ _pre ()
+ {
+ str_.erase ();
+ }
+
+ void id_pimpl::
+ _characters (const ro_string& s)
+ {
+ if (str_.size () == 0)
+ {
+ ro_string tmp (s.data (), s.size ());
+
+ if (trim_left (tmp) != 0)
+ str_ += tmp;
+ }
+ else
+ str_ += s;
+ }
+
+ void id_pimpl::
+ _post ()
+ {
+ ro_string tmp (str_);
+ ro_string::size_type size = trim_right (tmp);
+
+ if (xml::valid_ncname (tmp.data (), size))
+ str_.resize (size);
+ else
+ _schema_error (schema_error::invalid_id_value);
+ }
+
+ std::string id_pimpl::
+ post_id ()
+ {
+ std::string r;
+ r.swap (str_);
+ return r;
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/id-stl.hxx b/libxsde/xsde/cxx/parser/validating/id-stl.hxx
new file mode 100644
index 0000000..8ded862
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/id-stl.hxx
@@ -0,0 +1,47 @@
+// file : xsde/cxx/parser/validating/id-stl.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_ID_STL_HXX
+#define XSDE_CXX_PARSER_VALIDATING_ID_STL_HXX
+
+#include <string>
+
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct id_pimpl: virtual id_pskel
+#else
+ struct id_pimpl: id_pskel
+#endif
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual std::string
+ post_id ();
+
+ protected:
+ std::string str_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_ID_STL_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/id.cxx b/libxsde/xsde/cxx/parser/validating/id.cxx
new file mode 100644
index 0000000..f5b1daf
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/id.cxx
@@ -0,0 +1,80 @@
+// file : xsde/cxx/parser/validating/id.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <xsde/cxx/config.hxx>
+
+#include <xsde/cxx/xml/ncname.hxx>
+
+#include <xsde/cxx/parser/validating/id.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void id_pimpl::
+ _pre ()
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.assign ("", 0);
+#else
+ if (str_.assign ("", 0))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+
+ void id_pimpl::
+ _characters (const ro_string& s)
+ {
+ if (str_.size () == 0)
+ {
+ ro_string tmp (s.data (), s.size ());
+
+ if (trim_left (tmp) != 0)
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.append (tmp.data (), tmp.size ());
+#else
+ if (str_.append (tmp.data (), tmp.size ()))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+ }
+ else
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.append (s.data (), s.size ());
+#else
+ if (str_.append (s.data (), s.size ()))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+ }
+
+ void id_pimpl::
+ _post ()
+ {
+ ro_string tmp (str_.data (), str_.size ());
+ ro_string::size_type size = trim_right (tmp);
+
+ if (xml::valid_ncname (tmp.data (), size))
+ str_.truncate (size);
+ else
+ _schema_error (schema_error::invalid_id_value);
+ }
+
+ char* id_pimpl::
+ post_id ()
+ {
+ return str_.detach ();
+ }
+ }
+ }
+ }
+}
+
diff --git a/libxsde/xsde/cxx/parser/validating/id.hxx b/libxsde/xsde/cxx/parser/validating/id.hxx
new file mode 100644
index 0000000..2b02290
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/id.hxx
@@ -0,0 +1,47 @@
+// file : xsde/cxx/parser/validating/id.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_ID_HXX
+#define XSDE_CXX_PARSER_VALIDATING_ID_HXX
+
+#include <xsde/cxx/string.hxx>
+
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct id_pimpl: virtual id_pskel
+#else
+ struct id_pimpl: id_pskel
+#endif
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual char*
+ post_id ();
+
+ protected:
+ string str_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_ID_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/idref-stl.cxx b/libxsde/xsde/cxx/parser/validating/idref-stl.cxx
new file mode 100644
index 0000000..a7a4f10
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/idref-stl.cxx
@@ -0,0 +1,60 @@
+// file : xsde/cxx/parser/validating/idref-stl.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <xsde/cxx/xml/ncname.hxx>
+
+#include <xsde/cxx/parser/validating/idref-stl.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void idref_pimpl::
+ _pre ()
+ {
+ str_.erase ();
+ }
+
+ void idref_pimpl::
+ _characters (const ro_string& s)
+ {
+ if (str_.size () == 0)
+ {
+ ro_string tmp (s.data (), s.size ());
+
+ if (trim_left (tmp) != 0)
+ str_ += tmp;
+ }
+ else
+ str_ += s;
+ }
+
+ void idref_pimpl::
+ _post ()
+ {
+ ro_string tmp (str_);
+ ro_string::size_type size = trim_right (tmp);
+
+ if (xml::valid_ncname (tmp.data (), size))
+ str_.resize (size);
+ else
+ _schema_error (schema_error::invalid_idref_value);
+ }
+
+ std::string idref_pimpl::
+ post_idref ()
+ {
+ std::string r;
+ r.swap (str_);
+ return r;
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/idref-stl.hxx b/libxsde/xsde/cxx/parser/validating/idref-stl.hxx
new file mode 100644
index 0000000..0382400
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/idref-stl.hxx
@@ -0,0 +1,47 @@
+// file : xsde/cxx/parser/validating/idref-stl.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_IDREF_STL_HXX
+#define XSDE_CXX_PARSER_VALIDATING_IDREF_STL_HXX
+
+#include <string>
+
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct idref_pimpl: virtual idref_pskel
+#else
+ struct idref_pimpl: idref_pskel
+#endif
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual std::string
+ post_idref ();
+
+ protected:
+ std::string str_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_IDREF_STL_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/idref.cxx b/libxsde/xsde/cxx/parser/validating/idref.cxx
new file mode 100644
index 0000000..1e0b320
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/idref.cxx
@@ -0,0 +1,79 @@
+// file : xsde/cxx/parser/validating/idref.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <xsde/cxx/config.hxx>
+
+#include <xsde/cxx/xml/ncname.hxx>
+
+#include <xsde/cxx/parser/validating/idref.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void idref_pimpl::
+ _pre ()
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.assign ("", 0);
+#else
+ if (str_.assign ("", 0))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+
+ void idref_pimpl::
+ _characters (const ro_string& s)
+ {
+ if (str_.size () == 0)
+ {
+ ro_string tmp (s.data (), s.size ());
+
+ if (trim_left (tmp) != 0)
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.append (tmp.data (), tmp.size ());
+#else
+ if (str_.append (tmp.data (), tmp.size ()))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+ }
+ else
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.append (s.data (), s.size ());
+#else
+ if (str_.append (s.data (), s.size ()))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+ }
+
+ void idref_pimpl::
+ _post ()
+ {
+ ro_string tmp (str_.data (), str_.size ());
+ ro_string::size_type size = trim_right (tmp);
+
+ if (xml::valid_ncname (tmp.data (), size))
+ str_.truncate (size);
+ else
+ _schema_error (schema_error::invalid_idref_value);
+ }
+
+ char* idref_pimpl::
+ post_idref ()
+ {
+ return str_.detach ();
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/idref.hxx b/libxsde/xsde/cxx/parser/validating/idref.hxx
new file mode 100644
index 0000000..bfbacb9
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/idref.hxx
@@ -0,0 +1,47 @@
+// file : xsde/cxx/parser/validating/idref.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_IDREF_HXX
+#define XSDE_CXX_PARSER_VALIDATING_IDREF_HXX
+
+#include <xsde/cxx/string.hxx>
+
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct idref_pimpl: virtual idref_pskel
+#else
+ struct idref_pimpl: idref_pskel
+#endif
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual char*
+ post_idref ();
+
+ protected:
+ string str_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_IDREF_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/idrefs-stl.cxx b/libxsde/xsde/cxx/parser/validating/idrefs-stl.cxx
new file mode 100644
index 0000000..0451a43
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/idrefs-stl.cxx
@@ -0,0 +1,133 @@
+// file : xsde/cxx/parser/validating/idrefs-stl.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <xsde/cxx/pre.hxx>
+
+#include <xsde/cxx/config.hxx>
+
+#include <xsde/cxx/parser/validating/idrefs-stl.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ idrefs_pimpl::
+ ~idrefs_pimpl ()
+ {
+ if (!base_)
+ delete seq_;
+ }
+
+ void idrefs_pimpl::
+ _reset ()
+ {
+ idrefs_pskel::_reset ();
+
+ if (!base_)
+ {
+ delete seq_;
+ seq_ = 0;
+ }
+
+ parser_._reset ();
+ }
+
+ idrefs_pimpl::
+ idrefs_pimpl (bool base)
+ : base_ (base), seq_ (0)
+ {
+ }
+
+ void idrefs_pimpl::
+ pre_impl (string_sequence* seq)
+ {
+ seq_ = seq;
+ }
+
+ void idrefs_pimpl::
+ _pre ()
+ {
+ if (seq_ == 0)
+ {
+ seq_ = new string_sequence ();
+
+#ifndef XSDE_EXCEPTIONS
+ if (seq_ == 0)
+ {
+ _sys_error (sys_error::no_memory);
+ return;
+ }
+#endif
+ }
+
+ idrefs_pskel::_pre ();
+ }
+
+ void idrefs_pimpl::
+ _post ()
+ {
+ idrefs_pskel::_post ();
+
+ // Should have at least one element.
+ //
+ if (!_context ().error_type () && seq_->size () < 1)
+ _schema_error (schema_error::invalid_idrefs_value);
+ }
+
+ string_sequence* idrefs_pimpl::
+ post_idrefs ()
+ {
+ string_sequence* r = seq_;
+ seq_ = 0;
+ return r;
+ }
+
+ void idrefs_pimpl::
+ _xsde_parse_item (const ro_string& s)
+ {
+ context& ctx = _context ();
+
+ idref_pskel& p = parser_;
+
+ p.pre ();
+
+#ifndef XSDE_EXCEPTIONS
+ if (!p._error_type ())
+ p._pre_impl (ctx);
+ else
+ p._copy_error (ctx);
+#else
+ p._pre_impl (ctx);
+#endif
+ if (!ctx.error_type ())
+ p._characters (s);
+
+ if (!ctx.error_type ())
+ p._post_impl ();
+
+ if (!ctx.error_type ())
+ {
+ const std::string& x = p.post_idref ();
+
+#ifndef XSDE_EXCEPTIONS
+ if (!p._error_type ())
+ seq_->push_back (x);
+ else
+ p._copy_error (ctx);
+#else
+ seq_->push_back (x);
+#endif
+ }
+ }
+ }
+ }
+ }
+}
+
+#include <xsde/cxx/post.hxx>
diff --git a/libxsde/xsde/cxx/parser/validating/idrefs-stl.hxx b/libxsde/xsde/cxx/parser/validating/idrefs-stl.hxx
new file mode 100644
index 0000000..44dfea8
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/idrefs-stl.hxx
@@ -0,0 +1,57 @@
+// file : xsde/cxx/parser/validating/idrefs-stl.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_IDREFS_STL_HXX
+#define XSDE_CXX_PARSER_VALIDATING_IDREFS_STL_HXX
+
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+#include <xsde/cxx/parser/validating/idref-stl.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct idrefs_pimpl: virtual idrefs_pskel
+#else
+ struct idrefs_pimpl: idrefs_pskel
+#endif
+ {
+ ~idrefs_pimpl ();
+ idrefs_pimpl (bool base = false);
+
+ void
+ pre_impl (string_sequence*);
+
+ virtual void
+ _pre ();
+
+ virtual void
+ _xsde_parse_item (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual string_sequence*
+ post_idrefs ();
+
+ virtual void
+ _reset ();
+
+ protected:
+ bool base_;
+ idref_pimpl parser_;
+ string_sequence* seq_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_IDREFS_STL_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/idrefs.cxx b/libxsde/xsde/cxx/parser/validating/idrefs.cxx
new file mode 100644
index 0000000..f6072a5
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/idrefs.cxx
@@ -0,0 +1,136 @@
+// file : xsde/cxx/parser/validating/idrefs.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <xsde/cxx/pre.hxx>
+
+#include <xsde/cxx/config.hxx>
+
+#include <xsde/cxx/parser/validating/idrefs.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ idrefs_pimpl::
+ ~idrefs_pimpl ()
+ {
+ if (!base_)
+ delete seq_;
+ }
+
+ void idrefs_pimpl::
+ _reset ()
+ {
+ idrefs_pskel::_reset ();
+
+ if (!base_)
+ {
+ delete seq_;
+ seq_ = 0;
+ }
+
+ parser_._reset ();
+ }
+
+ idrefs_pimpl::
+ idrefs_pimpl (bool base)
+ : base_ (base), seq_ (0)
+ {
+ }
+
+ void idrefs_pimpl::
+ pre_impl (string_sequence* seq)
+ {
+ seq_ = seq;
+ }
+
+ void idrefs_pimpl::
+ _pre ()
+ {
+ if (seq_ == 0)
+ {
+ seq_ = new string_sequence ();
+
+#ifndef XSDE_EXCEPTIONS
+ if (seq_ == 0)
+ {
+ _sys_error (sys_error::no_memory);
+ return;
+ }
+#endif
+ }
+
+ idrefs_pskel::_pre ();
+ }
+
+ void idrefs_pimpl::
+ _post ()
+ {
+ idrefs_pskel::_post ();
+
+ // Should have at least one element.
+ //
+ if (!_context ().error_type () && seq_->size () < 1)
+ _schema_error (schema_error::invalid_idrefs_value);
+ }
+
+ string_sequence* idrefs_pimpl::
+ post_idrefs ()
+ {
+ string_sequence* r = seq_;
+ seq_ = 0;
+ return r;
+ }
+
+ void idrefs_pimpl::
+ _xsde_parse_item (const ro_string& s)
+ {
+ context& ctx = _context ();
+
+ parser_.pre ();
+
+#ifndef XSDE_EXCEPTIONS
+ if (!parser_._error_type ())
+ parser_._pre_impl (ctx);
+ else
+ parser_._copy_error (ctx);
+#else
+ parser_._pre_impl (ctx);
+#endif
+ if (!ctx.error_type ())
+ parser_._characters (s);
+
+ if (!ctx.error_type ())
+ parser_._post_impl ();
+
+ if (!ctx.error_type ())
+ {
+ char* x = parser_.post_idref ();
+
+ // push_back() frees the string if it fails.
+ //
+#ifndef XSDE_EXCEPTIONS
+ if (!parser_._error_type ())
+ {
+ if (seq_->push_back (x))
+ _sys_error (sys_error::no_memory);
+ }
+ else
+ parser_._copy_error (ctx);
+#else
+ seq_->push_back (x);
+#endif
+ }
+ }
+ }
+ }
+ }
+}
+
+#include <xsde/cxx/post.hxx>
diff --git a/libxsde/xsde/cxx/parser/validating/idrefs.hxx b/libxsde/xsde/cxx/parser/validating/idrefs.hxx
new file mode 100644
index 0000000..f2415ff
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/idrefs.hxx
@@ -0,0 +1,57 @@
+// file : xsde/cxx/parser/validating/idrefs.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_IDREFS_HXX
+#define XSDE_CXX_PARSER_VALIDATING_IDREFS_HXX
+
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+#include <xsde/cxx/parser/validating/idref.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct idrefs_pimpl: virtual idrefs_pskel
+#else
+ struct idrefs_pimpl: idrefs_pskel
+#endif
+ {
+ ~idrefs_pimpl ();
+ idrefs_pimpl (bool base = false);
+
+ void
+ pre_impl (string_sequence*);
+
+ virtual void
+ _pre ();
+
+ virtual void
+ _xsde_parse_item (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual string_sequence*
+ post_idrefs ();
+
+ virtual void
+ _reset ();
+
+ protected:
+ bool base_;
+ idref_pimpl parser_;
+ string_sequence* seq_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_IDREFS_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/inheritance-map-load.hxx b/libxsde/xsde/cxx/parser/validating/inheritance-map-load.hxx
new file mode 100644
index 0000000..ad04019
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/inheritance-map-load.hxx
@@ -0,0 +1,35 @@
+// file : xsde/cxx/parser/validating/inheritance-map-load.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_INHERITANCE_MAP_LOAD_HXX
+#define XSDE_CXX_PARSER_VALIDATING_INHERITANCE_MAP_LOAD_HXX
+
+#include <stddef.h> // size_t
+
+#include <xsde/cxx/config.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ size_t
+ parser_imap_elements ();
+
+ inline size_t
+ parser_imap_buckets ()
+ {
+ return XSDE_PARSER_IMAP_BUCKETS;
+ }
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_INHERITANCE_MAP_LOAD_HXX
+
diff --git a/libxsde/xsde/cxx/parser/validating/inheritance-map.cxx b/libxsde/xsde/cxx/parser/validating/inheritance-map.cxx
new file mode 100644
index 0000000..491ec8d
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/inheritance-map.cxx
@@ -0,0 +1,111 @@
+// file : xsde/cxx/parser/validating/inheritance-map.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <xsde/cxx/config.hxx>
+
+#include <string.h> // strcmp
+
+#ifndef XSDE_EXCEPTIONS
+# include <assert.h> // assert
+# include <stdlib.h> // exit
+#endif
+
+#include <xsde/cxx/parser/validating/inheritance-map.hxx>
+#include <xsde/cxx/parser/validating/inheritance-map-load.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ inheritance_map* inheritance_map_init::map = 0;
+ size_t inheritance_map_init::count = 0;
+
+ bool inheritance_map::
+ check (const char* derived, const char* base) const
+ {
+ if (strcmp (derived, base) == 0)
+ return true;
+
+ const void* p = find (derived);
+
+ if (p)
+ {
+ const char* b = *static_cast<const char* const*> (p);
+ return strcmp (base, b) == 0 ? true : check (b, base);
+ }
+
+ return false;
+ }
+
+ // inheritance_map_init
+ //
+ inheritance_map_init::
+ inheritance_map_init ()
+ {
+ if (count == 0)
+ {
+ map = new inheritance_map (XSDE_PARSER_IMAP_BUCKETS);
+
+#ifndef XSDE_EXCEPTIONS
+ if (map == 0 || map->_error () != inheritance_map::error_none)
+ {
+ // This is static initialization so there is nothing we can do.
+ // The best thing is to fail fast. abort() would have probably
+ // been the better choice here but it is not available on some
+ // platforms (notably, WinCE).
+ //
+ assert (false);
+ exit (1);
+ }
+#endif
+ }
+
+ ++count;
+ }
+
+ inheritance_map_init::
+ ~inheritance_map_init ()
+ {
+ if (--count == 0)
+ delete map;
+ }
+
+ // inheritance_map_entry
+ //
+ inheritance_map_entry::
+ inheritance_map_entry (const char* derived, const char* base)
+ {
+ inheritance_map& m = inheritance_map_instance ();
+ m.insert (derived, base);
+
+#ifndef XSDE_EXCEPTIONS
+ if (m._error () != inheritance_map::error_none)
+ {
+ // This is static initialization so there is nothing we can do.
+ // The best thing is to fail fast. abort() would have probably
+ // been the better choice here but it is not available on some
+ // platforms (notably, WinCE).
+ //
+ assert (false);
+ exit (1);
+ }
+#endif
+ }
+
+ //
+ //
+ size_t
+ parser_imap_elements ()
+ {
+ return inheritance_map_instance ().size ();
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/inheritance-map.hxx b/libxsde/xsde/cxx/parser/validating/inheritance-map.hxx
new file mode 100644
index 0000000..6329545
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/inheritance-map.hxx
@@ -0,0 +1,63 @@
+// file : xsde/cxx/parser/validating/inheritance-map.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_INHERITANCE_MAP_HXX
+#define XSDE_CXX_PARSER_VALIDATING_INHERITANCE_MAP_HXX
+
+#include <stddef.h> // size_t
+
+#include <xsde/cxx/config.hxx>
+#include <xsde/cxx/ro-string.hxx>
+#include <xsde/cxx/hashmap.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ struct inheritance_map: hashmap
+ {
+ inheritance_map (size_t buckets);
+
+ void
+ insert (const char* derived, const char* base);
+
+ bool
+ check (const char* derived, const char* base) const;
+ };
+
+
+ // Translation unit initializer.
+ //
+ struct inheritance_map_init
+ {
+ static inheritance_map* map;
+ static size_t count;
+
+ inheritance_map_init ();
+ ~inheritance_map_init ();
+ };
+
+ inline inheritance_map&
+ inheritance_map_instance ();
+
+ // Map entry initializer.
+ //
+ struct inheritance_map_entry
+ {
+ inheritance_map_entry (const char* derived, const char* base);
+ };
+ }
+ }
+ }
+}
+
+#include <xsde/cxx/parser/validating/inheritance-map.ixx>
+
+#endif // XSDE_CXX_PARSER_VALIDATING_INHERITANCE_MAP_HXX
+
diff --git a/libxsde/xsde/cxx/parser/validating/inheritance-map.ixx b/libxsde/xsde/cxx/parser/validating/inheritance-map.ixx
new file mode 100644
index 0000000..4f76685
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/inheritance-map.ixx
@@ -0,0 +1,34 @@
+// file : xsde/cxx/parser/validating/inheritance-map.ixx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ inline inheritance_map::
+ inheritance_map (size_t buckets)
+ : hashmap (buckets, sizeof (const char*))
+ {
+ }
+
+ inline void inheritance_map::
+ insert (const char* derived, const char* base)
+ {
+ hashmap::insert (derived, &base);
+ }
+
+ inline inheritance_map&
+ inheritance_map_instance ()
+ {
+ return *inheritance_map_init::map;
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/int.cxx b/libxsde/xsde/cxx/parser/validating/int.cxx
new file mode 100644
index 0000000..bfbac40
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/int.cxx
@@ -0,0 +1,75 @@
+// file : xsde/cxx/parser/validating/int.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <stdlib.h> // strtoul
+
+#include <xsde/cxx/errno.hxx>
+
+#include <xsde/cxx/parser/validating/int.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void int_pimpl::
+ _pre ()
+ {
+ size_ = 0;
+ sign_ = none;
+ state_ = leading_ws;
+ }
+
+ void int_pimpl::
+ _characters (const ro_string& s)
+ {
+ if (!parse (s, str_, 11))
+ _schema_error (schema_error::invalid_int_value);
+ }
+
+ void int_pimpl::
+ _post ()
+ {
+ ro_string tmp (str_, size_);
+ size_t size = trim_right (tmp);
+
+ if (size != 0 && tmp[0] != '-' && tmp[0] != '+')
+ {
+ str_[size] = '\0';
+
+ char* p;
+ set_errno (0);
+ unsigned long ul = strtoul (str_, &p, 10);
+
+ bool neg = (sign_ == minus);
+
+ if (*p != '\0' ||
+ get_errno () != 0 ||
+ (neg && ul > 2147483648UL) ||
+ (!neg && ul > 2147483647UL))
+ _schema_error (schema_error::invalid_int_value);
+
+ value_ = neg
+ ? (ul == 2147483648UL
+ ? (-2147483647 - 1)
+ : -static_cast<int> (ul))
+ : static_cast<int> (ul);
+ }
+ else
+ _schema_error (schema_error::invalid_int_value);
+ }
+
+ int int_pimpl::
+ post_int ()
+ {
+ return value_;
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/int.hxx b/libxsde/xsde/cxx/parser/validating/int.hxx
new file mode 100644
index 0000000..7172af7
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/int.hxx
@@ -0,0 +1,52 @@
+// file : xsde/cxx/parser/validating/int.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_INT_HXX
+#define XSDE_CXX_PARSER_VALIDATING_INT_HXX
+
+#include <xsde/cxx/parser/validating/number.hxx>
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ // 32-bit signed integer
+ //
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct int_pimpl: virtual int_pskel, number
+#else
+ struct int_pimpl: int_pskel, number
+#endif
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual int
+ post_int ();
+
+ protected:
+ // We only need strlen("02147483648") + 1 characters to hold all
+ // valid and trimmed string representations of int.
+ //
+ char str_[12];
+ int value_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_INT_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/integer.cxx b/libxsde/xsde/cxx/parser/validating/integer.cxx
new file mode 100644
index 0000000..e3255e3
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/integer.cxx
@@ -0,0 +1,75 @@
+// file : xsde/cxx/parser/validating/integer.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <stdlib.h> // strtoul
+#include <limits.h> // LONG_MIN, LONG_MAX
+
+#include <xsde/cxx/errno.hxx>
+
+#include <xsde/cxx/parser/validating/integer.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void integer_pimpl::
+ _pre ()
+ {
+ size_ = 0;
+ sign_ = none;
+ state_ = leading_ws;
+ }
+
+ void integer_pimpl::
+ _characters (const ro_string& s)
+ {
+ if (!parse (s, str_, 20))
+ _schema_error (schema_error::invalid_integer_value);
+ }
+
+ void integer_pimpl::
+ _post ()
+ {
+ ro_string tmp (str_, size_);
+ size_t size = trim_right (tmp);
+
+ if (size != 0 && tmp[0] != '-' && tmp[0] != '+')
+ {
+ str_[size] = '\0';
+
+ char* p;
+ set_errno (0);
+ unsigned long ul = strtoul (str_, &p, 10);
+
+ bool neg = (sign_ == minus);
+
+ if (*p != '\0' ||
+ get_errno () != 0 ||
+ (neg && ul > static_cast<unsigned long> (LONG_MIN)) ||
+ (!neg && ul > LONG_MAX))
+ _schema_error (schema_error::invalid_integer_value);
+
+ value_ = neg
+ ? (ul == static_cast<unsigned long> (LONG_MIN)
+ ? LONG_MIN: -static_cast<long> (ul))
+ : static_cast<long> (ul);
+ }
+ else
+ _schema_error (schema_error::invalid_integer_value);
+ }
+
+ long integer_pimpl::
+ post_integer ()
+ {
+ return value_;
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/integer.hxx b/libxsde/xsde/cxx/parser/validating/integer.hxx
new file mode 100644
index 0000000..ec7c863
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/integer.hxx
@@ -0,0 +1,53 @@
+// file : xsde/cxx/parser/validating/integer.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_INTEGER_HXX
+#define XSDE_CXX_PARSER_VALIDATING_INTEGER_HXX
+
+#include <xsde/cxx/parser/validating/number.hxx>
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ // Arbitrary-length integer. Mapped to long.
+ //
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct integer_pimpl: virtual integer_pskel, number
+#else
+ struct integer_pimpl: integer_pskel, number
+#endif
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual long
+ post_integer ();
+
+ protected:
+ // We only need strlen("09223372036854775808") + 1 characters to
+ // hold all valid and trimmed string representations of long,
+ // assuming we are on a 64 bit machine.
+ //
+ char str_[21];
+ long value_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_INTEGER_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/language-stl.cxx b/libxsde/xsde/cxx/parser/validating/language-stl.cxx
new file mode 100644
index 0000000..53e0e75
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/language-stl.cxx
@@ -0,0 +1,95 @@
+// file : xsde/cxx/parser/validating/language-stl.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <xsde/cxx/parser/validating/language-stl.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void language_pimpl::
+ _pre ()
+ {
+ str_.erase ();
+ }
+
+ void language_pimpl::
+ _characters (const ro_string& s)
+ {
+ if (str_.size () == 0)
+ {
+ ro_string tmp (s.data (), s.size ());
+
+ if (trim_left (tmp) != 0)
+ str_ += tmp;
+ }
+ else
+ str_ += s;
+ }
+
+ void language_pimpl::
+ _post ()
+ {
+ typedef ro_string::size_type size_type;
+
+ ro_string tmp (str_);
+ size_type size = trim_right (tmp);
+
+ // language := ALPHA{1,8} *(-(ALPHA | DIGIT){1,8})
+ //
+ bool ok = true;
+ size_type i = 0;
+
+ for (size_type tag = 0; ; ++tag)
+ {
+ size_type n = 0;
+
+ for (; i < size && n < 8; ++n, ++i)
+ {
+ char c = tmp[i];
+
+ if (!((c >= 'a' && c <= 'z') ||
+ (c >= 'A' && c <= 'Z') ||
+ (tag != 0 && c >= '0' && c <= '9')))
+ break;
+ }
+
+ if (n == 0)
+ {
+ ok = false;
+ break;
+ }
+
+ if (i == size)
+ break;
+
+ if (tmp[i++] != '-')
+ {
+ ok = false;
+ break;
+ }
+ }
+
+ if (ok)
+ str_.resize (size);
+ else
+ _schema_error (schema_error::invalid_language_value);
+ }
+
+ std::string language_pimpl::
+ post_language ()
+ {
+ std::string r;
+ r.swap (str_);
+ return r;
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/language-stl.hxx b/libxsde/xsde/cxx/parser/validating/language-stl.hxx
new file mode 100644
index 0000000..8c0dfca
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/language-stl.hxx
@@ -0,0 +1,47 @@
+// file : xsde/cxx/parser/validating/language-stl.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_LANGUAGE_STL_HXX
+#define XSDE_CXX_PARSER_VALIDATING_LANGUAGE_STL_HXX
+
+#include <string>
+
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct language_pimpl: virtual language_pskel
+#else
+ struct language_pimpl: language_pskel
+#endif
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual std::string
+ post_language ();
+
+ protected:
+ std::string str_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_LANGUAGE_STL_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/language.cxx b/libxsde/xsde/cxx/parser/validating/language.cxx
new file mode 100644
index 0000000..177be73
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/language.cxx
@@ -0,0 +1,114 @@
+// file : xsde/cxx/parser/validating/language.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <xsde/cxx/config.hxx>
+
+#include <xsde/cxx/parser/validating/language.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void language_pimpl::
+ _pre ()
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.assign ("", 0);
+#else
+ if (str_.assign ("", 0))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+
+ void language_pimpl::
+ _characters (const ro_string& s)
+ {
+ if (str_.size () == 0)
+ {
+ ro_string tmp (s.data (), s.size ());
+
+ if (trim_left (tmp) != 0)
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.append (tmp.data (), tmp.size ());
+#else
+ if (str_.append (tmp.data (), tmp.size ()))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+ }
+ else
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.append (s.data (), s.size ());
+#else
+ if (str_.append (s.data (), s.size ()))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+ }
+
+ void language_pimpl::
+ _post ()
+ {
+ typedef ro_string::size_type size_type;
+
+ ro_string tmp (str_);
+ size_type size = trim_right (tmp);
+
+ // language := ALPHA{1,8} *(-(ALPHA | DIGIT){1,8})
+ //
+ bool ok = true;
+ size_type i = 0;
+
+ for (size_type tag = 0; ; ++tag)
+ {
+ size_type n = 0;
+
+ for (; i < size && n < 8; ++n, ++i)
+ {
+ char c = tmp[i];
+
+ if (!((c >= 'a' && c <= 'z') ||
+ (c >= 'A' && c <= 'Z') ||
+ (tag != 0 && c >= '0' && c <= '9')))
+ break;
+ }
+
+ if (n == 0)
+ {
+ ok = false;
+ break;
+ }
+
+ if (i == size)
+ break;
+
+ if (tmp[i++] != '-')
+ {
+ ok = false;
+ break;
+ }
+ }
+
+ if (ok)
+ str_.truncate (size);
+ else
+ _schema_error (schema_error::invalid_language_value);
+ }
+
+ char* language_pimpl::
+ post_language ()
+ {
+ return str_.detach ();
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/language.hxx b/libxsde/xsde/cxx/parser/validating/language.hxx
new file mode 100644
index 0000000..4321b00
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/language.hxx
@@ -0,0 +1,47 @@
+// file : xsde/cxx/parser/validating/language.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_LANGUAGE_HXX
+#define XSDE_CXX_PARSER_VALIDATING_LANGUAGE_HXX
+
+#include <xsde/cxx/string.hxx>
+
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct language_pimpl: virtual language_pskel
+#else
+ struct language_pimpl: language_pskel
+#endif
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual char*
+ post_language ();
+
+ protected:
+ string str_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_LANGUAGE_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/long-long.cxx b/libxsde/xsde/cxx/parser/validating/long-long.cxx
new file mode 100644
index 0000000..66fec5b
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/long-long.cxx
@@ -0,0 +1,75 @@
+// file : xsde/cxx/parser/validating/long-long.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <stdlib.h> // strtoull
+
+#include <xsde/cxx/errno.hxx>
+
+#include <xsde/cxx/parser/validating/long-long.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void long_pimpl::
+ _pre ()
+ {
+ size_ = 0;
+ sign_ = none;
+ state_ = leading_ws;
+ }
+
+ void long_pimpl::
+ _characters (const ro_string& s)
+ {
+ if (!parse (s, str_, 20))
+ _schema_error (schema_error::invalid_long_value);
+ }
+
+ void long_pimpl::
+ _post ()
+ {
+ ro_string tmp (str_, size_);
+ size_t size = trim_right (tmp);
+
+ if (size != 0 && tmp[0] != '-' && tmp[0] != '+')
+ {
+ str_[size] = '\0';
+
+ char* p;
+ set_errno (0);
+ unsigned long long ull = strtoull (str_, &p, 10);
+
+ bool neg = (sign_ == minus);
+
+ if (*p != '\0' ||
+ get_errno () != 0 ||
+ (neg && ull > 9223372036854775808ULL) ||
+ (!neg && ull > 9223372036854775807ULL))
+ _schema_error (schema_error::invalid_long_value);
+
+ value_ = neg
+ ? (ull == 9223372036854775808ULL
+ ? (-9223372036854775807LL - 1)
+ : -static_cast<long long> (ull))
+ : static_cast<long long> (ull);
+ }
+ else
+ _schema_error (schema_error::invalid_long_value);
+ }
+
+ long long long_pimpl::
+ post_long ()
+ {
+ return value_;
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/long-long.hxx b/libxsde/xsde/cxx/parser/validating/long-long.hxx
new file mode 100644
index 0000000..b7e830b
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/long-long.hxx
@@ -0,0 +1,52 @@
+// file : xsde/cxx/parser/validating/long-long.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_LONG_LONG_HXX
+#define XSDE_CXX_PARSER_VALIDATING_LONG_LONG_HXX
+
+#include <xsde/cxx/parser/validating/number.hxx>
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ // 64-bit signed integer
+ //
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct long_pimpl: virtual long_pskel, number
+#else
+ struct long_pimpl: long_pskel, number
+#endif
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual long long
+ post_long ();
+
+ protected:
+ // We only need strlen("09223372036854775808") + 1 characters to
+ // hold all valid and trimmed string representations of long long.
+ //
+ char str_[21];
+ long long value_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_LONG_LONG_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/long.cxx b/libxsde/xsde/cxx/parser/validating/long.cxx
new file mode 100644
index 0000000..d1f24b4
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/long.cxx
@@ -0,0 +1,75 @@
+// file : xsde/cxx/parser/validating/long.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <stdlib.h> // strtoul
+
+#include <xsde/cxx/errno.hxx>
+
+#include <xsde/cxx/parser/validating/long.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void long_pimpl::
+ _pre ()
+ {
+ size_ = 0;
+ sign_ = none;
+ state_ = leading_ws;
+ }
+
+ void long_pimpl::
+ _characters (const ro_string& s)
+ {
+ if (!parse (s, str_, 20))
+ _schema_error (schema_error::invalid_long_value);
+ }
+
+ void long_pimpl::
+ _post ()
+ {
+ ro_string tmp (str_, size_);
+ size_t size = trim_right (tmp);
+
+ if (size != 0 && tmp[0] != '-' && tmp[0] != '+')
+ {
+ str_[size] = '\0';
+
+ char* p;
+ set_errno (0);
+ unsigned long ul = strtoul (str_, &p, 10);
+
+ bool neg = (sign_ == minus);
+
+ if (*p != '\0' ||
+ get_errno () != 0 ||
+ (neg && ul > 2147483648UL) ||
+ (!neg && ul > 2147483647UL))
+ _schema_error (schema_error::invalid_long_value);
+
+ value_ = neg
+ ? (ul == 2147483648UL
+ ? (-2147483647 - 1)
+ : -static_cast<long> (ul))
+ : static_cast<long> (ul);
+ }
+ else
+ _schema_error (schema_error::invalid_long_value);
+ }
+
+ long long_pimpl::
+ post_long ()
+ {
+ return value_;
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/long.hxx b/libxsde/xsde/cxx/parser/validating/long.hxx
new file mode 100644
index 0000000..f87c6c6
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/long.hxx
@@ -0,0 +1,52 @@
+// file : xsde/cxx/parser/validating/long.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_LONG_HXX
+#define XSDE_CXX_PARSER_VALIDATING_LONG_HXX
+
+#include <xsde/cxx/parser/validating/number.hxx>
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ // Fall-back implementation when 64 bit long long is not available.
+ //
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct long_pimpl: virtual long_pskel, number
+#else
+ struct long_pimpl: long_pskel, number
+#endif
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual long
+ post_long ();
+
+ protected:
+ // We only need strlen("09223372036854775808") + 1 characters to
+ // hold all valid and trimmed string representations of long long.
+ //
+ char str_[21];
+ long value_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_LONG_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/name-stl.cxx b/libxsde/xsde/cxx/parser/validating/name-stl.cxx
new file mode 100644
index 0000000..a691f94
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/name-stl.cxx
@@ -0,0 +1,86 @@
+// file : xsde/cxx/parser/validating/name-stl.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <xsde/cxx/xml/char-table.hxx>
+
+#include <xsde/cxx/parser/validating/name-stl.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void name_pimpl::
+ _pre ()
+ {
+ str_.erase ();
+ }
+
+ void name_pimpl::
+ _characters (const ro_string& s)
+ {
+ if (str_.size () == 0)
+ {
+ ro_string tmp (s.data (), s.size ());
+
+ if (trim_left (tmp) != 0)
+ str_ += tmp;
+ }
+ else
+ str_ += s;
+ }
+
+ void name_pimpl::
+ _post ()
+ {
+ ro_string tmp (str_);
+ ro_string::size_type size = trim_right (tmp);
+
+ // For now we are only checking the US-ASCII characters.
+ //
+
+ bool ok = (size != 0);
+
+ if (ok)
+ {
+ unsigned char c = static_cast<unsigned char> (str_[0]);
+
+ ok = c >= 0x80 || (xml::char_table[c] & xml::name_first_char_mask);
+
+ if (ok)
+ {
+ for (ro_string::size_type i = 1; i < size; ++i)
+ {
+ c = static_cast<unsigned char> (str_[i]);
+
+ if (c < 0x80 && !(xml::char_table[c] & xml::name_char_mask))
+ {
+ ok = false;
+ break;
+ }
+ }
+ }
+ }
+
+ str_.resize (size);
+
+ if (!ok)
+ _schema_error (schema_error::invalid_name_value);
+ }
+
+ std::string name_pimpl::
+ post_name ()
+ {
+ std::string r;
+ r.swap (str_);
+ return r;
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/name-stl.hxx b/libxsde/xsde/cxx/parser/validating/name-stl.hxx
new file mode 100644
index 0000000..d3d7e02
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/name-stl.hxx
@@ -0,0 +1,47 @@
+// file : xsde/cxx/parser/validating/name-stl.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_NAME_STL_HXX
+#define XSDE_CXX_PARSER_VALIDATING_NAME_STL_HXX
+
+#include <string>
+
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct name_pimpl: virtual name_pskel
+#else
+ struct name_pimpl: name_pskel
+#endif
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual std::string
+ post_name ();
+
+ protected:
+ std::string str_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_NAME_STL_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/name.cxx b/libxsde/xsde/cxx/parser/validating/name.cxx
new file mode 100644
index 0000000..167aa47
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/name.cxx
@@ -0,0 +1,105 @@
+// file : xsde/cxx/parser/validating/name.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <xsde/cxx/config.hxx>
+
+#include <xsde/cxx/xml/char-table.hxx>
+
+#include <xsde/cxx/parser/validating/name.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void name_pimpl::
+ _pre ()
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.assign ("", 0);
+#else
+ if (str_.assign ("", 0))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+
+ void name_pimpl::
+ _characters (const ro_string& s)
+ {
+ if (str_.size () == 0)
+ {
+ ro_string tmp (s.data (), s.size ());
+
+ if (trim_left (tmp) != 0)
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.append (tmp.data (), tmp.size ());
+#else
+ if (str_.append (tmp.data (), tmp.size ()))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+ }
+ else
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.append (s.data (), s.size ());
+#else
+ if (str_.append (s.data (), s.size ()))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+ }
+
+ void name_pimpl::
+ _post ()
+ {
+ ro_string tmp (str_.data (), str_.size ());
+ ro_string::size_type size = trim_right (tmp);
+
+ // For now we are only checking the US-ASCII characters.
+ //
+
+ bool ok = (size != 0);
+
+ if (ok)
+ {
+ unsigned char c = static_cast<unsigned char> (str_[0]);
+
+ ok = c >= 0x80 || (xml::char_table[c] & xml::name_first_char_mask);
+
+ if (ok)
+ {
+ for (ro_string::size_type i = 1; i < size; ++i)
+ {
+ c = static_cast<unsigned char> (str_[i]);
+
+ if (c < 0x80 && !(xml::char_table[c] & xml::name_char_mask))
+ {
+ ok = false;
+ break;
+ }
+ }
+ }
+ }
+
+ str_.truncate (size);
+
+ if (!ok)
+ _schema_error (schema_error::invalid_name_value);
+ }
+
+ char* name_pimpl::
+ post_name ()
+ {
+ return str_.detach ();
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/name.hxx b/libxsde/xsde/cxx/parser/validating/name.hxx
new file mode 100644
index 0000000..9f9046f
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/name.hxx
@@ -0,0 +1,47 @@
+// file : xsde/cxx/parser/validating/name.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_NAME_HXX
+#define XSDE_CXX_PARSER_VALIDATING_NAME_HXX
+
+#include <xsde/cxx/string.hxx>
+
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct name_pimpl: virtual name_pskel
+#else
+ struct name_pimpl: name_pskel
+#endif
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual char*
+ post_name ();
+
+ protected:
+ string str_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_NAME_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/ncname-stl.cxx b/libxsde/xsde/cxx/parser/validating/ncname-stl.cxx
new file mode 100644
index 0000000..50bea6f
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/ncname-stl.cxx
@@ -0,0 +1,60 @@
+// file : xsde/cxx/parser/validating/ncname-stl.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <xsde/cxx/xml/ncname.hxx>
+
+#include <xsde/cxx/parser/validating/ncname-stl.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void ncname_pimpl::
+ _pre ()
+ {
+ str_.erase ();
+ }
+
+ void ncname_pimpl::
+ _characters (const ro_string& s)
+ {
+ if (str_.size () == 0)
+ {
+ ro_string tmp (s.data (), s.size ());
+
+ if (trim_left (tmp) != 0)
+ str_ += tmp;
+ }
+ else
+ str_ += s;
+ }
+
+ void ncname_pimpl::
+ _post ()
+ {
+ ro_string tmp (str_);
+ ro_string::size_type size = trim_right (tmp);
+
+ if (xml::valid_ncname (tmp.data (), size))
+ str_.resize (size);
+ else
+ _schema_error (schema_error::invalid_ncname_value);
+ }
+
+ std::string ncname_pimpl::
+ post_ncname ()
+ {
+ std::string r;
+ r.swap (str_);
+ return r;
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/ncname-stl.hxx b/libxsde/xsde/cxx/parser/validating/ncname-stl.hxx
new file mode 100644
index 0000000..6329c18
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/ncname-stl.hxx
@@ -0,0 +1,47 @@
+// file : xsde/cxx/parser/validating/ncname-stl.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_NCNAME_STL_HXX
+#define XSDE_CXX_PARSER_VALIDATING_NCNAME_STL_HXX
+
+#include <string>
+
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct ncname_pimpl: virtual ncname_pskel
+#else
+ struct ncname_pimpl: ncname_pskel
+#endif
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual std::string
+ post_ncname ();
+
+ protected:
+ std::string str_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_NCNAME_STL_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/ncname.cxx b/libxsde/xsde/cxx/parser/validating/ncname.cxx
new file mode 100644
index 0000000..c664014
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/ncname.cxx
@@ -0,0 +1,79 @@
+// file : xsde/cxx/parser/validating/ncname.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <xsde/cxx/config.hxx>
+
+#include <xsde/cxx/xml/ncname.hxx>
+
+#include <xsde/cxx/parser/validating/ncname.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void ncname_pimpl::
+ _pre ()
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.assign ("", 0);
+#else
+ if (str_.assign ("", 0))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+
+ void ncname_pimpl::
+ _characters (const ro_string& s)
+ {
+ if (str_.size () == 0)
+ {
+ ro_string tmp (s.data (), s.size ());
+
+ if (trim_left (tmp) != 0)
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.append (tmp.data (), tmp.size ());
+#else
+ if (str_.append (tmp.data (), tmp.size ()))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+ }
+ else
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.append (s.data (), s.size ());
+#else
+ if (str_.append (s.data (), s.size ()))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+ }
+
+ void ncname_pimpl::
+ _post ()
+ {
+ ro_string tmp (str_.data (), str_.size ());
+ ro_string::size_type size = trim_right (tmp);
+
+ if (xml::valid_ncname (tmp.data (), size))
+ str_.truncate (size);
+ else
+ _schema_error (schema_error::invalid_ncname_value);
+ }
+
+ char* ncname_pimpl::
+ post_ncname ()
+ {
+ return str_.detach ();
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/ncname.hxx b/libxsde/xsde/cxx/parser/validating/ncname.hxx
new file mode 100644
index 0000000..89a5521
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/ncname.hxx
@@ -0,0 +1,47 @@
+// file : xsde/cxx/parser/validating/ncname.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_NCNAME_HXX
+#define XSDE_CXX_PARSER_VALIDATING_NCNAME_HXX
+
+#include <xsde/cxx/string.hxx>
+
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct ncname_pimpl: virtual ncname_pskel
+#else
+ struct ncname_pimpl: ncname_pskel
+#endif
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual char*
+ post_ncname ();
+
+ protected:
+ string str_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_NCNAME_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/negative-integer.cxx b/libxsde/xsde/cxx/parser/validating/negative-integer.cxx
new file mode 100644
index 0000000..e5c78a8
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/negative-integer.cxx
@@ -0,0 +1,71 @@
+// file : xsde/cxx/parser/validating/negative-integer.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <stdlib.h> // strtoul
+#include <limits.h> // LONG_MIN
+
+#include <xsde/cxx/errno.hxx>
+
+#include <xsde/cxx/parser/validating/negative-integer.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void negative_integer_pimpl::
+ _pre ()
+ {
+ size_ = 0;
+ sign_ = none;
+ state_ = leading_ws;
+ }
+
+ void negative_integer_pimpl::
+ _characters (const ro_string& s)
+ {
+ if (!parse (s, str_, 20))
+ _schema_error (schema_error::invalid_negative_integer_value);
+ }
+
+ void negative_integer_pimpl::
+ _post ()
+ {
+ ro_string tmp (str_, size_);
+ size_t size = trim_right (tmp);
+
+ if (sign_ == minus && size != 0 && tmp[0] != '-' && tmp[0] != '+')
+ {
+ str_[size] = '\0';
+
+ char* p;
+ set_errno (0);
+ unsigned long ul = strtoul (str_, &p, 10);
+
+ if (*p != '\0' ||
+ get_errno () != 0 ||
+ ul == 0 ||
+ ul > static_cast<unsigned long> (LONG_MIN))
+ _schema_error (schema_error::invalid_negative_integer_value);
+
+ value_ = ul == static_cast<unsigned long> (LONG_MIN)
+ ? LONG_MIN : -static_cast<long> (ul);
+ }
+ else
+ _schema_error (schema_error::invalid_negative_integer_value);
+ }
+
+ long negative_integer_pimpl::
+ post_negative_integer ()
+ {
+ return value_;
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/negative-integer.hxx b/libxsde/xsde/cxx/parser/validating/negative-integer.hxx
new file mode 100644
index 0000000..0839b03
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/negative-integer.hxx
@@ -0,0 +1,53 @@
+// file : xsde/cxx/parser/validating/negative-integer.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_NEGATIVE_INTEGER_HXX
+#define XSDE_CXX_PARSER_VALIDATING_NEGATIVE_INTEGER_HXX
+
+#include <xsde/cxx/parser/validating/number.hxx>
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ // Arbitrary-length negative integer. Mapped to long.
+ //
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct negative_integer_pimpl: virtual negative_integer_pskel, number
+#else
+ struct negative_integer_pimpl: negative_integer_pskel, number
+#endif
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual long
+ post_negative_integer ();
+
+ protected:
+ // We only need strlen("09223372036854775808") + 1 characters to
+ // hold all valid and trimmed string representations of long,
+ // assuming we are on a 64 bit machine.
+ //
+ char str_[21];
+ long value_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_NEGATIVE_INTEGER_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/nmtoken-stl.cxx b/libxsde/xsde/cxx/parser/validating/nmtoken-stl.cxx
new file mode 100644
index 0000000..0f7e987
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/nmtoken-stl.cxx
@@ -0,0 +1,79 @@
+// file : xsde/cxx/parser/validating/nmtoken-stl.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <xsde/cxx/xml/char-table.hxx>
+
+#include <xsde/cxx/parser/validating/nmtoken-stl.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void nmtoken_pimpl::
+ _pre ()
+ {
+ str_.erase ();
+ }
+
+ void nmtoken_pimpl::
+ _characters (const ro_string& s)
+ {
+ if (str_.size () == 0)
+ {
+ ro_string tmp (s.data (), s.size ());
+
+ if (trim_left (tmp) != 0)
+ str_ += tmp;
+ }
+ else
+ str_ += s;
+ }
+
+ void nmtoken_pimpl::
+ _post ()
+ {
+ ro_string tmp (str_);
+ ro_string::size_type size = trim_right (tmp);
+
+ // For now we are only checking the US-ASCII characters.
+ //
+
+ bool ok = (size != 0);
+
+ if (ok)
+ {
+ for (ro_string::size_type i = 0; i < size; ++i)
+ {
+ unsigned char c = static_cast<unsigned char> (str_[i]);
+
+ if (c < 0x80 && !(xml::char_table[c] & xml::name_char_mask))
+ {
+ ok = false;
+ break;
+ }
+ }
+ }
+
+ str_.resize (size);
+
+ if (!ok)
+ _schema_error (schema_error::invalid_nmtoken_value);
+ }
+
+ std::string nmtoken_pimpl::
+ post_nmtoken ()
+ {
+ std::string r;
+ r.swap (str_);
+ return r;
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/nmtoken-stl.hxx b/libxsde/xsde/cxx/parser/validating/nmtoken-stl.hxx
new file mode 100644
index 0000000..5166018
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/nmtoken-stl.hxx
@@ -0,0 +1,47 @@
+// file : xsde/cxx/parser/validating/nmtoken-stl.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_NMTOKEN_STL_HXX
+#define XSDE_CXX_PARSER_VALIDATING_NMTOKEN_STL_HXX
+
+#include <string>
+
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct nmtoken_pimpl: virtual nmtoken_pskel
+#else
+ struct nmtoken_pimpl: nmtoken_pskel
+#endif
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual std::string
+ post_nmtoken ();
+
+ protected:
+ std::string str_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_NMTOKEN_STL_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/nmtoken.cxx b/libxsde/xsde/cxx/parser/validating/nmtoken.cxx
new file mode 100644
index 0000000..875b8e3
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/nmtoken.cxx
@@ -0,0 +1,98 @@
+// file : xsde/cxx/parser/validating/nmtoken.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <xsde/cxx/config.hxx>
+
+#include <xsde/cxx/xml/char-table.hxx>
+
+#include <xsde/cxx/parser/validating/nmtoken.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void nmtoken_pimpl::
+ _pre ()
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.assign ("", 0);
+#else
+ if (str_.assign ("", 0))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+
+ void nmtoken_pimpl::
+ _characters (const ro_string& s)
+ {
+ if (str_.size () == 0)
+ {
+ ro_string tmp (s.data (), s.size ());
+
+ if (trim_left (tmp) != 0)
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.append (tmp.data (), tmp.size ());
+#else
+ if (str_.append (tmp.data (), tmp.size ()))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+ }
+ else
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.append (s.data (), s.size ());
+#else
+ if (str_.append (s.data (), s.size ()))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+ }
+
+ void nmtoken_pimpl::
+ _post ()
+ {
+ ro_string tmp (str_.data (), str_.size ());
+ ro_string::size_type size = trim_right (tmp);
+
+ // For now we are only checking the US-ASCII characters.
+ //
+
+ bool ok = (size != 0);
+
+ if (ok)
+ {
+ for (ro_string::size_type i = 0; i < size; ++i)
+ {
+ unsigned char c = static_cast<unsigned char> (str_[i]);
+
+ if (c < 0x80 && !(xml::char_table[c] & xml::name_char_mask))
+ {
+ ok = false;
+ break;
+ }
+ }
+ }
+
+ str_.truncate (size);
+
+ if (!ok)
+ _schema_error (schema_error::invalid_nmtoken_value);
+ }
+
+ char* nmtoken_pimpl::
+ post_nmtoken ()
+ {
+ return str_.detach ();
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/nmtoken.hxx b/libxsde/xsde/cxx/parser/validating/nmtoken.hxx
new file mode 100644
index 0000000..f4d322e
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/nmtoken.hxx
@@ -0,0 +1,47 @@
+// file : xsde/cxx/parser/validating/nmtoken.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_NMTOKEN_HXX
+#define XSDE_CXX_PARSER_VALIDATING_NMTOKEN_HXX
+
+#include <xsde/cxx/string.hxx>
+
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct nmtoken_pimpl: virtual nmtoken_pskel
+#else
+ struct nmtoken_pimpl: nmtoken_pskel
+#endif
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual char*
+ post_nmtoken ();
+
+ protected:
+ string str_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_NMTOKEN_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/nmtokens-stl.cxx b/libxsde/xsde/cxx/parser/validating/nmtokens-stl.cxx
new file mode 100644
index 0000000..1c88132
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/nmtokens-stl.cxx
@@ -0,0 +1,127 @@
+// file : xsde/cxx/parser/validating/nmtokens-stl.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <xsde/cxx/config.hxx>
+
+#include <xsde/cxx/parser/validating/nmtokens-stl.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ nmtokens_pimpl::
+ ~nmtokens_pimpl ()
+ {
+ if (!base_)
+ delete seq_;
+ }
+
+ void nmtokens_pimpl::
+ _reset ()
+ {
+ nmtokens_pskel::_reset ();
+
+ if (!base_)
+ {
+ delete seq_;
+ seq_ = 0;
+ }
+
+ parser_._reset ();
+ }
+
+ nmtokens_pimpl::
+ nmtokens_pimpl (bool base)
+ : base_ (base), seq_ (0)
+ {
+ }
+
+ void nmtokens_pimpl::
+ pre_impl (string_sequence* seq)
+ {
+ seq_ = seq;
+ }
+
+ void nmtokens_pimpl::
+ _pre ()
+ {
+ if (seq_ == 0)
+ {
+ seq_ = new string_sequence ();
+
+#ifndef XSDE_EXCEPTIONS
+ if (seq_ == 0)
+ {
+ _sys_error (sys_error::no_memory);
+ return;
+ }
+#endif
+ }
+
+ nmtokens_pskel::_pre ();
+ }
+
+ void nmtokens_pimpl::
+ _post ()
+ {
+ nmtokens_pskel::_post ();
+
+ // Should have at least one element.
+ //
+ if (!_context ().error_type () && seq_->size () < 1)
+ _schema_error (schema_error::invalid_nmtokens_value);
+ }
+
+ string_sequence* nmtokens_pimpl::
+ post_nmtokens ()
+ {
+ string_sequence* r = seq_;
+ seq_ = 0;
+ return r;
+ }
+
+ void nmtokens_pimpl::
+ _xsde_parse_item (const ro_string& s)
+ {
+ context& ctx = _context ();
+
+ parser_.pre ();
+
+#ifndef XSDE_EXCEPTIONS
+ if (!parser_._error_type ())
+ parser_._pre_impl (ctx);
+ else
+ parser_._copy_error (ctx);
+#else
+ parser_._pre_impl (ctx);
+#endif
+ if (!ctx.error_type ())
+ parser_._characters (s);
+
+ if (!ctx.error_type ())
+ parser_._post_impl ();
+
+ if (!ctx.error_type ())
+ {
+ const std::string& x = parser_.post_nmtoken ();
+
+#ifndef XSDE_EXCEPTIONS
+ if (!parser_._error_type ())
+ seq_->push_back (x);
+ else
+ parser_._copy_error (ctx);
+#else
+ seq_->push_back (x);
+#endif
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/nmtokens-stl.hxx b/libxsde/xsde/cxx/parser/validating/nmtokens-stl.hxx
new file mode 100644
index 0000000..6cbc464
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/nmtokens-stl.hxx
@@ -0,0 +1,57 @@
+// file : xsde/cxx/parser/validating/nmtokens-stl.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_NMTOKENS_STL_HXX
+#define XSDE_CXX_PARSER_VALIDATING_NMTOKENS_STL_HXX
+
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+#include <xsde/cxx/parser/validating/nmtoken-stl.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct nmtokens_pimpl: virtual nmtokens_pskel
+#else
+ struct nmtokens_pimpl: nmtokens_pskel
+#endif
+ {
+ ~nmtokens_pimpl ();
+ nmtokens_pimpl (bool base = false);
+
+ void
+ pre_impl (string_sequence*);
+
+ virtual void
+ _pre ();
+
+ virtual void
+ _xsde_parse_item (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual string_sequence*
+ post_nmtokens ();
+
+ virtual void
+ _reset ();
+
+ protected:
+ bool base_;
+ nmtoken_pimpl parser_;
+ string_sequence* seq_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_NMTOKENS_STL_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/nmtokens.cxx b/libxsde/xsde/cxx/parser/validating/nmtokens.cxx
new file mode 100644
index 0000000..074294d
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/nmtokens.cxx
@@ -0,0 +1,132 @@
+// file : xsde/cxx/parser/validating/nmtokens.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <xsde/cxx/config.hxx>
+
+#include <xsde/cxx/parser/validating/nmtokens.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ nmtokens_pimpl::
+ ~nmtokens_pimpl ()
+ {
+ if (!base_)
+ delete seq_;
+ }
+
+ void nmtokens_pimpl::
+ _reset ()
+ {
+ nmtokens_pskel::_reset ();
+
+ if (!base_)
+ {
+ delete seq_;
+ seq_ = 0;
+ }
+
+ parser_._reset ();
+ }
+
+ nmtokens_pimpl::
+ nmtokens_pimpl (bool base)
+ : base_ (base), seq_ (0)
+ {
+ }
+
+ void nmtokens_pimpl::
+ pre_impl (string_sequence* seq)
+ {
+ seq_ = seq;
+ }
+
+ void nmtokens_pimpl::
+ _pre ()
+ {
+ if (seq_ == 0)
+ {
+ seq_ = new string_sequence ();
+
+#ifndef XSDE_EXCEPTIONS
+ if (seq_ == 0)
+ {
+ _sys_error (sys_error::no_memory);
+ return;
+ }
+#endif
+ }
+
+ nmtokens_pskel::_pre ();
+ }
+
+ void nmtokens_pimpl::
+ _post ()
+ {
+ nmtokens_pskel::_post ();
+
+ // Should have at least one element.
+ //
+ if (!_context ().error_type () && seq_->size () < 1)
+ _schema_error (schema_error::invalid_nmtokens_value);
+ }
+
+ string_sequence* nmtokens_pimpl::
+ post_nmtokens ()
+ {
+ string_sequence* r = seq_;
+ seq_ = 0;
+ return r;
+ }
+
+ void nmtokens_pimpl::
+ _xsde_parse_item (const ro_string& s)
+ {
+ context& ctx = _context ();
+
+ parser_.pre ();
+
+#ifndef XSDE_EXCEPTIONS
+ if (!parser_._error_type ())
+ parser_._pre_impl (ctx);
+ else
+ parser_._copy_error (ctx);
+#else
+ parser_._pre_impl (ctx);
+#endif
+ if (!ctx.error_type ())
+ parser_._characters (s);
+
+ if (!ctx.error_type ())
+ parser_._post_impl ();
+
+ if (!ctx.error_type ())
+ {
+ char* x = parser_.post_nmtoken ();
+
+ // push_back() frees the string if it fails.
+ //
+#ifndef XSDE_EXCEPTIONS
+ if (!parser_._error_type ())
+ {
+ if (seq_->push_back (x))
+ _sys_error (sys_error::no_memory);
+ }
+ else
+ parser_._copy_error (ctx);
+#else
+ seq_->push_back (x);
+#endif
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/nmtokens.hxx b/libxsde/xsde/cxx/parser/validating/nmtokens.hxx
new file mode 100644
index 0000000..f24161a
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/nmtokens.hxx
@@ -0,0 +1,57 @@
+// file : xsde/cxx/parser/validating/nmtokens.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_NMTOKENS_HXX
+#define XSDE_CXX_PARSER_VALIDATING_NMTOKENS_HXX
+
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+#include <xsde/cxx/parser/validating/nmtoken.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct nmtokens_pimpl: virtual nmtokens_pskel
+#else
+ struct nmtokens_pimpl: nmtokens_pskel
+#endif
+ {
+ ~nmtokens_pimpl ();
+ nmtokens_pimpl (bool base = false);
+
+ void
+ pre_impl (string_sequence*);
+
+ virtual void
+ _pre ();
+
+ virtual void
+ _xsde_parse_item (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual string_sequence*
+ post_nmtokens ();
+
+ virtual void
+ _reset ();
+
+ protected:
+ bool base_;
+ nmtoken_pimpl parser_;
+ string_sequence* seq_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_NMTOKENS_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/non-negative-integer.cxx b/libxsde/xsde/cxx/parser/validating/non-negative-integer.cxx
new file mode 100644
index 0000000..7333abf
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/non-negative-integer.cxx
@@ -0,0 +1,66 @@
+// file : xsde/cxx/parser/validating/non-negative-integer.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <stdlib.h> // strtoul
+
+#include <xsde/cxx/errno.hxx>
+
+#include <xsde/cxx/parser/validating/non-negative-integer.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void non_negative_integer_pimpl::
+ _pre ()
+ {
+ size_ = 0;
+ sign_ = none;
+ state_ = leading_ws;
+ }
+
+ void non_negative_integer_pimpl::
+ _characters (const ro_string& s)
+ {
+ if (!parse (s, str_, 21))
+ _schema_error (schema_error::invalid_non_negative_integer_value);
+ }
+
+ void non_negative_integer_pimpl::
+ _post ()
+ {
+ ro_string tmp (str_, size_);
+ size_t size = trim_right (tmp);
+
+ if (size != 0 && tmp[0] != '-' && tmp[0] != '+')
+ {
+ str_[size] = '\0';
+
+ char* p;
+ set_errno (0);
+ value_ = strtoul (str_, &p, 10);
+
+ if (*p != '\0' ||
+ get_errno () != 0 ||
+ (sign_ == minus && value_ != 0))
+ _schema_error (schema_error::invalid_non_negative_integer_value);
+ }
+ else
+ _schema_error (schema_error::invalid_non_negative_integer_value);
+ }
+
+ unsigned long non_negative_integer_pimpl::
+ post_non_negative_integer ()
+ {
+ return value_;
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/non-negative-integer.hxx b/libxsde/xsde/cxx/parser/validating/non-negative-integer.hxx
new file mode 100644
index 0000000..36dabf7
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/non-negative-integer.hxx
@@ -0,0 +1,54 @@
+// file : xsde/cxx/parser/validating/non-negative-integer.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_NON_NEGATIVE_INTEGER_HXX
+#define XSDE_CXX_PARSER_VALIDATING_NON_NEGATIVE_INTEGER_HXX
+
+#include <xsde/cxx/parser/validating/number.hxx>
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ // Arbitrary-length non-negative integer. Mapped to unsigned long.
+ //
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct non_negative_integer_pimpl: virtual non_negative_integer_pskel,
+#else
+ struct non_negative_integer_pimpl: non_negative_integer_pskel,
+#endif
+ number
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual unsigned long
+ post_non_negative_integer ();
+
+ protected:
+ // We only need strlen("018446744073709551615") + 1 characters to
+ // hold all valid and trimmed string representations of unsigned
+ // long, assuming we are on a 64 bit machine.
+ //
+ char str_[22];
+ unsigned long value_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_NON_NEGATIVE_INTEGER_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/non-positive-integer.cxx b/libxsde/xsde/cxx/parser/validating/non-positive-integer.cxx
new file mode 100644
index 0000000..0560a34
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/non-positive-integer.cxx
@@ -0,0 +1,71 @@
+// file : xsde/cxx/parser/validating/non-positive-integer.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <stdlib.h> // strtoul
+#include <limits.h> // LONG_MIN
+
+#include <xsde/cxx/errno.hxx>
+
+#include <xsde/cxx/parser/validating/non-positive-integer.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void non_positive_integer_pimpl::
+ _pre ()
+ {
+ size_ = 0;
+ sign_ = none;
+ state_ = leading_ws;
+ }
+
+ void non_positive_integer_pimpl::
+ _characters (const ro_string& s)
+ {
+ if (!parse (s, str_, 20))
+ _schema_error (schema_error::invalid_non_positive_integer_value);
+ }
+
+ void non_positive_integer_pimpl::
+ _post ()
+ {
+ ro_string tmp (str_, size_);
+ size_t size = trim_right (tmp);
+
+ if (size != 0 && tmp[0] != '-' && tmp[0] != '+')
+ {
+ str_[size] = '\0';
+
+ char* p;
+ set_errno (0);
+ unsigned long ul = strtoul (str_, &p, 10);
+
+ if (*p != '\0' ||
+ get_errno () != 0 ||
+ (sign_ != minus && ul != 0) ||
+ ul > static_cast<unsigned long> (LONG_MIN))
+ _schema_error (schema_error::invalid_non_positive_integer_value);
+
+ value_ = ul == static_cast<unsigned long> (LONG_MIN)
+ ? LONG_MIN : -static_cast<long> (ul);
+ }
+ else
+ _schema_error (schema_error::invalid_non_positive_integer_value);
+ }
+
+ long non_positive_integer_pimpl::
+ post_non_positive_integer ()
+ {
+ return value_;
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/non-positive-integer.hxx b/libxsde/xsde/cxx/parser/validating/non-positive-integer.hxx
new file mode 100644
index 0000000..f592289
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/non-positive-integer.hxx
@@ -0,0 +1,54 @@
+// file : xsde/cxx/parser/validating/non-positive-integer.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_NON_POSITIVE_INTEGER_HXX
+#define XSDE_CXX_PARSER_VALIDATING_NON_POSITIVE_INTEGER_HXX
+
+#include <xsde/cxx/parser/validating/number.hxx>
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ // Arbitrary-length non-positive integer. Mapped to long.
+ //
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct non_positive_integer_pimpl: virtual non_positive_integer_pskel,
+#else
+ struct non_positive_integer_pimpl: non_positive_integer_pskel,
+#endif
+ number
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual long
+ post_non_positive_integer ();
+
+ protected:
+ // We only need strlen("09223372036854775808") + 1 characters to
+ // hold all valid and trimmed string representations of long,
+ // assuming we are on a 64 bit machine.
+ //
+ char str_[21];
+ long value_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_NON_POSITIVE_INTEGER_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/normalized-string-stl.cxx b/libxsde/xsde/cxx/parser/validating/normalized-string-stl.cxx
new file mode 100644
index 0000000..131b4a1
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/normalized-string-stl.cxx
@@ -0,0 +1,48 @@
+// file : xsde/cxx/parser/validating/normalized-string-stl.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <xsde/cxx/parser/validating/normalized-string-stl.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void normalized_string_pimpl::
+ _pre ()
+ {
+ str_.erase ();
+ }
+
+ void normalized_string_pimpl::
+ _characters (const ro_string& s)
+ {
+ str_ += s;
+ }
+
+ std::string normalized_string_pimpl::
+ post_normalized_string ()
+ {
+ std::string::size_type size = str_.size ();
+
+ for (std::string::size_type i = 0; i < size; ++i)
+ {
+ char& c = str_[i];
+
+ if (c == 0x0A || c == 0x0D || c == 0x09)
+ c = 0x20;
+ }
+
+ std::string r;
+ r.swap (str_);
+ return r;
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/normalized-string-stl.hxx b/libxsde/xsde/cxx/parser/validating/normalized-string-stl.hxx
new file mode 100644
index 0000000..02247d2
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/normalized-string-stl.hxx
@@ -0,0 +1,44 @@
+// file : xsde/cxx/parser/validating/normalized-string-stl.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_NORMALIZED_STRING_STL_HXX
+#define XSDE_CXX_PARSER_VALIDATING_NORMALIZED_STRING_STL_HXX
+
+#include <string>
+
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct normalized_string_pimpl: virtual normalized_string_pskel
+#else
+ struct normalized_string_pimpl: normalized_string_pskel
+#endif
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual std::string
+ post_normalized_string ();
+
+ protected:
+ std::string str_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_NORMALIZED_STRING_STL_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/normalized-string.cxx b/libxsde/xsde/cxx/parser/validating/normalized-string.cxx
new file mode 100644
index 0000000..634cf2e
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/normalized-string.cxx
@@ -0,0 +1,60 @@
+// file : xsde/cxx/parser/validating/normalized-string.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <xsde/cxx/config.hxx>
+
+#include <xsde/cxx/parser/validating/normalized-string.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void normalized_string_pimpl::
+ _pre ()
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.assign ("", 0);
+#else
+ if (str_.assign ("", 0))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+
+ void normalized_string_pimpl::
+ _characters (const ro_string& s)
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.append (s.data (), s.size ());
+#else
+ if (str_.append (s.data (), s.size ()))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+
+ char* normalized_string_pimpl::
+ post_normalized_string ()
+ {
+ typedef string::size_type size_type;
+
+ size_type size = str_.size ();
+
+ for (size_type i = 0; i < size; ++i)
+ {
+ char& c = str_[i];
+
+ if (c == 0x0A || c == 0x0D || c == 0x09)
+ c = 0x20;
+ }
+
+ return str_.detach ();
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/normalized-string.hxx b/libxsde/xsde/cxx/parser/validating/normalized-string.hxx
new file mode 100644
index 0000000..5446ceb
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/normalized-string.hxx
@@ -0,0 +1,44 @@
+// file : xsde/cxx/parser/validating/normalized-string.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_NORMALIZED_STRING_HXX
+#define XSDE_CXX_PARSER_VALIDATING_NORMALIZED_STRING_HXX
+
+#include <xsde/cxx/string.hxx>
+
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct normalized_string_pimpl: virtual normalized_string_pskel
+#else
+ struct normalized_string_pimpl: normalized_string_pskel
+#endif
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual char*
+ post_normalized_string ();
+
+ protected:
+ string str_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_NORMALIZED_STRING_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/number.cxx b/libxsde/xsde/cxx/parser/validating/number.cxx
new file mode 100644
index 0000000..62b7d53
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/number.cxx
@@ -0,0 +1,133 @@
+// file : xsde/cxx/parser/validating/number.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <string.h> // memcpy
+
+#include <xsde/cxx/parser/validating/number.hxx>
+
+using xsde::cxx::ro_string;
+
+static bool
+trim_leading_zeros (ro_string& s)
+{
+ ro_string::size_type size = s.size ();
+
+ if (size != 0)
+ {
+ const char* f = s.data ();
+ const char* l = f + size;
+ const char* of = f;
+
+ while (f < l && *f == '0')
+ ++f;
+
+ if (f != of)
+ {
+ s.assign ((f <= l ? f : 0), (f <= l ? l - f : 0));
+ return true;
+ }
+ }
+
+ return false;
+}
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ bool number::
+ parse (const ro_string& s, char* str, size_t max)
+ {
+ bool r = true;
+
+ ro_string tmp (s.data (), s.size ());
+ size_t size = tmp.size ();
+
+ switch (state_)
+ {
+ case leading_ws:
+ {
+ size = trim_left (tmp);
+
+ if (size != 0)
+ state_ = sign;
+ else
+ break;
+ // Fall through.
+ }
+ case sign:
+ {
+ if (tmp[0] == '-')
+ sign_ = minus;
+ else if (tmp[0] == '+')
+ sign_ = plus;
+
+ if (sign_ != none)
+ tmp.assign (tmp.data () + 1, --size);
+
+ if (size != 0)
+ state_ = leading_zeros;
+ else
+ break;
+
+ // Fall through.
+ }
+ case leading_zeros:
+ {
+ if (trim_leading_zeros (tmp))
+ {
+ if (size_ == 0)
+ {
+ str[0] = '0';
+ size_ = 1;
+ }
+
+ size = tmp.size ();
+ }
+
+ if (size != 0)
+ state_ = literal;
+ else
+ break;
+ // Fall through.
+ }
+ case literal:
+ {
+ // If this chunk is too long then it has to be the last so trim
+ // trailing ws.
+ //
+ if ((max - size_) < size)
+ {
+ size = trim_right (tmp);
+ state_ = trailing_ws; // It either had ws or is too large.
+ }
+
+ if ((max - size_) >= size)
+ {
+ memcpy (str + size_, tmp.data (), size);
+ size_ += size;
+ }
+ else
+ r = false;
+
+ break;
+ }
+ case trailing_ws:
+ {
+ if (trim_left (tmp) != 0)
+ r = false;
+ }
+ }
+
+ return r;
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/number.hxx b/libxsde/xsde/cxx/parser/validating/number.hxx
new file mode 100644
index 0000000..2cd9b62
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/number.hxx
@@ -0,0 +1,37 @@
+// file : xsde/cxx/parser/validating/number.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_NUMBER_HXX
+#define XSDE_CXX_PARSER_VALIDATING_NUMBER_HXX
+
+#include <stddef.h> // size_t
+
+#include <xsde/cxx/ro-string.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ class number
+ {
+ protected:
+ bool
+ parse (const ro_string&, char* str, size_t max);
+
+ protected:
+ size_t size_;
+ enum {leading_ws, sign, leading_zeros, literal, trailing_ws} state_;
+ enum {none, plus, minus} sign_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_NUMBER_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/parser.cxx b/libxsde/xsde/cxx/parser/validating/parser.cxx
new file mode 100644
index 0000000..119bf79
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/parser.cxx
@@ -0,0 +1,633 @@
+// file : xsde/cxx/parser/validating/parser.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <assert.h>
+
+#include <xsde/cxx/parser/validating/parser.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ // empty_content
+ //
+
+#ifdef XSDE_POLYMORPHIC
+ bool empty_content::
+ _start_element_impl (const ro_string&,
+ const ro_string&,
+ const char*)
+ {
+ return false;
+ }
+#else
+ bool empty_content::
+ _start_element_impl (const ro_string&,
+ const ro_string&)
+ {
+ return false;
+ }
+#endif
+
+ bool empty_content::
+ _end_element_impl (const ro_string&,
+ const ro_string&)
+ {
+ return false;
+ }
+
+ bool empty_content::
+ _attribute_impl (const ro_string&,
+ const ro_string&,
+ const ro_string&)
+ {
+ return false;
+ }
+
+ bool empty_content::
+ _characters_impl (const ro_string&)
+ {
+ return false;
+ }
+
+ //
+ //
+#ifdef XSDE_POLYMORPHIC
+ void empty_content::
+ _start_element (const ro_string& ns,
+ const ro_string& name,
+ const char* type)
+ {
+ if (!_start_element_impl (ns, name, type))
+ _schema_error (schema_error::unexpected_element);
+ }
+#else
+ void empty_content::
+ _start_element (const ro_string& ns,
+ const ro_string& name)
+ {
+ if (!_start_element_impl (ns, name))
+ _schema_error (schema_error::unexpected_element);
+ }
+#endif
+
+ void empty_content::
+ _end_element (const ro_string& ns,
+ const ro_string& name)
+ {
+ if (!_end_element_impl (ns, name))
+ _schema_error (schema_error::unexpected_element);
+ }
+
+ static const char
+ xmlns_namespace_[] = "http://www.w3.org/2000/xmlns/";
+
+ static const char
+ xsi_namespace_[] = "http://www.w3.org/2001/XMLSchema-instance";
+
+ static const char
+ type_[] = "type";
+
+ static const char
+ nil_[] = "nil";
+
+ static const char
+ schema_location_[] = "schemaLocation";
+
+ static const char
+ no_namespace_schema_location_[] = "noNamespaceSchemaLocation";
+
+ void empty_content::
+ _attribute (const ro_string& ns,
+ const ro_string& name,
+ const ro_string& value)
+ {
+ // Weed out special attributes: xsi:type, xsi:nil,
+ // xsi:schemaLocation and noNamespaceSchemaLocation.
+ // See section 3.2.7 in Structures for details.
+ //
+ if (ns == xsi_namespace_ &&
+ (name == schema_location_ ||
+ name == no_namespace_schema_location_ ||
+ name == type_ ||
+ name == nil_))
+ return;
+
+ // Also some parsers supply us with namespace-prefix
+ // mapping attributes.
+ //
+ if (ns == xmlns_namespace_)
+ return;
+
+ if (!_attribute_impl (ns, name, value))
+ _schema_error (schema_error::unexpected_attribute);
+ }
+
+ void empty_content::
+ _characters (const ro_string& s)
+ {
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ if (impl_)
+ impl_->_characters (s);
+ else
+#endif
+ if (!_characters_impl (s))
+ _schema_error (schema_error::unexpected_characters);
+ }
+
+
+ // simple_content
+ //
+
+ void simple_content::
+ _attribute (const ro_string& ns,
+ const ro_string& name,
+ const ro_string& value)
+ {
+ // Weed out special attributes: xsi:type, xsi:nil,
+ // xsi:schemaLocation and noNamespaceSchemaLocation.
+ // See section 3.2.7 in Structures for details.
+ //
+ if (ns == xsi_namespace_ &&
+ (name == schema_location_ ||
+ name == no_namespace_schema_location_ ||
+ name == type_ ||
+ name == nil_))
+ return;
+
+ // Also some parsers supply us with namespace-prefix
+ // mapping attributes.
+ //
+ if (ns == xmlns_namespace_)
+ return;
+
+ if (!_attribute_impl (ns, name, value))
+ _schema_error (schema_error::unexpected_attribute);
+ }
+
+ void simple_content::
+ _characters (const ro_string& s)
+ {
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ if (impl_)
+ impl_->_characters (s);
+ else
+#endif
+ if (!_characters_impl (s))
+ {
+ // Mixed content is implemented in the generated code
+ // by overriding _characters_impl and forwarding to
+ // _any_characters.
+ //
+
+ // Scan the string for any non-whitespace characters
+ // (Structures, section 3.4.4, clause 1.3).
+ //
+ ro_string::size_type end = s.size ();
+ for (ro_string::size_type i = 0; i < end; ++i)
+ {
+ char c = s[i];
+
+ if (c == 0x20 || c == 0x0A || c == 0x0D || c == 0x09)
+ continue;
+
+ _schema_error (schema_error::unexpected_characters);
+ break;
+ }
+ }
+ }
+
+ void simple_content::
+ _pre_impl (context& c)
+ {
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ assert (parent_ == 0);
+
+ // Set the parent_ pointers in the tied-in implementations.
+ //
+ _set_parent_chain ();
+#endif
+ context_ = &c;
+
+ previous_ = c.current_;
+
+ c.current_.parser_ = this;
+ c.current_.depth_ = 0;
+ c.current_.any_ = false;
+
+ _pre ();
+
+ if (!c.error_type ())
+ _pre_a_validate ();
+ }
+
+ void simple_content::
+ _post_impl ()
+ {
+ if (!context_->error_type ())
+ _post_a_validate ();
+
+ if (!context_->error_type ())
+ _post ();
+
+ context_->current_ = previous_;
+ context_ = 0;
+ }
+
+ void simple_content::
+ _pre_a_validate ()
+ {
+ }
+
+ void simple_content::
+ _post_a_validate ()
+ {
+ }
+
+ bool simple_content::
+ _attribute_impl (const ro_string& ns,
+ const ro_string& name,
+ const ro_string& value)
+ {
+ // Returns true on error.
+ //
+ if (_attribute_impl_phase_one (ns, name, value))
+ return true;
+
+ return _attribute_impl_phase_two (ns, name, value);
+ }
+
+ bool simple_content::
+ _attribute_impl_phase_one (const ro_string&,
+ const ro_string&,
+ const ro_string&)
+ {
+ return false;
+ }
+
+ bool simple_content::
+ _attribute_impl_phase_two (const ro_string&,
+ const ro_string&,
+ const ro_string&)
+ {
+ return false;
+ }
+
+
+ // complex_content
+ //
+
+#ifdef XSDE_POLYMORPHIC
+ void complex_content::
+ _start_element (const ro_string& ns,
+ const ro_string& name,
+ const char* type)
+ {
+ if (!_start_element_impl (ns, name, type))
+ _schema_error (schema_error::unexpected_element);
+ }
+#else
+ void complex_content::
+ _start_element (const ro_string& ns,
+ const ro_string& name)
+ {
+ if (!_start_element_impl (ns, name))
+ _schema_error (schema_error::unexpected_element);
+ }
+#endif
+
+ void complex_content::
+ _end_element (const ro_string& ns,
+ const ro_string& name)
+ {
+ if (!_end_element_impl (ns, name))
+ _schema_error (schema_error::unexpected_element);
+ }
+
+ void complex_content::
+ _attribute (const ro_string& ns,
+ const ro_string& name,
+ const ro_string& value)
+ {
+ // Weed out special attributes: xsi:type, xsi:nil,
+ // xsi:schemaLocation and noNamespaceSchemaLocation.
+ // See section 3.2.7 in Structures for details.
+ //
+ if (ns == xsi_namespace_ &&
+ (name == schema_location_ ||
+ name == no_namespace_schema_location_ ||
+ name == type_ ||
+ name == nil_))
+ return;
+
+ // Also some parsers supply us with namespace-prefix
+ // mapping attributes.
+ //
+ if (ns == xmlns_namespace_)
+ return;
+
+ if (!_attribute_impl (ns, name, value))
+ _schema_error (schema_error::unexpected_attribute);
+ }
+
+ void complex_content::
+ _characters (const ro_string& s)
+ {
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ if (impl_)
+ impl_->_characters (s);
+ else
+#endif
+ if (!_characters_impl (s))
+ {
+ // Mixed content is implemented in the generated code
+ // by overriding _characters_impl and forwarding to
+ // _any_characters.
+ //
+
+ // Scan the string for any non-whitespace characters
+ // (Structures, section 3.4.4, clause 1.3).
+ //
+ ro_string::size_type end = s.size ();
+ for (ro_string::size_type i = 0; i < end; ++i)
+ {
+ char c = s[i];
+
+ if (c == 0x20 || c == 0x0A || c == 0x0D || c == 0x09)
+ continue;
+
+ _schema_error (schema_error::unexpected_characters);
+ break;
+ }
+ }
+ }
+
+ void complex_content::
+ _pre_impl (context& c)
+ {
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ assert (parent_ == 0);
+
+ // Set the parent_ pointers in the tied-in implementations.
+ //
+ _set_parent_chain ();
+#endif
+ if (depth_++ == 0)
+ context_ = &c;
+
+#ifdef XSDE_EXCEPTIONS
+ parser_stack_.push (c.current_);
+#else
+ if (parser_stack_.push (c.current_))
+ {
+ _sys_error (sys_error::no_memory);
+ return;
+ }
+#endif
+ c.current_.parser_ = this;
+ c.current_.depth_ = 0;
+ c.current_.any_ = false;
+
+ _pre ();
+
+ if (!c.error_type ())
+ _pre_a_validate ();
+
+ if (!c.error_type ())
+ _pre_e_validate ();
+ }
+
+ void complex_content::
+ _post_impl ()
+ {
+ if (!context_->error_type ())
+ _post_e_validate ();
+
+ if (!context_->error_type ())
+ _post_a_validate ();
+
+ if (!context_->error_type ())
+ _post ();
+
+ context_->current_ = parser_stack_.top ();
+ parser_stack_.pop ();
+
+ if (--depth_ == 0)
+ context_ = 0;
+ }
+
+ void complex_content::
+ _pre_e_validate ()
+ {
+ }
+
+ void complex_content::
+ _post_e_validate ()
+ {
+ }
+
+ void complex_content::
+ _pre_a_validate ()
+ {
+ }
+
+ void complex_content::
+ _post_a_validate ()
+ {
+ }
+
+ bool complex_content::
+ _attribute_impl (const ro_string& ns,
+ const ro_string& name,
+ const ro_string& value)
+ {
+ // Returns true on error.
+ //
+ if (_attribute_impl_phase_one (ns, name, value))
+ return true;
+
+ return _attribute_impl_phase_two (ns, name, value);
+ }
+
+ bool complex_content::
+ _attribute_impl_phase_one (const ro_string&,
+ const ro_string&,
+ const ro_string&)
+ {
+ return false;
+ }
+
+ bool complex_content::
+ _attribute_impl_phase_two (const ro_string&,
+ const ro_string&,
+ const ro_string&)
+ {
+ return false;
+ }
+
+ void complex_content::
+ _reset ()
+ {
+ empty_content::_reset ();
+
+ depth_ = 0;
+ parser_stack_.clear ();
+ }
+
+ // list_base
+ //
+
+ // Find first non-space character.
+ //
+ static ro_string::size_type
+ find_ns (const char* s,
+ ro_string::size_type size,
+ ro_string::size_type pos)
+ {
+ while (pos < size &&
+ (s[pos] == 0x20 || s[pos] == 0x0A ||
+ s[pos] == 0x0D || s[pos] == 0x09))
+ ++pos;
+
+ return pos < size ? pos : ro_string::npos;
+ }
+
+ // Find first space character.
+ //
+ static ro_string::size_type
+ find_s (const char* s,
+ ro_string::size_type size,
+ ro_string::size_type pos)
+ {
+ while (pos < size &&
+ s[pos] != 0x20 && s[pos] != 0x0A &&
+ s[pos] != 0x0D && s[pos] != 0x09)
+ ++pos;
+
+ return pos < size ? pos : ro_string::npos;
+ }
+
+ // Relevant XML Schema Part 2: Datatypes sections: 4.2.1.2, 4.3.6.
+ //
+
+ void list_base::
+ _pre_impl (context& c)
+ {
+ simple_content::_pre_impl (c);
+
+ if (!c.error_type ())
+ {
+#ifdef XSDE_EXCEPTIONS
+ buf_.assign ("", 0);
+#else
+ if (buf_.assign ("", 0))
+ {
+ _sys_error (sys_error::no_memory);
+ return;
+ }
+#endif
+ }
+ }
+
+ void list_base::
+ _characters (const ro_string& s)
+ {
+ typedef ro_string::size_type size_type;
+
+ const char* data = s.data ();
+ size_type size = s.size ();
+
+ // Handle the previous chunk if we start with a ws.
+ //
+ if (!buf_.empty () &&
+ (data[0] == 0x20 || data[0] == 0x0A ||
+ data[0] == 0x0D || data[0] == 0x09))
+ {
+ ro_string tmp (buf_); // Private copy ctor.
+ _xsde_parse_item (tmp);
+ buf_.assign ("", 0); // Can't fail.
+ }
+
+ context& ctx = _context ();
+
+ // Traverse the data while logically collapsing spaces.
+ //
+ for (size_type i = find_ns (data, size, 0); i != ro_string::npos;)
+ {
+ size_type j = find_s (data, size, i);
+
+ if (j != ro_string::npos)
+ {
+ if (buf_.empty ())
+ {
+ ro_string tmp (data + i, j - i); // Private copy ctor.
+ _xsde_parse_item (tmp);
+ }
+ else
+ {
+ // Assemble the first item in str from buf_ and s.
+ //
+ string str;
+ str.swap (buf_);
+
+#ifdef XSDE_EXCEPTIONS
+ str.append (data + i, j - i);
+#else
+ if (str.append (data + i, j - i))
+ {
+ _sys_error (sys_error::no_memory);
+ break;
+ }
+#endif
+ ro_string tmp (str); // Private copy ctor.
+ _xsde_parse_item (tmp);
+ }
+
+ if (ctx.error_type ())
+ break;
+
+ i = find_ns (data, size, j);
+ }
+ else
+ {
+ // Last fragment, append it to buf_.
+ //
+#ifdef XSDE_EXCEPTIONS
+ buf_.append (data + i, size - i);
+#else
+ if (buf_.append (data + i, size - i))
+ _sys_error (sys_error::no_memory);
+#endif
+ break;
+ }
+ }
+ }
+
+ void list_base::
+ _xsde_parse_item (const ro_string&)
+ {
+ }
+
+ void list_base::
+ _post_impl ()
+ {
+ // Handle the last item.
+ //
+ if (!buf_.empty ())
+ {
+ ro_string tmp (buf_); // Private copy ctor.
+ _xsde_parse_item (tmp);
+ }
+
+ simple_content::_post_impl ();
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/parser.hxx b/libxsde/xsde/cxx/parser/validating/parser.hxx
new file mode 100644
index 0000000..246b7c9
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/parser.hxx
@@ -0,0 +1,304 @@
+// file : xsde/cxx/parser/validating/parser.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_PARSER_HXX
+#define XSDE_CXX_PARSER_VALIDATING_PARSER_HXX
+
+#include <xsde/cxx/config.hxx>
+
+#include <stddef.h> // size_t
+
+#include <xsde/cxx/string.hxx>
+#include <xsde/cxx/ro-string.hxx>
+
+#include <xsde/cxx/parser/elements.hxx>
+#include <xsde/cxx/parser/state.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ //
+ //
+ struct empty_content: parser_base
+ {
+
+#ifdef XSDE_POLYMORPHIC
+ virtual bool
+ _start_element_impl (const ro_string&,
+ const ro_string&,
+ const char*);
+#else
+ virtual bool
+ _start_element_impl (const ro_string&,
+ const ro_string&);
+#endif
+
+ virtual bool
+ _end_element_impl (const ro_string&,
+ const ro_string&);
+
+ virtual bool
+ _attribute_impl (const ro_string&,
+ const ro_string&,
+ const ro_string&);
+
+ virtual bool
+ _characters_impl (const ro_string&);
+
+
+ //
+ //
+#ifdef XSDE_POLYMORPHIC
+ virtual void
+ _start_element (const ro_string&,
+ const ro_string&,
+ const char*);
+#else
+ virtual void
+ _start_element (const ro_string&,
+ const ro_string&);
+#endif
+
+ virtual void
+ _end_element (const ro_string&,
+ const ro_string&);
+
+ virtual void
+ _attribute (const ro_string&,
+ const ro_string&,
+ const ro_string&);
+
+ virtual void
+ _characters (const ro_string&);
+
+
+ //
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ empty_content ();
+ empty_content (empty_content* impl, void*);
+#endif
+ };
+
+
+ //
+ //
+ struct simple_content: empty_content
+ {
+ //
+ //
+ virtual void
+ _attribute (const ro_string&,
+ const ro_string&,
+ const ro_string&);
+
+ virtual void
+ _characters (const ro_string&);
+
+ //
+ //
+ virtual bool
+ _attribute_impl (const ro_string&,
+ const ro_string&,
+ const ro_string&);
+
+ //
+ //
+ virtual void
+ _pre_impl (context&);
+
+ virtual void
+ _post_impl ();
+
+
+ // Implementation callbacks.
+ //
+ virtual void
+ _pre_a_validate ();
+
+ virtual void
+ _post_a_validate ();
+
+
+ // Attribute validation: during phase one we are searching for
+ // matching attributes (Structures, section 3.4.4, clause 2.1).
+ // During phase two we are searching for attribute wildcards
+ // (section 3.4.4, clause 2.2). Both phases run across
+ // inheritance hierarchy from derived to base for extension
+ // only. Both functions return true if the match was found and
+ // validation has been performed.
+ //
+ virtual bool
+ _attribute_impl_phase_one (const ro_string& ns,
+ const ro_string& name,
+ const ro_string& value);
+
+ virtual bool
+ _attribute_impl_phase_two (const ro_string& ns,
+ const ro_string& name,
+ const ro_string& value);
+
+ //
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ simple_content ();
+ simple_content (simple_content* impl, void*);
+#endif
+ };
+
+
+ //
+ //
+ struct complex_content: empty_content
+ {
+#ifdef XSDE_POLYMORPHIC
+ virtual void
+ _start_element (const ro_string&,
+ const ro_string&,
+ const char*);
+#else
+ virtual void
+ _start_element (const ro_string&,
+ const ro_string&);
+#endif
+
+ virtual void
+ _end_element (const ro_string&,
+ const ro_string&);
+
+ virtual void
+ _attribute (const ro_string&,
+ const ro_string&,
+ const ro_string&);
+
+ virtual void
+ _characters (const ro_string&);
+
+ //
+ //
+ virtual bool
+ _attribute_impl (const ro_string&,
+ const ro_string&,
+ const ro_string&);
+
+ //
+ //
+ virtual void
+ _pre_impl (context&);
+
+ virtual void
+ _post_impl ();
+
+
+ // Implementation callbacks.
+ //
+ virtual void
+ _pre_e_validate ();
+
+ virtual void
+ _post_e_validate ();
+
+ virtual void
+ _pre_a_validate ();
+
+ virtual void
+ _post_a_validate ();
+
+
+ // Attribute validation: during phase one we are searching for
+ // matching attributes (Structures, section 3.4.4, clause 2.1).
+ // During phase two we are searching for attribute wildcards
+ // (section 3.4.4, clause 2.2). Both phases run across
+ // inheritance hierarchy from derived to base for extension
+ // only. Both functions return true if the match was found and
+ // validation has been performed.
+ //
+ virtual bool
+ _attribute_impl_phase_one (const ro_string& ns,
+ const ro_string& name,
+ const ro_string& value);
+
+ virtual bool
+ _attribute_impl_phase_two (const ro_string& ns,
+ const ro_string& name,
+ const ro_string& value);
+
+ //
+ //
+ virtual void
+ _reset ();
+
+ //
+ //
+ complex_content ();
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ complex_content (complex_content* impl, void*);
+#endif
+ protected:
+ size_t depth_;
+ parser_stack parser_stack_;
+ };
+
+ // Validation state stack for the 'all' particle.
+ //
+ struct all_stack
+ {
+ all_stack (size_t n, unsigned char* first);
+
+ stack::error
+ push ();
+
+ void
+ pop ();
+
+ unsigned char*
+ top ();
+
+ void
+ clear ();
+
+ private:
+ stack stack_;
+ };
+
+ // Base for xsd:list.
+ //
+ struct list_base: simple_content
+ {
+ virtual void
+ _xsde_parse_item (const ro_string&);
+
+ virtual void
+ _pre_impl (context&);
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual void
+ _post_impl ();
+
+ //
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ list_base ();
+ list_base (list_base* impl, void*);
+#endif
+ protected:
+ string buf_;
+ };
+ }
+ }
+ }
+}
+
+#include <xsde/cxx/parser/validating/parser.ixx>
+
+#endif // XSDE_CXX_PARSER_VALIDATING_PARSER_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/parser.ixx b/libxsde/xsde/cxx/parser/validating/parser.ixx
new file mode 100644
index 0000000..4a0e176
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/parser.ixx
@@ -0,0 +1,121 @@
+// file : xsde/cxx/parser/validating/parser.ixx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+
+ // empty_content
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ inline empty_content::
+ empty_content ()
+ {
+ }
+
+ inline empty_content::
+ empty_content (empty_content* impl, void*)
+ : parser_base (impl, 0)
+ {
+ }
+#endif
+
+ // simple_content
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ inline simple_content::
+ simple_content ()
+ {
+ }
+
+ inline simple_content::
+ simple_content (simple_content* impl, void*)
+ : empty_content (impl, 0)
+ {
+ }
+#endif
+
+ // complex_content
+ //
+ inline complex_content::
+ complex_content ()
+ : depth_ (0), parser_stack_ (previous_)
+ {
+ }
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ inline complex_content::
+ complex_content (complex_content* impl, void*)
+ : empty_content (impl, 0), depth_ (0), parser_stack_ (previous_)
+ {
+ }
+#endif
+
+ // all_stack
+ //
+
+ inline all_stack::
+ all_stack (size_t n, unsigned char* first)
+ : stack_ (n, first)
+ {
+ }
+
+ inline stack::error all_stack::
+ push ()
+ {
+ if (stack::error e = stack_.push ())
+ return e;
+
+ unsigned char* p = static_cast<unsigned char*> (stack_.top ());
+
+ for (size_t i = 0; i < stack_.element_size (); ++i)
+ p[i] = 0;
+
+ return stack::error_none;
+ }
+
+ inline void all_stack::
+ pop ()
+ {
+ stack_.pop ();
+ }
+
+ inline unsigned char* all_stack::
+ top ()
+ {
+ return static_cast<unsigned char*> (stack_.top ());
+ }
+
+ inline void all_stack::
+ clear ()
+ {
+ stack_.clear ();
+ }
+
+
+ // list_base
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ inline list_base::
+ list_base ()
+ {
+ }
+
+ inline list_base::
+ list_base (list_base* impl, void*)
+ : simple_content (impl, 0)
+ {
+ }
+#endif
+ }
+ }
+ }
+}
+
diff --git a/libxsde/xsde/cxx/parser/validating/positive-integer.cxx b/libxsde/xsde/cxx/parser/validating/positive-integer.cxx
new file mode 100644
index 0000000..2a6595a
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/positive-integer.cxx
@@ -0,0 +1,64 @@
+// file : xsde/cxx/parser/validating/positive-integer.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <stdlib.h> // strtoul
+
+#include <xsde/cxx/errno.hxx>
+
+#include <xsde/cxx/parser/validating/positive-integer.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void positive_integer_pimpl::
+ _pre ()
+ {
+ size_ = 0;
+ sign_ = none;
+ state_ = leading_ws;
+ }
+
+ void positive_integer_pimpl::
+ _characters (const ro_string& s)
+ {
+ if (!parse (s, str_, 21))
+ _schema_error (schema_error::invalid_positive_integer_value);
+ }
+
+ void positive_integer_pimpl::
+ _post ()
+ {
+ ro_string tmp (str_, size_);
+ size_t size = trim_right (tmp);
+
+ if (size != 0 && sign_ != minus && tmp[0] != '-' && tmp[0] != '+')
+ {
+ str_[size] = '\0';
+
+ char* p;
+ set_errno (0);
+ value_ = strtoul (str_, &p, 10);
+
+ if (*p != '\0' || get_errno () != 0 || value_ == 0)
+ _schema_error (schema_error::invalid_positive_integer_value);
+ }
+ else
+ _schema_error (schema_error::invalid_positive_integer_value);
+ }
+
+ unsigned long positive_integer_pimpl::
+ post_positive_integer ()
+ {
+ return value_;
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/positive-integer.hxx b/libxsde/xsde/cxx/parser/validating/positive-integer.hxx
new file mode 100644
index 0000000..59b6b27
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/positive-integer.hxx
@@ -0,0 +1,53 @@
+// file : xsde/cxx/parser/validating/positive-integer.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_POSITIVE_INTEGER_HXX
+#define XSDE_CXX_PARSER_VALIDATING_POSITIVE_INTEGER_HXX
+
+#include <xsde/cxx/parser/validating/number.hxx>
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ // Arbitrary-length positive integer. Mapped to unsigned long.
+ //
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct positive_integer_pimpl: virtual positive_integer_pskel, number
+#else
+ struct positive_integer_pimpl: positive_integer_pskel, number
+#endif
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual unsigned long
+ post_positive_integer ();
+
+ protected:
+ // We only need strlen("018446744073709551615") + 1 characters to
+ // hold all valid and trimmed string representations of unsigned
+ // long, assuming we are on a 64 bit machine.
+ //
+ char str_[22];
+ unsigned long value_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_POSITIVE_INTEGER_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/qname-stl.cxx b/libxsde/xsde/cxx/parser/validating/qname-stl.cxx
new file mode 100644
index 0000000..a65e367
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/qname-stl.cxx
@@ -0,0 +1,79 @@
+// file : xsde/cxx/parser/validating/qname-stl.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <xsde/cxx/xml/ncname.hxx>
+
+#include <xsde/cxx/parser/validating/qname-stl.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void qname_pimpl::
+ _pre ()
+ {
+ str_.erase ();
+ }
+
+ void qname_pimpl::
+ _characters (const ro_string& s)
+ {
+ if (str_.size () == 0)
+ {
+ ro_string tmp (s.data (), s.size ());
+
+ if (trim_left (tmp) != 0)
+ str_ += tmp;
+ }
+ else
+ str_ += s;
+ }
+
+ void qname_pimpl::
+ _post ()
+ {
+ ro_string tmp (str_.data (), str_.size ());
+ ro_string::size_type size = trim_right (tmp);
+ ro_string::size_type pos = tmp.find (':');
+
+ const char* s = tmp.data ();
+
+ if (pos != ro_string::npos)
+ {
+ if (xml::valid_ncname (s, pos) &&
+ xml::valid_ncname (s + pos + 1, size - pos - 1))
+ {
+ prefix_.assign (s, pos);
+ name_.assign (s + pos + 1, size - pos - 1);
+ }
+ else
+ _schema_error (schema_error::invalid_qname_value);
+ }
+ else
+ {
+ if (xml::valid_ncname (s, size))
+ {
+ prefix_.erase ();
+ str_.resize (size);
+ name_.swap (str_);
+ }
+ else
+ _schema_error (schema_error::invalid_qname_value);
+ }
+ }
+
+ qname qname_pimpl::
+ post_qname ()
+ {
+ return qname (prefix_, name_);
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/qname-stl.hxx b/libxsde/xsde/cxx/parser/validating/qname-stl.hxx
new file mode 100644
index 0000000..c766c55
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/qname-stl.hxx
@@ -0,0 +1,49 @@
+// file : xsde/cxx/parser/validating/qname-stl.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_QNAME_STL_HXX
+#define XSDE_CXX_PARSER_VALIDATING_QNAME_STL_HXX
+
+#include <string>
+
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct qname_pimpl: virtual qname_pskel
+#else
+ struct qname_pimpl: qname_pskel
+#endif
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual qname
+ post_qname ();
+
+ protected:
+ std::string str_;
+ std::string name_;
+ std::string prefix_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_QNAME_STL_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/qname.cxx b/libxsde/xsde/cxx/parser/validating/qname.cxx
new file mode 100644
index 0000000..265179c
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/qname.cxx
@@ -0,0 +1,180 @@
+// file : xsde/cxx/parser/validating/qname.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <xsde/cxx/config.hxx>
+
+#include <xsde/cxx/xml/ncname.hxx>
+
+#include <xsde/cxx/parser/validating/qname.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ qname_pimpl::
+ ~qname_pimpl ()
+ {
+ if (!base_)
+ delete qn_;
+ }
+
+ void qname_pimpl::
+ _reset ()
+ {
+ qname_pskel::_reset ();
+
+ if (!base_)
+ {
+ delete qn_;
+ qn_ = 0;
+ }
+ }
+
+ qname_pimpl::
+ qname_pimpl (bool base)
+ : base_ (base), qn_ (0)
+ {
+ }
+
+ void qname_pimpl::
+ pre_impl (qname* qn)
+ {
+ qn_ = qn;
+ }
+
+ void qname_pimpl::
+ _pre ()
+ {
+ if (qn_ == 0)
+ {
+ qn_ = new qname ();
+
+#ifndef XSDE_EXCEPTIONS
+ if (qn_ == 0)
+ {
+ _sys_error (sys_error::no_memory);
+ return;
+ }
+#endif
+ }
+
+#ifdef XSDE_EXCEPTIONS
+ str_.assign ("", 0);
+#else
+ if (str_.assign ("", 0))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+
+ void qname_pimpl::
+ _characters (const ro_string& s)
+ {
+ if (str_.size () == 0)
+ {
+ ro_string tmp (s.data (), s.size ());
+
+ if (trim_left (tmp) != 0)
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.append (tmp.data (), tmp.size ());
+#else
+ if (str_.append (tmp.data (), tmp.size ()))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+ }
+ else
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.append (s.data (), s.size ());
+#else
+ if (str_.append (s.data (), s.size ()))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+ }
+
+ void qname_pimpl::
+ _post ()
+ {
+ ro_string tmp (str_.data (), str_.size ());
+ ro_string::size_type size = trim_right (tmp);
+ ro_string::size_type pos = tmp.find (':');
+
+ string name;
+ string prefix;
+
+ const char* s = tmp.data ();
+
+ if (pos != ro_string::npos)
+ {
+ if (xml::valid_ncname (s, pos) &&
+ xml::valid_ncname (s + pos + 1, size - pos - 1))
+ {
+#ifdef XSDE_EXCEPTIONS
+ prefix.assign (s, pos);
+ name.assign (s + pos + 1, size - pos - 1);
+#else
+ if (prefix.assign (s, pos) ||
+ name.assign (s + pos + 1, size - pos - 1))
+ {
+ _sys_error (sys_error::no_memory);
+ return;
+ }
+#endif
+ }
+ else
+ {
+ _schema_error (schema_error::invalid_qname_value);
+ return;
+ }
+ }
+ else
+ {
+ if (xml::valid_ncname (s, size))
+ {
+#ifdef XSDE_EXCEPTIONS
+ prefix.assign ("", 0);
+ str_.truncate (size);
+ name.swap (str_);
+#else
+ if (prefix.assign ("", 0))
+ {
+ _sys_error (sys_error::no_memory);
+ return;
+ }
+ else
+ {
+ str_.truncate (size);
+ name.swap (str_);
+ }
+#endif
+ }
+ else
+ {
+ _schema_error (schema_error::invalid_qname_value);
+ return;
+ }
+ }
+
+ qn_->prefix (prefix.detach ());
+ qn_->name (name.detach ());
+ }
+
+ qname* qname_pimpl::
+ post_qname ()
+ {
+ qname* r = qn_;
+ qn_ = 0;
+ return r;
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/qname.hxx b/libxsde/xsde/cxx/parser/validating/qname.hxx
new file mode 100644
index 0000000..2201699
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/qname.hxx
@@ -0,0 +1,58 @@
+// file : xsde/cxx/parser/validating/qname.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_QNAME_HXX
+#define XSDE_CXX_PARSER_VALIDATING_QNAME_HXX
+
+#include <xsde/cxx/string.hxx>
+
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct qname_pimpl: virtual qname_pskel
+#else
+ struct qname_pimpl: qname_pskel
+#endif
+ {
+ ~qname_pimpl ();
+ qname_pimpl (bool base = false);
+
+ void
+ pre_impl (qname*);
+
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual qname*
+ post_qname ();
+
+ virtual void
+ _reset ();
+
+ protected:
+ bool base_;
+ string str_;
+ qname* qn_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_QNAME_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/short.cxx b/libxsde/xsde/cxx/parser/validating/short.cxx
new file mode 100644
index 0000000..199465b
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/short.cxx
@@ -0,0 +1,70 @@
+// file : xsde/cxx/parser/validating/short.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <stdlib.h> // strtoul
+
+#include <xsde/cxx/parser/validating/short.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void short_pimpl::
+ _pre ()
+ {
+ size_ = 0;
+ sign_ = none;
+ state_ = leading_ws;
+ }
+
+ void short_pimpl::
+ _characters (const ro_string& s)
+ {
+ if (!parse (s, str_, 6))
+ _schema_error (schema_error::invalid_short_value);
+ }
+
+ void short_pimpl::
+ _post ()
+ {
+ ro_string tmp (str_, size_);
+ size_t size = trim_right (tmp);
+
+ if (size != 0 && tmp[0] != '-' && tmp[0] != '+')
+ {
+ str_[size] = '\0';
+
+ // No need to check errno since our string representation
+ // can never overflow an unsigned long.
+ //
+ char* p;
+ unsigned long ul = strtoul (str_, &p, 10);
+
+ bool neg = (sign_ == minus);
+
+ if (*p != '\0' || (neg && ul > 32768) || (!neg && ul > 32767))
+ _schema_error (schema_error::invalid_short_value);
+
+ value_ = neg
+ ? static_cast<short> (-static_cast<int> (ul))
+ : static_cast<short> (ul);
+ }
+ else
+ _schema_error (schema_error::invalid_short_value);
+ }
+
+ short short_pimpl::
+ post_short ()
+ {
+ return value_;
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/short.hxx b/libxsde/xsde/cxx/parser/validating/short.hxx
new file mode 100644
index 0000000..1bbe7bd
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/short.hxx
@@ -0,0 +1,52 @@
+// file : xsde/cxx/parser/validating/short.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_SHORT_HXX
+#define XSDE_CXX_PARSER_VALIDATING_SHORT_HXX
+
+#include <xsde/cxx/parser/validating/number.hxx>
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ // 16-bit signed integer
+ //
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct short_pimpl: virtual short_pskel, number
+#else
+ struct short_pimpl: short_pskel, number
+#endif
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual short
+ post_short ();
+
+ protected:
+ // We only need strlen("032768") + 1 characters to hold all valid
+ // and trimmed string representations of short.
+ //
+ char str_[7];
+ short value_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_SHORT_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/string-stl.cxx b/libxsde/xsde/cxx/parser/validating/string-stl.cxx
new file mode 100644
index 0000000..a0394db
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/string-stl.cxx
@@ -0,0 +1,38 @@
+// file : xsde/cxx/parser/validating/string-stl.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <xsde/cxx/parser/validating/string-stl.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void string_pimpl::
+ _pre ()
+ {
+ str_.erase ();
+ }
+
+ void string_pimpl::
+ _characters (const ro_string& s)
+ {
+ str_ += s;
+ }
+
+ std::string string_pimpl::
+ post_string ()
+ {
+ std::string r;
+ r.swap (str_);
+ return r;
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/string-stl.hxx b/libxsde/xsde/cxx/parser/validating/string-stl.hxx
new file mode 100644
index 0000000..a6220d1
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/string-stl.hxx
@@ -0,0 +1,44 @@
+// file : xsde/cxx/parser/validating/string-stl.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_STRING_STL_HXX
+#define XSDE_CXX_PARSER_VALIDATING_STRING_STL_HXX
+
+#include <string>
+
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct string_pimpl: virtual string_pskel
+#else
+ struct string_pimpl: string_pskel
+#endif
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual std::string
+ post_string ();
+
+ protected:
+ std::string str_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_STRING_STL_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/string.cxx b/libxsde/xsde/cxx/parser/validating/string.cxx
new file mode 100644
index 0000000..a4319fb
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/string.cxx
@@ -0,0 +1,48 @@
+// file : xsde/cxx/parser/validating/string.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <xsde/cxx/config.hxx>
+
+#include <xsde/cxx/parser/validating/string.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void string_pimpl::
+ _pre ()
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.assign ("", 0);
+#else
+ if (str_.assign ("", 0))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+
+ void string_pimpl::
+ _characters (const ro_string& s)
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.append (s.data (), s.size ());
+#else
+ if (str_.append (s.data (), s.size ()))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+
+ char* string_pimpl::
+ post_string ()
+ {
+ return str_.detach ();
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/string.hxx b/libxsde/xsde/cxx/parser/validating/string.hxx
new file mode 100644
index 0000000..2e2bcd5
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/string.hxx
@@ -0,0 +1,44 @@
+// file : xsde/cxx/parser/validating/string.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_STRING_HXX
+#define XSDE_CXX_PARSER_VALIDATING_STRING_HXX
+
+#include <xsde/cxx/string.hxx>
+
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct string_pimpl: virtual string_pskel
+#else
+ struct string_pimpl: string_pskel
+#endif
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual char*
+ post_string ();
+
+ protected:
+ string str_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_STRING_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/time-zone.cxx b/libxsde/xsde/cxx/parser/validating/time-zone.cxx
new file mode 100644
index 0000000..fb25f56
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/time-zone.cxx
@@ -0,0 +1,79 @@
+// file : xsde/cxx/parser/validating/time-zone.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <xsde/cxx/parser/validating/time-zone.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ namespace bits
+ {
+ bool
+ parse_time_zone (const char* s, size_t n, short& h, short& m)
+ {
+ // time_zone := Z|(+|-)HH:MM
+ //
+ if (n == 0)
+ {
+ return false;
+ }
+ else if (s[0] == 'Z')
+ {
+ if (n != 1)
+ return false;
+
+ h = 0;
+ m = 0;
+ }
+ else
+ {
+ if (n != 6 || (s[0] != '-' && s[0] != '+') || s[3] != ':')
+ return false;
+
+ // Parse hours.
+ //
+ char d1 = s[1];
+ char d2 = s[2];
+
+ if (d1 < '0' || d1 > '9' || d2 < '0' || d2 > '9')
+ return false;
+
+ h = 10 * (d1 - '0') + (d2 - '0');
+
+ if (h > 14)
+ return false;
+
+ // Parse minutes.
+ //
+ d1 = s[4];
+ d2 = s[5];
+
+ if (d1 < '0' || d1 > '9' || d2 < '0' || d2 > '9')
+ return false;
+
+ m = 10 * (d1 - '0') + (d2 - '0');
+
+ if (m > 59 || (h == 14 && m != 0))
+ return false;
+
+ if (s[0] == '-')
+ {
+ h = -h;
+ m = -m;
+ }
+ }
+
+ return true;
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/time-zone.hxx b/libxsde/xsde/cxx/parser/validating/time-zone.hxx
new file mode 100644
index 0000000..93a8205
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/time-zone.hxx
@@ -0,0 +1,32 @@
+// file : xsde/cxx/parser/validating/time-zone.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_TIME_ZONE_HXX
+#define XSDE_CXX_PARSER_VALIDATING_TIME_ZONE_HXX
+
+#include <stddef.h> // size_t
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ namespace bits
+ {
+ bool
+ parse_time_zone (const char* s,
+ size_t size,
+ short& hours,
+ short& minutes);
+ }
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_TIME_ZONE_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/time.cxx b/libxsde/xsde/cxx/parser/validating/time.cxx
new file mode 100644
index 0000000..eaddc58
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/time.cxx
@@ -0,0 +1,181 @@
+// file : xsde/cxx/parser/validating/time.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <stdlib.h> // strtod
+
+#include <xsde/cxx/config.hxx>
+#include <xsde/cxx/errno.hxx>
+
+#include <xsde/cxx/parser/validating/time.hxx>
+#include <xsde/cxx/parser/validating/time-zone.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void time_pimpl::
+ _pre ()
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.assign ("", 0);
+#else
+ if (str_.assign ("", 0))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+
+ void time_pimpl::
+ _characters (const ro_string& s)
+ {
+ if (str_.size () == 0)
+ {
+ ro_string tmp (s.data (), s.size ());
+
+ if (trim_left (tmp) != 0)
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.append (tmp.data (), tmp.size ());
+#else
+ if (str_.append (tmp.data (), tmp.size ()))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+ }
+ else
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.append (s.data (), s.size ());
+#else
+ if (str_.append (s.data (), s.size ()))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+ }
+
+ void time_pimpl::
+ _post ()
+ {
+ char* s = str_.data ();
+ ro_string tmp (s, str_.size ());
+ ro_string::size_type n = trim_right (tmp);
+
+ // time := HH:MM:SS[.S+][Z|(+|-)HH:MM]
+ //
+
+ if (n < 8 || s[2] != ':' || s[5] != ':')
+ {
+ _schema_error (schema_error::invalid_time_value);
+ return;
+ }
+
+ // hours
+ //
+ char d1 = s[0];
+ char d2 = s[1];
+
+ if (d1 < '0' || d1 > '9' || d2 < '0' || d2 > '9')
+ {
+ _schema_error (schema_error::invalid_time_value);
+ return;
+ }
+
+ hours_ = 10 * (d1 - '0') + (d2 - '0');
+
+ if (hours_ > 24)
+ {
+ _schema_error (schema_error::invalid_time_value);
+ return;
+ }
+
+ // minutes
+ //
+ d1 = s[3];
+ d2 = s[4];
+
+ if (d1 < '0' || d1 > '9' || d2 < '0' || d2 > '9')
+ {
+ _schema_error (schema_error::invalid_time_value);
+ return;
+ }
+
+ minutes_ = 10 * (d1 - '0') + (d2 - '0');
+
+ if (minutes_ > 59)
+ {
+ _schema_error (schema_error::invalid_time_value);
+ return;
+ }
+
+ // Find the end of the seconds fragment.
+ //
+ ro_string::size_type pos = 8;
+ for (; pos < n; ++pos)
+ {
+ char c = s[pos];
+
+ if (c == 'Z' || c == '+' || c == '-')
+ break;
+ }
+
+ // At least one digit should follow the fraction point.
+ //
+ if ((pos - 6) == 3)
+ {
+ _schema_error (schema_error::invalid_time_value);
+ return;
+ }
+
+ // Parse the time zone first so that we can truncate and
+ // reuse the string.
+ //
+ if (pos < n)
+ {
+ if (!bits::parse_time_zone (s + pos, n - pos, zh_, zm_))
+ {
+ _schema_error (schema_error::invalid_time_value);
+ return;
+ }
+
+ z_ = true;
+ }
+ else
+ z_ = false;
+
+ // seconds
+ //
+ str_.truncate (pos);
+
+ char* p;
+ set_errno (0);
+ seconds_ = strtod (s + 6, &p);
+
+ if (*p != '\0' || get_errno () != 0 || seconds_ >= 60.0)
+ {
+ _schema_error (schema_error::invalid_time_value);
+ return;
+ }
+
+ if (hours_ == 24 && (minutes_ != 0 || seconds_ != 0.0))
+ {
+ _schema_error (schema_error::invalid_time_value);
+ return;
+ }
+ }
+
+ time time_pimpl::
+ post_time ()
+ {
+ return z_
+ ? time (hours_, minutes_, seconds_, zh_, zm_)
+ : time (hours_, minutes_, seconds_);
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/time.hxx b/libxsde/xsde/cxx/parser/validating/time.hxx
new file mode 100644
index 0000000..3f68b4c
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/time.hxx
@@ -0,0 +1,51 @@
+// file : xsde/cxx/parser/validating/time.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_TIME_HXX
+#define XSDE_CXX_PARSER_VALIDATING_TIME_HXX
+
+#include <xsde/cxx/string.hxx>
+
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct time_pimpl: virtual time_pskel
+#else
+ struct time_pimpl: time_pskel
+#endif
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual time
+ post_time ();
+
+ protected:
+ string str_;
+ unsigned short hours_, minutes_;
+ double seconds_;
+ bool z_;
+ short zh_, zm_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_TIME_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/token-stl.cxx b/libxsde/xsde/cxx/parser/validating/token-stl.cxx
new file mode 100644
index 0000000..e6ac6ea
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/token-stl.cxx
@@ -0,0 +1,73 @@
+// file : xsde/cxx/parser/validating/token-stl.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <xsde/cxx/parser/validating/token-stl.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void token_pimpl::
+ _pre ()
+ {
+ str_.erase ();
+ }
+
+ void token_pimpl::
+ _characters (const ro_string& s)
+ {
+ if (str_.size () == 0)
+ {
+ ro_string tmp (s.data (), s.size ());
+
+ if (trim_left (tmp) != 0)
+ str_ += tmp;
+ }
+ else
+ str_ += s;
+ }
+
+ std::string token_pimpl::
+ post_token ()
+ {
+ std::string::size_type size = str_.size ();
+ std::string::size_type j = 0;
+
+ bool subs = false;
+
+ for (std::string::size_type i = 0; i < size; ++i)
+ {
+ char c = str_[i];
+
+ if (c == 0x20 || c == 0x0A || c == 0x0D || c == 0x09)
+ {
+ subs = true;
+ }
+ else
+ {
+ if (subs)
+ {
+ subs = false;
+ str_[j++] = 0x20;
+ }
+
+ str_[j++] = c;
+ }
+ }
+
+ str_.resize (j);
+
+ std::string r;
+ r.swap (str_);
+ return r;
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/token-stl.hxx b/libxsde/xsde/cxx/parser/validating/token-stl.hxx
new file mode 100644
index 0000000..29e4f9a
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/token-stl.hxx
@@ -0,0 +1,44 @@
+// file : xsde/cxx/parser/validating/token-stl.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_TOKEN_STL_HXX
+#define XSDE_CXX_PARSER_VALIDATING_TOKEN_STL_HXX
+
+#include <string>
+
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct token_pimpl: virtual token_pskel
+#else
+ struct token_pimpl: token_pskel
+#endif
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual std::string
+ post_token ();
+
+ protected:
+ std::string str_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_TOKEN_STL_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/token.cxx b/libxsde/xsde/cxx/parser/validating/token.cxx
new file mode 100644
index 0000000..5e12a60
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/token.cxx
@@ -0,0 +1,94 @@
+// file : xsde/cxx/parser/validating/token.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <xsde/cxx/config.hxx>
+
+#include <xsde/cxx/parser/validating/token.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void token_pimpl::
+ _pre ()
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.assign ("", 0);
+#else
+ if (str_.assign ("", 0))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+
+ void token_pimpl::
+ _characters (const ro_string& s)
+ {
+ if (str_.size () == 0)
+ {
+ ro_string tmp (s.data (), s.size ());
+
+ if (trim_left (tmp) != 0)
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.append (tmp.data (), tmp.size ());
+#else
+ if (str_.append (tmp.data (), tmp.size ()))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+ }
+ else
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.append (s.data (), s.size ());
+#else
+ if (str_.append (s.data (), s.size ()))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+ }
+
+ char* token_pimpl::
+ post_token ()
+ {
+ typedef string::size_type size_type;
+
+ size_type size = str_.size ();
+ size_type j = 0;
+
+ bool subs = false;
+
+ for (size_type i = 0; i < size; ++i)
+ {
+ char c = str_[i];
+
+ if (c == 0x20 || c == 0x0A || c == 0x0D || c == 0x09)
+ {
+ subs = true;
+ }
+ else
+ {
+ if (subs)
+ {
+ subs = false;
+ str_[j++] = 0x20;
+ }
+
+ str_[j++] = c;
+ }
+ }
+
+ str_.truncate (j);
+
+ return str_.detach ();
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/token.hxx b/libxsde/xsde/cxx/parser/validating/token.hxx
new file mode 100644
index 0000000..230466b
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/token.hxx
@@ -0,0 +1,44 @@
+// file : xsde/cxx/parser/validating/token.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_TOKEN_HXX
+#define XSDE_CXX_PARSER_VALIDATING_TOKEN_HXX
+
+#include <xsde/cxx/string.hxx>
+
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct token_pimpl: virtual token_pskel
+#else
+ struct token_pimpl: token_pskel
+#endif
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual char*
+ post_token ();
+
+ protected:
+ string str_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_TOKEN_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/unsigned-byte.cxx b/libxsde/xsde/cxx/parser/validating/unsigned-byte.cxx
new file mode 100644
index 0000000..ace72f8
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/unsigned-byte.cxx
@@ -0,0 +1,66 @@
+// file : xsde/cxx/parser/validating/unsigned-byte.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <stdlib.h> // strtoul
+
+#include <xsde/cxx/parser/validating/unsigned-byte.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void unsigned_byte_pimpl::
+ _pre ()
+ {
+ size_ = 0;
+ sign_ = none;
+ state_ = leading_ws;
+ }
+
+ void unsigned_byte_pimpl::
+ _characters (const ro_string& s)
+ {
+ if (!parse (s, str_, 4))
+ _schema_error (schema_error::invalid_unsigned_byte_value);
+ }
+
+ void unsigned_byte_pimpl::
+ _post ()
+ {
+ ro_string tmp (str_, size_);
+ size_t size = trim_right (tmp);
+
+ if (size != 0 && sign_ != minus && tmp[0] != '-' && tmp[0] != '+')
+ {
+ str_[size] = '\0';
+
+ // No need to check errno since our string representation
+ // can never overflow an unsigned long.
+ //
+ char* p;
+ unsigned long ul = strtoul (str_, &p, 10);
+
+ if (*p != '\0' || ul > 255)
+ _schema_error (schema_error::invalid_unsigned_byte_value);
+
+ value_ = static_cast<unsigned char> (ul);
+ }
+ else
+ _schema_error (schema_error::invalid_unsigned_byte_value);
+ }
+
+ unsigned char unsigned_byte_pimpl::
+ post_unsigned_byte ()
+ {
+ return value_;
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/unsigned-byte.hxx b/libxsde/xsde/cxx/parser/validating/unsigned-byte.hxx
new file mode 100644
index 0000000..bec1e6d
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/unsigned-byte.hxx
@@ -0,0 +1,52 @@
+// file : xsde/cxx/parser/validating/unsigned-byte.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_UNSIGNED_BYTE_HXX
+#define XSDE_CXX_PARSER_VALIDATING_UNSIGNED_BYTE_HXX
+
+#include <xsde/cxx/parser/validating/number.hxx>
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ // 8-bit unsigned integer
+ //
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct unsigned_byte_pimpl: virtual unsigned_byte_pskel, number
+#else
+ struct unsigned_byte_pimpl: unsigned_byte_pskel, number
+#endif
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual unsigned char
+ post_unsigned_byte ();
+
+ protected:
+ // We only need strlen("0256") + 1 characters to hold all valid
+ // and trimmed string representations of unsigned byte.
+ //
+ char str_[5];
+ unsigned char value_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_UNSIGNED_BYTE_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/unsigned-int.cxx b/libxsde/xsde/cxx/parser/validating/unsigned-int.cxx
new file mode 100644
index 0000000..fbb18aa
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/unsigned-int.cxx
@@ -0,0 +1,66 @@
+// file : xsde/cxx/parser/validating/unsigned-int.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <stdlib.h> // strtoul
+
+#include <xsde/cxx/errno.hxx>
+
+#include <xsde/cxx/parser/validating/unsigned-int.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void unsigned_int_pimpl::
+ _pre ()
+ {
+ size_ = 0;
+ sign_ = none;
+ state_ = leading_ws;
+ }
+
+ void unsigned_int_pimpl::
+ _characters (const ro_string& s)
+ {
+ if (!parse (s, str_, 11))
+ _schema_error (schema_error::invalid_unsigned_int_value);
+ }
+
+ void unsigned_int_pimpl::
+ _post ()
+ {
+ ro_string tmp (str_, size_);
+ size_t size = trim_right (tmp);
+
+ if (size != 0 && sign_ != minus && tmp[0] != '-' && tmp[0] != '+')
+ {
+ str_[size] = '\0';
+
+ char* p;
+ set_errno (0);
+ unsigned long ul = strtoul (str_, &p, 10);
+
+ if (*p != '\0' || get_errno () != 0 || ul > 4294967295UL)
+ _schema_error (schema_error::invalid_unsigned_int_value);
+
+ value_ = static_cast<unsigned int> (ul);
+ }
+ else
+ _schema_error (schema_error::invalid_unsigned_int_value);
+ }
+
+ unsigned int unsigned_int_pimpl::
+ post_unsigned_int ()
+ {
+ return value_;
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/unsigned-int.hxx b/libxsde/xsde/cxx/parser/validating/unsigned-int.hxx
new file mode 100644
index 0000000..2811557
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/unsigned-int.hxx
@@ -0,0 +1,52 @@
+// file : xsde/cxx/parser/validating/unsigned-int.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_UNSIGNED_INT_HXX
+#define XSDE_CXX_PARSER_VALIDATING_UNSIGNED_INT_HXX
+
+#include <xsde/cxx/parser/validating/number.hxx>
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ // 32-bit unsigned integer
+ //
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct unsigned_int_pimpl: virtual unsigned_int_pskel, number
+#else
+ struct unsigned_int_pimpl: unsigned_int_pskel, number
+#endif
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual unsigned int
+ post_unsigned_int ();
+
+ protected:
+ // We only need strlen("04294967295") + 1 characters to hold all
+ // valid and trimmed string representations of unsigned int.
+ //
+ char str_[12];
+ unsigned int value_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_UNSIGNED_INT_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/unsigned-long-long.cxx b/libxsde/xsde/cxx/parser/validating/unsigned-long-long.cxx
new file mode 100644
index 0000000..5464028
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/unsigned-long-long.cxx
@@ -0,0 +1,64 @@
+// file : xsde/cxx/parser/validating/unsigned-long-long.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <stdlib.h> // strtoull
+
+#include <xsde/cxx/errno.hxx>
+
+#include <xsde/cxx/parser/validating/unsigned-long-long.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void unsigned_long_pimpl::
+ _pre ()
+ {
+ size_ = 0;
+ sign_ = none;
+ state_ = leading_ws;
+ }
+
+ void unsigned_long_pimpl::
+ _characters (const ro_string& s)
+ {
+ if (!parse (s, str_, 21))
+ _schema_error (schema_error::invalid_unsigned_long_value);
+ }
+
+ void unsigned_long_pimpl::
+ _post ()
+ {
+ ro_string tmp (str_, size_);
+ size_t size = trim_right (tmp);
+
+ if (size != 0 && sign_ != minus && tmp[0] != '-' && tmp[0] != '+')
+ {
+ str_[size] = '\0';
+
+ char* p;
+ set_errno (0);
+ value_ = strtoull (str_, &p, 10);
+
+ if (*p != '\0' || get_errno () != 0)
+ _schema_error (schema_error::invalid_unsigned_long_value);
+ }
+ else
+ _schema_error (schema_error::invalid_unsigned_long_value);
+ }
+
+ unsigned long long unsigned_long_pimpl::
+ post_unsigned_long ()
+ {
+ return value_;
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/unsigned-long-long.hxx b/libxsde/xsde/cxx/parser/validating/unsigned-long-long.hxx
new file mode 100644
index 0000000..b0aa4cb
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/unsigned-long-long.hxx
@@ -0,0 +1,53 @@
+// file : xsde/cxx/parser/validating/unsigned-long-long.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_UNSIGNED_LONG_LONG_HXX
+#define XSDE_CXX_PARSER_VALIDATING_UNSIGNED_LONG_LONG_HXX
+
+#include <xsde/cxx/parser/validating/number.hxx>
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ // 64-bit unsigned integer
+ //
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct unsigned_long_pimpl: virtual unsigned_long_pskel, number
+#else
+ struct unsigned_long_pimpl: unsigned_long_pskel, number
+#endif
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual unsigned long long
+ post_unsigned_long ();
+
+ protected:
+ // We only need strlen("018446744073709551615") + 1 characters to
+ // hold all valid and trimmed string representations of unsigned
+ // long long.
+ //
+ char str_[22];
+ unsigned long long value_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_UNSIGNED_LONG_LONG_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/unsigned-long.cxx b/libxsde/xsde/cxx/parser/validating/unsigned-long.cxx
new file mode 100644
index 0000000..eababbf
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/unsigned-long.cxx
@@ -0,0 +1,64 @@
+// file : xsde/cxx/parser/validating/unsigned-long.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <stdlib.h> // strtoul
+
+#include <xsde/cxx/errno.hxx>
+
+#include <xsde/cxx/parser/validating/unsigned-long.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void unsigned_long_pimpl::
+ _pre ()
+ {
+ size_ = 0;
+ sign_ = none;
+ state_ = leading_ws;
+ }
+
+ void unsigned_long_pimpl::
+ _characters (const ro_string& s)
+ {
+ if (!parse (s, str_, 21))
+ _schema_error (schema_error::invalid_unsigned_long_value);
+ }
+
+ void unsigned_long_pimpl::
+ _post ()
+ {
+ ro_string tmp (str_, size_);
+ size_t size = trim_right (tmp);
+
+ if (size != 0 && sign_ != minus && tmp[0] != '-' && tmp[0] != '+')
+ {
+ str_[size] = '\0';
+
+ char* p;
+ set_errno (0);
+ value_ = strtoul (str_, &p, 10);
+
+ if (*p != '\0' || get_errno () != 0)
+ _schema_error (schema_error::invalid_unsigned_long_value);
+ }
+ else
+ _schema_error (schema_error::invalid_unsigned_long_value);
+ }
+
+ unsigned long unsigned_long_pimpl::
+ post_unsigned_long ()
+ {
+ return value_;
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/unsigned-long.hxx b/libxsde/xsde/cxx/parser/validating/unsigned-long.hxx
new file mode 100644
index 0000000..6b2ac19
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/unsigned-long.hxx
@@ -0,0 +1,53 @@
+// file : xsde/cxx/parser/validating/unsigned-long.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_UNSIGNED_LONG_HXX
+#define XSDE_CXX_PARSER_VALIDATING_UNSIGNED_LONG_HXX
+
+#include <xsde/cxx/parser/validating/number.hxx>
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ // Fall-back implementation when 64 bit long long is not available.
+ //
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct unsigned_long_pimpl: virtual unsigned_long_pskel, number
+#else
+ struct unsigned_long_pimpl: unsigned_long_pskel, number
+#endif
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual unsigned long
+ post_unsigned_long ();
+
+ protected:
+ // We only need strlen("018446744073709551615") + 1 characters to
+ // hold all valid and trimmed string representations of unsigned
+ // long long.
+ //
+ char str_[22];
+ unsigned long value_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_UNSIGNED_LONG_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/unsigned-short.cxx b/libxsde/xsde/cxx/parser/validating/unsigned-short.cxx
new file mode 100644
index 0000000..b40b51c
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/unsigned-short.cxx
@@ -0,0 +1,66 @@
+// file : xsde/cxx/parser/validating/unsigned-short.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <stdlib.h> // strtoul
+
+#include <xsde/cxx/parser/validating/unsigned-short.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void unsigned_short_pimpl::
+ _pre ()
+ {
+ size_ = 0;
+ sign_ = none;
+ state_ = leading_ws;
+ }
+
+ void unsigned_short_pimpl::
+ _characters (const ro_string& s)
+ {
+ if (!parse (s, str_, 6))
+ _schema_error (schema_error::invalid_unsigned_short_value);
+ }
+
+ void unsigned_short_pimpl::
+ _post ()
+ {
+ ro_string tmp (str_, size_);
+ size_t size = trim_right (tmp);
+
+ if (size != 0 && sign_ != minus && tmp[0] != '-' && tmp[0] != '+')
+ {
+ str_[size] = '\0';
+
+ // No need to check errno since our string representation
+ // can never overflow an unsigned long.
+ //
+ char* p;
+ unsigned long ul = strtoul (str_, &p, 10);
+
+ if (*p != '\0' || ul > 65535)
+ _schema_error (schema_error::invalid_unsigned_short_value);
+
+ value_ = static_cast<unsigned short> (ul);
+ }
+ else
+ _schema_error (schema_error::invalid_unsigned_short_value);
+ }
+
+ unsigned short unsigned_short_pimpl::
+ post_unsigned_short ()
+ {
+ return value_;
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/unsigned-short.hxx b/libxsde/xsde/cxx/parser/validating/unsigned-short.hxx
new file mode 100644
index 0000000..be7228a
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/unsigned-short.hxx
@@ -0,0 +1,52 @@
+// file : xsde/cxx/parser/validating/unsigned-short.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_UNSIGNED_SHORT_HXX
+#define XSDE_CXX_PARSER_VALIDATING_UNSIGNED_SHORT_HXX
+
+#include <xsde/cxx/parser/validating/number.hxx>
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ // 16-bit unsigned integer
+ //
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct unsigned_short_pimpl: virtual unsigned_short_pskel, number
+#else
+ struct unsigned_short_pimpl: unsigned_short_pskel, number
+#endif
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual void
+ _post ();
+
+ virtual unsigned short
+ post_unsigned_short ();
+
+ protected:
+ // We only need strlen("065535") + 1 characters to hold all valid
+ // and trimmed string representations of unsigned short.
+ //
+ char str_[7];
+ unsigned short value_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_UNSIGNED_SHORT_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/uri-stl.cxx b/libxsde/xsde/cxx/parser/validating/uri-stl.cxx
new file mode 100644
index 0000000..c2947dd
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/uri-stl.cxx
@@ -0,0 +1,53 @@
+// file : xsde/cxx/parser/validating/uri-stl.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <xsde/cxx/parser/validating/uri-stl.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void uri_pimpl::
+ _pre ()
+ {
+ str_.erase ();
+ }
+
+ void uri_pimpl::
+ _characters (const ro_string& s)
+ {
+ if (str_.size () == 0)
+ {
+ ro_string tmp (s.data (), s.size ());
+
+ if (trim_left (tmp) != 0)
+ str_ += tmp;
+ }
+ else
+ str_ += s;
+ }
+
+ std::string uri_pimpl::
+ post_uri ()
+ {
+ // According to Datatypes 3.2.17 and RFC2396 pretty much anything
+ // can be a URI and conforming processors do not need to figure
+ // out and verify particular URI schemes.
+ //
+ ro_string tmp (str_);
+ str_.resize (trim_right (tmp));
+
+ std::string r;
+ r.swap (str_);
+ return r;
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/uri-stl.hxx b/libxsde/xsde/cxx/parser/validating/uri-stl.hxx
new file mode 100644
index 0000000..b964aff
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/uri-stl.hxx
@@ -0,0 +1,44 @@
+// file : xsde/cxx/parser/validating/uri-stl.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_URI_STL_HXX
+#define XSDE_CXX_PARSER_VALIDATING_URI_STL_HXX
+
+#include <string>
+
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct uri_pimpl: virtual uri_pskel
+#else
+ struct uri_pimpl: uri_pskel
+#endif
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual std::string
+ post_uri ();
+
+ protected:
+ std::string str_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_URI_STL_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/uri.cxx b/libxsde/xsde/cxx/parser/validating/uri.cxx
new file mode 100644
index 0000000..37acfea
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/uri.cxx
@@ -0,0 +1,71 @@
+// file : xsde/cxx/parser/validating/uri.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <xsde/cxx/config.hxx>
+
+#include <xsde/cxx/parser/validating/uri.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void uri_pimpl::
+ _pre ()
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.assign ("", 0);
+#else
+ if (str_.assign ("", 0))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+
+ void uri_pimpl::
+ _characters (const ro_string& s)
+ {
+ if (str_.size () == 0)
+ {
+ ro_string tmp (s.data (), s.size ());
+
+ if (trim_left (tmp) != 0)
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.append (tmp.data (), tmp.size ());
+#else
+ if (str_.append (tmp.data (), tmp.size ()))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+ }
+ else
+ {
+#ifdef XSDE_EXCEPTIONS
+ str_.append (s.data (), s.size ());
+#else
+ if (str_.append (s.data (), s.size ()))
+ _sys_error (sys_error::no_memory);
+#endif
+ }
+ }
+
+ char* uri_pimpl::
+ post_uri ()
+ {
+ // According to Datatypes 3.2.17 and RFC2396 pretty much anything
+ // can be a URI and conforming processors do not need to figure
+ // out and verify particular URI schemes.
+ //
+ ro_string tmp (str_);
+ str_.truncate (trim_right (tmp));
+ return str_.detach ();
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/uri.hxx b/libxsde/xsde/cxx/parser/validating/uri.hxx
new file mode 100644
index 0000000..2e19aef
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/uri.hxx
@@ -0,0 +1,44 @@
+// file : xsde/cxx/parser/validating/uri.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_URI_HXX
+#define XSDE_CXX_PARSER_VALIDATING_URI_HXX
+
+#include <xsde/cxx/string.hxx>
+
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+#ifdef XSDE_REUSE_STYLE_MIXIN
+ struct uri_pimpl: virtual uri_pskel
+#else
+ struct uri_pimpl: uri_pskel
+#endif
+ {
+ virtual void
+ _pre ();
+
+ virtual void
+ _characters (const ro_string&);
+
+ virtual char*
+ post_uri ();
+
+ protected:
+ string str_;
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_URI_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/xml-schema-pimpl.hxx b/libxsde/xsde/cxx/parser/validating/xml-schema-pimpl.hxx
new file mode 100644
index 0000000..7552521
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/xml-schema-pimpl.hxx
@@ -0,0 +1,82 @@
+// file : xsde/cxx/parser/validating/xml-schema-pimpl.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_XML_SCHEMA_PIMPL_HXX
+#define XSDE_CXX_PARSER_VALIDATING_XML_SCHEMA_PIMPL_HXX
+
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+#include <xsde/cxx/parser/validating/any-type.hxx>
+#include <xsde/cxx/parser/validating/boolean.hxx>
+#include <xsde/cxx/parser/validating/byte.hxx>
+#include <xsde/cxx/parser/validating/unsigned-byte.hxx>
+#include <xsde/cxx/parser/validating/byte.hxx>
+#include <xsde/cxx/parser/validating/unsigned-byte.hxx>
+#include <xsde/cxx/parser/validating/short.hxx>
+#include <xsde/cxx/parser/validating/unsigned-short.hxx>
+#include <xsde/cxx/parser/validating/int.hxx>
+#include <xsde/cxx/parser/validating/unsigned-int.hxx>
+
+#ifdef XSDE_LONGLONG
+# include <xsde/cxx/parser/validating/long-long.hxx>
+# include <xsde/cxx/parser/validating/unsigned-long-long.hxx>
+#else
+# include <xsde/cxx/parser/validating/long.hxx>
+# include <xsde/cxx/parser/validating/unsigned-long.hxx>
+#endif
+
+#include <xsde/cxx/parser/validating/integer.hxx>
+#include <xsde/cxx/parser/validating/negative-integer.hxx>
+#include <xsde/cxx/parser/validating/non-positive-integer.hxx>
+#include <xsde/cxx/parser/validating/positive-integer.hxx>
+#include <xsde/cxx/parser/validating/non-negative-integer.hxx>
+#include <xsde/cxx/parser/validating/float.hxx>
+#include <xsde/cxx/parser/validating/double.hxx>
+#include <xsde/cxx/parser/validating/decimal.hxx>
+
+#ifdef XSDE_STL
+# include <xsde/cxx/parser/validating/string-stl.hxx>
+# include <xsde/cxx/parser/validating/normalized-string-stl.hxx>
+# include <xsde/cxx/parser/validating/token-stl.hxx>
+# include <xsde/cxx/parser/validating/name-stl.hxx>
+# include <xsde/cxx/parser/validating/nmtoken-stl.hxx>
+# include <xsde/cxx/parser/validating/nmtokens-stl.hxx>
+# include <xsde/cxx/parser/validating/ncname-stl.hxx>
+# include <xsde/cxx/parser/validating/id-stl.hxx>
+# include <xsde/cxx/parser/validating/idref-stl.hxx>
+# include <xsde/cxx/parser/validating/idrefs-stl.hxx>
+# include <xsde/cxx/parser/validating/language-stl.hxx>
+# include <xsde/cxx/parser/validating/uri-stl.hxx>
+# include <xsde/cxx/parser/validating/qname-stl.hxx>
+#else
+# include <xsde/cxx/parser/validating/string.hxx>
+# include <xsde/cxx/parser/validating/normalized-string.hxx>
+# include <xsde/cxx/parser/validating/token.hxx>
+# include <xsde/cxx/parser/validating/name.hxx>
+# include <xsde/cxx/parser/validating/nmtoken.hxx>
+# include <xsde/cxx/parser/validating/nmtokens.hxx>
+# include <xsde/cxx/parser/validating/ncname.hxx>
+# include <xsde/cxx/parser/validating/id.hxx>
+# include <xsde/cxx/parser/validating/idref.hxx>
+# include <xsde/cxx/parser/validating/idrefs.hxx>
+# include <xsde/cxx/parser/validating/language.hxx>
+# include <xsde/cxx/parser/validating/uri.hxx>
+# include <xsde/cxx/parser/validating/qname.hxx>
+#endif
+
+#include <xsde/cxx/parser/validating/base64-binary.hxx>
+#include <xsde/cxx/parser/validating/hex-binary.hxx>
+
+#include <xsde/cxx/parser/validating/gday.hxx>
+#include <xsde/cxx/parser/validating/gmonth.hxx>
+#include <xsde/cxx/parser/validating/gyear.hxx>
+#include <xsde/cxx/parser/validating/gmonth-day.hxx>
+#include <xsde/cxx/parser/validating/gyear-month.hxx>
+#include <xsde/cxx/parser/validating/date.hxx>
+#include <xsde/cxx/parser/validating/time.hxx>
+#include <xsde/cxx/parser/validating/date-time.hxx>
+#include <xsde/cxx/parser/validating/duration.hxx>
+
+#endif // XSDE_CXX_PARSER_VALIDATING_XML_SCHEMA_PIMPL_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/xml-schema-pskel.cxx b/libxsde/xsde/cxx/parser/validating/xml-schema-pskel.cxx
new file mode 100644
index 0000000..894f674
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/xml-schema-pskel.cxx
@@ -0,0 +1,617 @@
+// file : xsde/cxx/parser/validating/xml-schema-pskel.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ // any_type
+ //
+#ifdef XSDE_POLYMORPHIC
+ bool any_type_pskel::
+ _start_element_impl (const ro_string& ns,
+ const ro_string& name,
+ const char* type)
+ {
+ context& ctx = _context ();
+ ctx.current_.any_ = true;
+ ctx.current_.depth_++;
+
+ _start_any_element (ns, name, type);
+ return true;
+ }
+#else
+ bool any_type_pskel::
+ _start_element_impl (const ro_string& ns, const ro_string& name)
+ {
+ context& ctx = _context ();
+ ctx.current_.any_ = true;
+ ctx.current_.depth_++;
+
+ _start_any_element (ns, name);
+ return true;
+ }
+#endif
+
+ bool any_type_pskel::
+ _end_element_impl (const ro_string& ns, const ro_string& name)
+ {
+ _end_any_element (ns, name);
+ return true;
+ }
+
+ bool any_type_pskel::
+ _attribute_impl_phase_two (const ro_string& ns,
+ const ro_string& name,
+ const ro_string& value)
+ {
+ _any_attribute (ns, name, value);
+ return true;
+ }
+
+ bool any_type_pskel::
+ _characters_impl (const ro_string& s)
+ {
+ _any_characters (s);
+ return true;
+ }
+
+ void any_type_pskel::
+ post_any_type ()
+ {
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ if (any_type_impl_)
+ any_type_impl_->post_any_type ();
+#endif
+ }
+
+ // any_simple_type
+ //
+ bool any_simple_type_pskel::
+ _characters_impl (const ro_string& s)
+ {
+ _any_characters (s);
+ return true;
+ }
+
+ void any_simple_type_pskel::
+ post_any_simple_type ()
+ {
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ if (any_simple_type_impl_)
+ any_simple_type_impl_->post_any_simple_type ();
+#endif
+ }
+
+ // static/dynamic_type function implementations.
+ //
+#ifdef XSDE_POLYMORPHIC
+ const char* any_type_pskel::
+ _static_type ()
+ {
+ return "anyType http://www.w3.org/2001/XMLSchema";
+ }
+
+ const char* any_type_pskel::
+ _dynamic_type () const
+ {
+ return _static_type ();
+ }
+
+ const char* any_simple_type_pskel::
+ _static_type ()
+ {
+ return "anySimpleType http://www.w3.org/2001/XMLSchema";
+ }
+
+ const char* any_simple_type_pskel::
+ _dynamic_type () const
+ {
+ return _static_type ();
+ }
+
+ const char* boolean_pskel::
+ _static_type ()
+ {
+ return "boolean http://www.w3.org/2001/XMLSchema";
+ }
+
+ const char* boolean_pskel::
+ _dynamic_type () const
+ {
+ return _static_type ();
+ }
+
+ const char* byte_pskel::
+ _static_type ()
+ {
+ return "byte http://www.w3.org/2001/XMLSchema";
+ }
+
+ const char* byte_pskel::
+ _dynamic_type () const
+ {
+ return _static_type ();
+ }
+
+ const char* unsigned_byte_pskel::
+ _static_type ()
+ {
+ return "unsignedByte http://www.w3.org/2001/XMLSchema";
+ }
+
+ const char* unsigned_byte_pskel::
+ _dynamic_type () const
+ {
+ return _static_type ();
+ }
+
+ const char* short_pskel::
+ _static_type ()
+ {
+ return "short http://www.w3.org/2001/XMLSchema";
+ }
+
+ const char* short_pskel::
+ _dynamic_type () const
+ {
+ return _static_type ();
+ }
+
+ const char* unsigned_short_pskel::
+ _static_type ()
+ {
+ return "unsignedShort http://www.w3.org/2001/XMLSchema";
+ }
+
+ const char* unsigned_short_pskel::
+ _dynamic_type () const
+ {
+ return _static_type ();
+ }
+
+ const char* int_pskel::
+ _static_type ()
+ {
+ return "int http://www.w3.org/2001/XMLSchema";
+ }
+
+ const char* int_pskel::
+ _dynamic_type () const
+ {
+ return _static_type ();
+ }
+
+ const char* unsigned_int_pskel::
+ _static_type ()
+ {
+ return "unsignedInt http://www.w3.org/2001/XMLSchema";
+ }
+
+ const char* unsigned_int_pskel::
+ _dynamic_type () const
+ {
+ return _static_type ();
+ }
+
+ const char* long_pskel::
+ _static_type ()
+ {
+ return "long http://www.w3.org/2001/XMLSchema";
+ }
+
+ const char* long_pskel::
+ _dynamic_type () const
+ {
+ return _static_type ();
+ }
+
+ const char* unsigned_long_pskel::
+ _static_type ()
+ {
+ return "unsignedLong http://www.w3.org/2001/XMLSchema";
+ }
+
+ const char* unsigned_long_pskel::
+ _dynamic_type () const
+ {
+ return _static_type ();
+ }
+
+ const char* integer_pskel::
+ _static_type ()
+ {
+ return "integer http://www.w3.org/2001/XMLSchema";
+ }
+
+ const char* integer_pskel::
+ _dynamic_type () const
+ {
+ return _static_type ();
+ }
+
+ const char* negative_integer_pskel::
+ _static_type ()
+ {
+ return "negativeInteger http://www.w3.org/2001/XMLSchema";
+ }
+
+ const char* negative_integer_pskel::
+ _dynamic_type () const
+ {
+ return _static_type ();
+ }
+
+ const char* non_positive_integer_pskel::
+ _static_type ()
+ {
+ return "nonPositiveInteger http://www.w3.org/2001/XMLSchema";
+ }
+
+ const char* non_positive_integer_pskel::
+ _dynamic_type () const
+ {
+ return _static_type ();
+ }
+
+ const char* positive_integer_pskel::
+ _static_type ()
+ {
+ return "positiveInteger http://www.w3.org/2001/XMLSchema";
+ }
+
+ const char* positive_integer_pskel::
+ _dynamic_type () const
+ {
+ return _static_type ();
+ }
+
+ const char* non_negative_integer_pskel::
+ _static_type ()
+ {
+ return "nonNegativeInteger http://www.w3.org/2001/XMLSchema";
+ }
+
+ const char* non_negative_integer_pskel::
+ _dynamic_type () const
+ {
+ return _static_type ();
+ }
+
+ const char* float_pskel::
+ _static_type ()
+ {
+ return "float http://www.w3.org/2001/XMLSchema";
+ }
+
+ const char* float_pskel::
+ _dynamic_type () const
+ {
+ return _static_type ();
+ }
+
+ const char* double_pskel::
+ _static_type ()
+ {
+ return "double http://www.w3.org/2001/XMLSchema";
+ }
+
+ const char* double_pskel::
+ _dynamic_type () const
+ {
+ return _static_type ();
+ }
+
+ const char* decimal_pskel::
+ _static_type ()
+ {
+ return "decimal http://www.w3.org/2001/XMLSchema";
+ }
+
+ const char* decimal_pskel::
+ _dynamic_type () const
+ {
+ return _static_type ();
+ }
+
+ const char* string_pskel::
+ _static_type ()
+ {
+ return "string http://www.w3.org/2001/XMLSchema";
+ }
+
+ const char* string_pskel::
+ _dynamic_type () const
+ {
+ return _static_type ();
+ }
+
+ const char* normalized_string_pskel::
+ _static_type ()
+ {
+ return "normalizedString http://www.w3.org/2001/XMLSchema";
+ }
+
+ const char* normalized_string_pskel::
+ _dynamic_type () const
+ {
+ return _static_type ();
+ }
+
+ const char* token_pskel::
+ _static_type ()
+ {
+ return "token http://www.w3.org/2001/XMLSchema";
+ }
+
+ const char* token_pskel::
+ _dynamic_type () const
+ {
+ return _static_type ();
+ }
+
+ const char* name_pskel::
+ _static_type ()
+ {
+ return "Name http://www.w3.org/2001/XMLSchema";
+ }
+
+ const char* name_pskel::
+ _dynamic_type () const
+ {
+ return _static_type ();
+ }
+
+ const char* nmtoken_pskel::
+ _static_type ()
+ {
+ return "NMTOKEN http://www.w3.org/2001/XMLSchema";
+ }
+
+ const char* nmtoken_pskel::
+ _dynamic_type () const
+ {
+ return _static_type ();
+ }
+
+ const char* nmtokens_pskel::
+ _static_type ()
+ {
+ return "NMTOKENS http://www.w3.org/2001/XMLSchema";
+ }
+
+ const char* nmtokens_pskel::
+ _dynamic_type () const
+ {
+ return _static_type ();
+ }
+
+ const char* ncname_pskel::
+ _static_type ()
+ {
+ return "NCName http://www.w3.org/2001/XMLSchema";
+ }
+
+ const char* ncname_pskel::
+ _dynamic_type () const
+ {
+ return _static_type ();
+ }
+
+ const char* id_pskel::
+ _static_type ()
+ {
+ return "ID http://www.w3.org/2001/XMLSchema";
+ }
+
+ const char* id_pskel::
+ _dynamic_type () const
+ {
+ return _static_type ();
+ }
+
+ const char* idref_pskel::
+ _static_type ()
+ {
+ return "IDREF http://www.w3.org/2001/XMLSchema";
+ }
+
+ const char* idref_pskel::
+ _dynamic_type () const
+ {
+ return _static_type ();
+ }
+
+ const char* idrefs_pskel::
+ _static_type ()
+ {
+ return "IDREFS http://www.w3.org/2001/XMLSchema";
+ }
+
+ const char* idrefs_pskel::
+ _dynamic_type () const
+ {
+ return _static_type ();
+ }
+
+ const char* language_pskel::
+ _static_type ()
+ {
+ return "language http://www.w3.org/2001/XMLSchema";
+ }
+
+ const char* language_pskel::
+ _dynamic_type () const
+ {
+ return _static_type ();
+ }
+
+ const char* uri_pskel::
+ _static_type ()
+ {
+ return "anyURI http://www.w3.org/2001/XMLSchema";
+ }
+
+ const char* uri_pskel::
+ _dynamic_type () const
+ {
+ return _static_type ();
+ }
+
+ const char* qname_pskel::
+ _static_type ()
+ {
+ return "QName http://www.w3.org/2001/XMLSchema";
+ }
+
+ const char* qname_pskel::
+ _dynamic_type () const
+ {
+ return _static_type ();
+ }
+
+ const char* base64_binary_pskel::
+ _static_type ()
+ {
+ return "base64Binary http://www.w3.org/2001/XMLSchema";
+ }
+
+ const char* base64_binary_pskel::
+ _dynamic_type () const
+ {
+ return _static_type ();
+ }
+
+ const char* hex_binary_pskel::
+ _static_type ()
+ {
+ return "hexBinary http://www.w3.org/2001/XMLSchema";
+ }
+
+ const char* hex_binary_pskel::
+ _dynamic_type () const
+ {
+ return _static_type ();
+ }
+
+ const char* gday_pskel::
+ _static_type ()
+ {
+ return "gDay http://www.w3.org/2001/XMLSchema";
+ }
+
+ const char* gday_pskel::
+ _dynamic_type () const
+ {
+ return _static_type ();
+ }
+
+ const char* gmonth_pskel::
+ _static_type ()
+ {
+ return "gMonth http://www.w3.org/2001/XMLSchema";
+ }
+
+ const char* gmonth_pskel::
+ _dynamic_type () const
+ {
+ return _static_type ();
+ }
+
+ const char* gyear_pskel::
+ _static_type ()
+ {
+ return "gYear http://www.w3.org/2001/XMLSchema";
+ }
+
+ const char* gyear_pskel::
+ _dynamic_type () const
+ {
+ return _static_type ();
+ }
+
+ const char* gmonth_day_pskel::
+ _static_type ()
+ {
+ return "gMonthDay http://www.w3.org/2001/XMLSchema";
+ }
+
+ const char* gmonth_day_pskel::
+ _dynamic_type () const
+ {
+ return _static_type ();
+ }
+
+ const char* gyear_month_pskel::
+ _static_type ()
+ {
+ return "gYearMonth http://www.w3.org/2001/XMLSchema";
+ }
+
+ const char* gyear_month_pskel::
+ _dynamic_type () const
+ {
+ return _static_type ();
+ }
+
+ const char* date_pskel::
+ _static_type ()
+ {
+ return "date http://www.w3.org/2001/XMLSchema";
+ }
+
+ const char* date_pskel::
+ _dynamic_type () const
+ {
+ return _static_type ();
+ }
+
+ const char* time_pskel::
+ _static_type ()
+ {
+ return "time http://www.w3.org/2001/XMLSchema";
+ }
+
+ const char* time_pskel::
+ _dynamic_type () const
+ {
+ return _static_type ();
+ }
+
+ const char* date_time_pskel::
+ _static_type ()
+ {
+ return "dateTime http://www.w3.org/2001/XMLSchema";
+ }
+
+ const char* date_time_pskel::
+ _dynamic_type () const
+ {
+ return _static_type ();
+ }
+
+ const char* duration_pskel::
+ _static_type ()
+ {
+ return "duration http://www.w3.org/2001/XMLSchema";
+ }
+
+ const char* duration_pskel::
+ _dynamic_type () const
+ {
+ return _static_type ();
+ }
+#endif // XSDE_POLYMORPHIC
+ }
+ }
+ }
+}
+
diff --git a/libxsde/xsde/cxx/parser/validating/xml-schema-pskel.hxx b/libxsde/xsde/cxx/parser/validating/xml-schema-pskel.hxx
new file mode 100644
index 0000000..8f9e33a
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/xml-schema-pskel.hxx
@@ -0,0 +1,1385 @@
+// file : xsde/cxx/parser/validating/xml-schema-pskel.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_XML_SCHEMA_PSKEL_HXX
+#define XSDE_CXX_PARSER_VALIDATING_XML_SCHEMA_PSKEL_HXX
+
+#include <xsde/cxx/config.hxx>
+
+#ifdef XSDE_STL
+# include <string>
+#endif
+
+#include <xsde/cxx/parser/xml-schema.hxx>
+
+#include <xsde/cxx/parser/validating/parser.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ // anyType and anySimpleType. All events are routed to the
+ // _any_* callbacks.
+ //
+ struct any_type_pskel: complex_content
+ {
+#ifdef XSDE_POLYMORPHIC
+ virtual bool
+ _start_element_impl (const ro_string&,
+ const ro_string&,
+ const char*);
+#else
+ virtual bool
+ _start_element_impl (const ro_string&, const ro_string&);
+#endif
+
+ virtual bool
+ _end_element_impl (const ro_string&, const ro_string&);
+
+ virtual bool
+ _attribute_impl_phase_two (const ro_string&,
+ const ro_string&,
+ const ro_string&);
+
+ virtual bool
+ _characters_impl (const ro_string&);
+
+ virtual void
+ post_any_type ();
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ any_type_pskel ();
+ any_type_pskel (any_type_pskel* impl, void*);
+
+ protected:
+ any_type_pskel* any_type_impl_;
+#endif
+ };
+
+ struct any_simple_type_pskel: simple_content
+ {
+ virtual bool
+ _characters_impl (const ro_string&);
+
+ virtual void
+ post_any_simple_type ();
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ any_simple_type_pskel ();
+ any_simple_type_pskel (any_simple_type_pskel* impl, void*);
+
+ protected:
+ any_simple_type_pskel* any_simple_type_impl_;
+#endif
+ };
+
+
+ // Boolean.
+ //
+ struct boolean_pskel: simple_content
+ {
+ virtual bool
+ post_boolean () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ boolean_pskel ();
+ boolean_pskel (boolean_pskel* impl, void*);
+
+ protected:
+ boolean_pskel* boolean_impl_;
+#endif
+ };
+
+
+ // 8-bit
+ //
+
+ struct byte_pskel: simple_content
+ {
+ virtual signed char
+ post_byte () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ byte_pskel ();
+ byte_pskel (byte_pskel* impl, void*);
+
+ protected:
+ byte_pskel* byte_impl_;
+#endif
+ };
+
+ struct unsigned_byte_pskel: simple_content
+ {
+ virtual unsigned char
+ post_unsigned_byte () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ unsigned_byte_pskel ();
+ unsigned_byte_pskel (unsigned_byte_pskel* impl, void*);
+
+ protected:
+ unsigned_byte_pskel* unsigned_byte_impl_;
+#endif
+ };
+
+
+ // 16-bit
+ //
+
+ struct short_pskel: simple_content
+ {
+ virtual short
+ post_short () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ short_pskel ();
+ short_pskel (short_pskel* impl, void*);
+
+ protected:
+ short_pskel* short_impl_;
+#endif
+ };
+
+ struct unsigned_short_pskel: simple_content
+ {
+ virtual unsigned short
+ post_unsigned_short () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ unsigned_short_pskel ();
+ unsigned_short_pskel (unsigned_short_pskel* impl, void*);
+
+ protected:
+ unsigned_short_pskel* unsigned_short_impl_;
+#endif
+ };
+
+
+ // 32-bit
+ //
+
+ struct int_pskel: simple_content
+ {
+ virtual int
+ post_int () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ int_pskel ();
+ int_pskel (int_pskel* impl, void*);
+
+ protected:
+ int_pskel* int_impl_;
+#endif
+ };
+
+ struct unsigned_int_pskel: simple_content
+ {
+ virtual unsigned int
+ post_unsigned_int () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ unsigned_int_pskel ();
+ unsigned_int_pskel (unsigned_int_pskel* impl, void*);
+
+ protected:
+ unsigned_int_pskel* unsigned_int_impl_;
+#endif
+ };
+
+
+ // 64-bit
+ //
+#ifdef XSDE_LONGLONG
+
+ struct long_pskel: simple_content
+ {
+ virtual long long
+ post_long () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ long_pskel ();
+ long_pskel (long_pskel* impl, void*);
+
+ protected:
+ long_pskel* long_impl_;
+#endif
+ };
+
+ struct unsigned_long_pskel: simple_content
+ {
+ virtual unsigned long long
+ post_unsigned_long () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ unsigned_long_pskel ();
+ unsigned_long_pskel (unsigned_long_pskel* impl, void*);
+
+ protected:
+ unsigned_long_pskel* unsigned_long_impl_;
+#endif
+ };
+
+#else
+
+ struct long_pskel: simple_content
+ {
+ virtual long
+ post_long () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ long_pskel ();
+ long_pskel (long_pskel* impl, void*);
+
+ protected:
+ long_pskel* long_impl_;
+#endif
+ };
+
+ struct unsigned_long_pskel: simple_content
+ {
+ virtual unsigned long
+ post_unsigned_long () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ unsigned_long_pskel ();
+ unsigned_long_pskel (unsigned_long_pskel* impl, void*);
+
+ protected:
+ unsigned_long_pskel* unsigned_long_impl_;
+#endif
+ };
+#endif
+
+
+ // Arbitrary-length integers.
+ //
+
+ struct integer_pskel: simple_content
+ {
+ virtual long
+ post_integer () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ integer_pskel ();
+ integer_pskel (integer_pskel* impl, void*);
+
+ protected:
+ integer_pskel* integer_impl_;
+#endif
+ };
+
+ struct negative_integer_pskel: simple_content
+ {
+ virtual long
+ post_negative_integer () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ negative_integer_pskel ();
+ negative_integer_pskel (negative_integer_pskel* impl, void*);
+
+ protected:
+ negative_integer_pskel* negative_integer_impl_;
+#endif
+ };
+
+ struct non_positive_integer_pskel: simple_content
+ {
+ virtual long
+ post_non_positive_integer () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ non_positive_integer_pskel ();
+ non_positive_integer_pskel (non_positive_integer_pskel* impl, void*);
+
+ protected:
+ non_positive_integer_pskel* non_positive_integer_impl_;
+#endif
+ };
+
+ struct positive_integer_pskel: simple_content
+ {
+ virtual unsigned long
+ post_positive_integer () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ positive_integer_pskel ();
+ positive_integer_pskel (positive_integer_pskel* impl, void*);
+
+ protected:
+ positive_integer_pskel* positive_integer_impl_;
+#endif
+ };
+
+ struct non_negative_integer_pskel: simple_content
+ {
+ virtual unsigned long
+ post_non_negative_integer () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ non_negative_integer_pskel ();
+ non_negative_integer_pskel (non_negative_integer_pskel* impl, void*);
+
+ protected:
+ non_negative_integer_pskel* non_negative_integer_impl_;
+#endif
+ };
+
+
+ // Floats.
+ //
+
+ struct float_pskel: simple_content
+ {
+ virtual float
+ post_float () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ float_pskel ();
+ float_pskel (float_pskel* impl, void*);
+
+ protected:
+ float_pskel* float_impl_;
+#endif
+ };
+
+ struct double_pskel: simple_content
+ {
+ virtual double
+ post_double () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ double_pskel ();
+ double_pskel (double_pskel* impl, void*);
+
+ protected:
+ double_pskel* double_impl_;
+#endif
+ };
+
+ struct decimal_pskel: simple_content
+ {
+ virtual double
+ post_decimal () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ decimal_pskel ();
+ decimal_pskel (decimal_pskel* impl, void*);
+
+ protected:
+ decimal_pskel* decimal_impl_;
+#endif
+ };
+
+
+ // String-based types.
+ //
+#ifdef XSDE_STL
+
+ struct string_pskel: simple_content
+ {
+ virtual std::string
+ post_string () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ string_pskel ();
+ string_pskel (string_pskel* impl, void*);
+
+ protected:
+ string_pskel* string_impl_;
+#endif
+ };
+
+ struct normalized_string_pskel: simple_content
+ {
+ virtual std::string
+ post_normalized_string () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ normalized_string_pskel ();
+ normalized_string_pskel (normalized_string_pskel* impl, void*);
+
+ protected:
+ normalized_string_pskel* normalized_string_impl_;
+#endif
+ };
+
+ struct token_pskel: simple_content
+ {
+ virtual std::string
+ post_token () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ token_pskel ();
+ token_pskel (token_pskel* impl, void*);
+
+ protected:
+ token_pskel* token_impl_;
+#endif
+ };
+
+ struct name_pskel: simple_content
+ {
+ virtual std::string
+ post_name () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ name_pskel ();
+ name_pskel (name_pskel* impl, void*);
+
+ protected:
+ name_pskel* name_impl_;
+#endif
+ };
+
+ struct nmtoken_pskel: simple_content
+ {
+ virtual std::string
+ post_nmtoken () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ nmtoken_pskel ();
+ nmtoken_pskel (nmtoken_pskel* impl, void*);
+
+ protected:
+ nmtoken_pskel* nmtoken_impl_;
+#endif
+ };
+
+ struct nmtokens_pskel: list_base
+ {
+ virtual string_sequence*
+ post_nmtokens () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ nmtokens_pskel ();
+ nmtokens_pskel (nmtokens_pskel* impl, void*);
+
+ protected:
+ nmtokens_pskel* nmtokens_impl_;
+#endif
+ };
+
+ struct ncname_pskel: simple_content
+ {
+ virtual std::string
+ post_ncname () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ ncname_pskel ();
+ ncname_pskel (ncname_pskel* impl, void*);
+
+ protected:
+ ncname_pskel* ncname_impl_;
+#endif
+ };
+
+ struct id_pskel: simple_content
+ {
+ virtual std::string
+ post_id () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ id_pskel ();
+ id_pskel (id_pskel* impl, void*);
+
+ protected:
+ id_pskel* id_impl_;
+#endif
+ };
+
+ struct idref_pskel: simple_content
+ {
+ virtual std::string
+ post_idref () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ idref_pskel ();
+ idref_pskel (idref_pskel* impl, void*);
+
+ protected:
+ idref_pskel* idref_impl_;
+#endif
+ };
+
+ struct idrefs_pskel: list_base
+ {
+ virtual string_sequence*
+ post_idrefs () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ idrefs_pskel ();
+ idrefs_pskel (idrefs_pskel* impl, void*);
+
+ protected:
+ idrefs_pskel* idrefs_impl_;
+#endif
+ };
+
+ struct language_pskel: simple_content
+ {
+ virtual std::string
+ post_language () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ language_pskel ();
+ language_pskel (language_pskel* impl, void*);
+
+ protected:
+ language_pskel* language_impl_;
+#endif
+ };
+
+ struct uri_pskel: simple_content
+ {
+ virtual std::string
+ post_uri () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ uri_pskel ();
+ uri_pskel (uri_pskel* impl, void*);
+
+ protected:
+ uri_pskel* uri_impl_;
+#endif
+ };
+
+ struct qname_pskel: simple_content
+ {
+ virtual qname
+ post_qname () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ qname_pskel ();
+ qname_pskel (qname_pskel* impl, void*);
+
+ protected:
+ qname_pskel* qname_impl_;
+#endif
+ };
+
+#else // XSDE_STL
+
+ // Note that in this case you are getting a C string that you
+ // have to delete with delete[].
+ //
+ struct string_pskel: simple_content
+ {
+ virtual char*
+ post_string () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ string_pskel ();
+ string_pskel (string_pskel* impl, void*);
+
+ protected:
+ string_pskel* string_impl_;
+#endif
+ };
+
+ struct normalized_string_pskel: simple_content
+ {
+ virtual char*
+ post_normalized_string () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ normalized_string_pskel ();
+ normalized_string_pskel (normalized_string_pskel* impl, void*);
+
+ protected:
+ normalized_string_pskel* normalized_string_impl_;
+#endif
+ };
+
+ struct token_pskel: simple_content
+ {
+ virtual char*
+ post_token () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ token_pskel ();
+ token_pskel (token_pskel* impl, void*);
+
+ protected:
+ token_pskel* token_impl_;
+#endif
+ };
+
+ struct name_pskel: simple_content
+ {
+ virtual char*
+ post_name () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ name_pskel ();
+ name_pskel (name_pskel* impl, void*);
+
+ protected:
+ name_pskel* name_impl_;
+#endif
+ };
+
+ struct nmtoken_pskel: simple_content
+ {
+ virtual char*
+ post_nmtoken () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ nmtoken_pskel ();
+ nmtoken_pskel (nmtoken_pskel* impl, void*);
+
+ protected:
+ nmtoken_pskel* nmtoken_impl_;
+#endif
+ };
+
+ struct nmtokens_pskel: list_base
+ {
+ virtual string_sequence*
+ post_nmtokens () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ nmtokens_pskel ();
+ nmtokens_pskel (nmtokens_pskel* impl, void*);
+
+ protected:
+ nmtokens_pskel* nmtokens_impl_;
+#endif
+ };
+
+ struct ncname_pskel: simple_content
+ {
+ virtual char*
+ post_ncname () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ ncname_pskel ();
+ ncname_pskel (ncname_pskel* impl, void*);
+
+ protected:
+ ncname_pskel* ncname_impl_;
+#endif
+ };
+
+ struct id_pskel: simple_content
+ {
+ virtual char*
+ post_id () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ id_pskel ();
+ id_pskel (id_pskel* impl, void*);
+
+ protected:
+ id_pskel* id_impl_;
+#endif
+ };
+
+ struct idref_pskel: simple_content
+ {
+ virtual char*
+ post_idref () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ idref_pskel ();
+ idref_pskel (idref_pskel* impl, void*);
+
+ protected:
+ idref_pskel* idref_impl_;
+#endif
+ };
+
+ struct idrefs_pskel: list_base
+ {
+ virtual string_sequence*
+ post_idrefs () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ idrefs_pskel ();
+ idrefs_pskel (idrefs_pskel* impl, void*);
+
+ protected:
+ idrefs_pskel* idrefs_impl_;
+#endif
+ };
+
+ struct language_pskel: simple_content
+ {
+ virtual char*
+ post_language () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ language_pskel ();
+ language_pskel (language_pskel* impl, void*);
+
+ protected:
+ language_pskel* language_impl_;
+#endif
+ };
+
+ struct uri_pskel: simple_content
+ {
+ virtual char*
+ post_uri () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ uri_pskel ();
+ uri_pskel (uri_pskel* impl, void*);
+
+ protected:
+ uri_pskel* uri_impl_;
+#endif
+ };
+
+ struct qname_pskel: simple_content
+ {
+ virtual qname*
+ post_qname () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ qname_pskel ();
+ qname_pskel (qname_pskel* impl, void*);
+
+ protected:
+ qname_pskel* qname_impl_;
+#endif
+ };
+#endif // XSDE_STL
+
+
+ // base64Binary
+ //
+ struct base64_binary_pskel: simple_content
+ {
+ virtual buffer*
+ post_base64_binary () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ base64_binary_pskel ();
+ base64_binary_pskel (base64_binary_pskel* impl, void*);
+
+ protected:
+ base64_binary_pskel* base64_binary_impl_;
+#endif
+ };
+
+ // hexBinary
+ //
+ struct hex_binary_pskel: simple_content
+ {
+ virtual buffer*
+ post_hex_binary () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ hex_binary_pskel ();
+ hex_binary_pskel (hex_binary_pskel* impl, void*);
+
+ protected:
+ hex_binary_pskel* hex_binary_impl_;
+#endif
+ };
+
+ // Time and date types.
+ //
+ struct gday_pskel: simple_content
+ {
+ virtual gday
+ post_gday () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ gday_pskel ();
+ gday_pskel (gday_pskel* impl, void*);
+
+ protected:
+ gday_pskel* gday_impl_;
+#endif
+ };
+
+ struct gmonth_pskel: simple_content
+ {
+ virtual gmonth
+ post_gmonth () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ gmonth_pskel ();
+ gmonth_pskel (gmonth_pskel* impl, void*);
+
+ protected:
+ gmonth_pskel* gmonth_impl_;
+#endif
+ };
+
+ struct gyear_pskel: simple_content
+ {
+ virtual gyear
+ post_gyear () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ gyear_pskel ();
+ gyear_pskel (gyear_pskel* impl, void*);
+
+ protected:
+ gyear_pskel* gyear_impl_;
+#endif
+ };
+
+ struct gmonth_day_pskel: simple_content
+ {
+ virtual gmonth_day
+ post_gmonth_day () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ gmonth_day_pskel ();
+ gmonth_day_pskel (gmonth_day_pskel* impl, void*);
+
+ protected:
+ gmonth_day_pskel* gmonth_day_impl_;
+#endif
+ };
+
+ struct gyear_month_pskel: simple_content
+ {
+ virtual gyear_month
+ post_gyear_month () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ gyear_month_pskel ();
+ gyear_month_pskel (gyear_month_pskel* impl, void*);
+
+ protected:
+ gyear_month_pskel* gyear_month_impl_;
+#endif
+ };
+
+ struct date_pskel: simple_content
+ {
+ virtual date
+ post_date () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ date_pskel ();
+ date_pskel (date_pskel* impl, void*);
+
+ protected:
+ date_pskel* date_impl_;
+#endif
+ };
+
+ struct time_pskel: simple_content
+ {
+ virtual time
+ post_time () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ time_pskel ();
+ time_pskel (time_pskel* impl, void*);
+
+ protected:
+ time_pskel* time_impl_;
+#endif
+ };
+
+ struct date_time_pskel: simple_content
+ {
+ virtual date_time
+ post_date_time () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ date_time_pskel ();
+ date_time_pskel (date_time_pskel* impl, void*);
+
+ protected:
+ date_time_pskel* date_time_impl_;
+#endif
+ };
+
+ struct duration_pskel: simple_content
+ {
+ virtual duration
+ post_duration () = 0;
+
+#ifdef XSDE_POLYMORPHIC
+ static const char*
+ _static_type ();
+
+ virtual const char*
+ _dynamic_type () const;
+#endif
+
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ duration_pskel ();
+ duration_pskel (duration_pskel* impl, void*);
+
+ protected:
+ duration_pskel* duration_impl_;
+#endif
+ };
+ }
+ }
+ }
+}
+
+#include <xsde/cxx/parser/validating/xml-schema-pskel.ixx>
+
+#endif // XSDE_CXX_PARSER_VALIDATING_XML_SCHEMA_PSKEL_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/xml-schema-pskel.ixx b/libxsde/xsde/cxx/parser/validating/xml-schema-pskel.ixx
new file mode 100644
index 0000000..bb94f3e
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/xml-schema-pskel.ixx
@@ -0,0 +1,704 @@
+// file : xsde/cxx/parser/validating/xml-schema-pskel.ixx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ // any_type_pskel
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ inline any_type_pskel::
+ any_type_pskel ()
+ : any_type_impl_ (0)
+ {
+ }
+
+ inline any_type_pskel::
+ any_type_pskel (any_type_pskel* impl, void*)
+ : complex_content (impl, 0), any_type_impl_ (impl)
+ {
+ }
+#endif
+
+ // any_simple_type_pskel
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ inline any_simple_type_pskel::
+ any_simple_type_pskel ()
+ : any_simple_type_impl_ (0)
+ {
+ }
+
+ inline any_simple_type_pskel::
+ any_simple_type_pskel (any_simple_type_pskel* impl, void*)
+ : simple_content (impl, 0), any_simple_type_impl_ (impl)
+ {
+ }
+#endif
+
+ // boolean_pskel
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ inline boolean_pskel::
+ boolean_pskel ()
+ : boolean_impl_ (0)
+ {
+ }
+
+ inline boolean_pskel::
+ boolean_pskel (boolean_pskel* impl, void*)
+ : simple_content (impl, 0), boolean_impl_ (impl)
+ {
+ }
+#endif
+
+ // byte_pskel
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ inline byte_pskel::
+ byte_pskel ()
+ : byte_impl_ (0)
+ {
+ }
+
+ inline byte_pskel::
+ byte_pskel (byte_pskel* impl, void*)
+ : simple_content (impl, 0), byte_impl_ (impl)
+ {
+ }
+#endif
+
+ // unsigned_byte_pskel
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ inline unsigned_byte_pskel::
+ unsigned_byte_pskel ()
+ : unsigned_byte_impl_ (0)
+ {
+ }
+
+ inline unsigned_byte_pskel::
+ unsigned_byte_pskel (unsigned_byte_pskel* impl, void*)
+ : simple_content (impl, 0), unsigned_byte_impl_ (impl)
+ {
+ }
+#endif
+
+ // short_pskel
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ inline short_pskel::
+ short_pskel ()
+ : short_impl_ (0)
+ {
+ }
+
+ inline short_pskel::
+ short_pskel (short_pskel* impl, void*)
+ : simple_content (impl, 0), short_impl_ (impl)
+ {
+ }
+#endif
+
+ // unsigned_short_pskel
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ inline unsigned_short_pskel::
+ unsigned_short_pskel ()
+ : unsigned_short_impl_ (0)
+ {
+ }
+
+ inline unsigned_short_pskel::
+ unsigned_short_pskel (unsigned_short_pskel* impl, void*)
+ : simple_content (impl, 0), unsigned_short_impl_ (impl)
+ {
+ }
+#endif
+
+ // int_pskel
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ inline int_pskel::
+ int_pskel ()
+ : int_impl_ (0)
+ {
+ }
+
+ inline int_pskel::
+ int_pskel (int_pskel* impl, void*)
+ : simple_content (impl, 0), int_impl_ (impl)
+ {
+ }
+#endif
+
+ // unsigned_int_pskel
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ inline unsigned_int_pskel::
+ unsigned_int_pskel ()
+ : unsigned_int_impl_ (0)
+ {
+ }
+
+ inline unsigned_int_pskel::
+ unsigned_int_pskel (unsigned_int_pskel* impl, void*)
+ : simple_content (impl, 0), unsigned_int_impl_ (impl)
+ {
+ }
+#endif
+
+ // long_pskel
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ inline long_pskel::
+ long_pskel ()
+ : long_impl_ (0)
+ {
+ }
+
+ inline long_pskel::
+ long_pskel (long_pskel* impl, void*)
+ : simple_content (impl, 0), long_impl_ (impl)
+ {
+ }
+#endif
+
+ // unsigned_long_pskel
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ inline unsigned_long_pskel::
+ unsigned_long_pskel ()
+ : unsigned_long_impl_ (0)
+ {
+ }
+
+ inline unsigned_long_pskel::
+ unsigned_long_pskel (unsigned_long_pskel* impl, void*)
+ : simple_content (impl, 0), unsigned_long_impl_ (impl)
+ {
+ }
+#endif
+
+ // integer_pskel
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ inline integer_pskel::
+ integer_pskel ()
+ : integer_impl_ (0)
+ {
+ }
+
+ inline integer_pskel::
+ integer_pskel (integer_pskel* impl, void*)
+ : simple_content (impl, 0), integer_impl_ (impl)
+ {
+ }
+#endif
+
+ // negative_integer_pskel
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ inline negative_integer_pskel::
+ negative_integer_pskel ()
+ : negative_integer_impl_ (0)
+ {
+ }
+
+ inline negative_integer_pskel::
+ negative_integer_pskel (negative_integer_pskel* impl, void*)
+ : simple_content (impl, 0), negative_integer_impl_ (impl)
+ {
+ }
+#endif
+
+ // non_positive_integer_pskel
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ inline non_positive_integer_pskel::
+ non_positive_integer_pskel ()
+ : non_positive_integer_impl_ (0)
+ {
+ }
+
+ inline non_positive_integer_pskel::
+ non_positive_integer_pskel (non_positive_integer_pskel* impl, void*)
+ : simple_content (impl, 0), non_positive_integer_impl_ (impl)
+ {
+ }
+#endif
+
+ // positive_integer_pskel
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ inline positive_integer_pskel::
+ positive_integer_pskel ()
+ : positive_integer_impl_ (0)
+ {
+ }
+
+ inline positive_integer_pskel::
+ positive_integer_pskel (positive_integer_pskel* impl, void*)
+ : simple_content (impl, 0), positive_integer_impl_ (impl)
+ {
+ }
+#endif
+
+ // non_negative_integer_pskel
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ inline non_negative_integer_pskel::
+ non_negative_integer_pskel ()
+ : non_negative_integer_impl_ (0)
+ {
+ }
+
+ inline non_negative_integer_pskel::
+ non_negative_integer_pskel (non_negative_integer_pskel* impl, void*)
+ : simple_content (impl, 0), non_negative_integer_impl_ (impl)
+ {
+ }
+#endif
+
+ // float_pskel
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ inline float_pskel::
+ float_pskel ()
+ : float_impl_ (0)
+ {
+ }
+
+ inline float_pskel::
+ float_pskel (float_pskel* impl, void*)
+ : simple_content (impl, 0), float_impl_ (impl)
+ {
+ }
+#endif
+
+ // double_pskel
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ inline double_pskel::
+ double_pskel ()
+ : double_impl_ (0)
+ {
+ }
+
+ inline double_pskel::
+ double_pskel (double_pskel* impl, void*)
+ : simple_content (impl, 0), double_impl_ (impl)
+ {
+ }
+#endif
+
+ // decimal_pskel
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ inline decimal_pskel::
+ decimal_pskel ()
+ : decimal_impl_ (0)
+ {
+ }
+
+ inline decimal_pskel::
+ decimal_pskel (decimal_pskel* impl, void*)
+ : simple_content (impl, 0), decimal_impl_ (impl)
+ {
+ }
+#endif
+
+ // string_pskel
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ inline string_pskel::
+ string_pskel ()
+ : string_impl_ (0)
+ {
+ }
+
+ inline string_pskel::
+ string_pskel (string_pskel* impl, void*)
+ : simple_content (impl, 0), string_impl_ (impl)
+ {
+ }
+#endif
+
+ // normalized_string_pskel
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ inline normalized_string_pskel::
+ normalized_string_pskel ()
+ : normalized_string_impl_ (0)
+ {
+ }
+
+ inline normalized_string_pskel::
+ normalized_string_pskel (normalized_string_pskel* impl, void*)
+ : simple_content (impl, 0), normalized_string_impl_ (impl)
+ {
+ }
+#endif
+
+ // token_pskel
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ inline token_pskel::
+ token_pskel ()
+ : token_impl_ (0)
+ {
+ }
+
+ inline token_pskel::
+ token_pskel (token_pskel* impl, void*)
+ : simple_content (impl, 0), token_impl_ (impl)
+ {
+ }
+#endif
+
+ // name_pskel
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ inline name_pskel::
+ name_pskel ()
+ : name_impl_ (0)
+ {
+ }
+
+ inline name_pskel::
+ name_pskel (name_pskel* impl, void*)
+ : simple_content (impl, 0), name_impl_ (impl)
+ {
+ }
+#endif
+
+ // nmtoken_pskel
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ inline nmtoken_pskel::
+ nmtoken_pskel ()
+ : nmtoken_impl_ (0)
+ {
+ }
+
+ inline nmtoken_pskel::
+ nmtoken_pskel (nmtoken_pskel* impl, void*)
+ : simple_content (impl, 0), nmtoken_impl_ (impl)
+ {
+ }
+#endif
+
+ // nmtokens_pskel
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ inline nmtokens_pskel::
+ nmtokens_pskel ()
+ : nmtokens_impl_ (0)
+ {
+ }
+
+ inline nmtokens_pskel::
+ nmtokens_pskel (nmtokens_pskel* impl, void*)
+ : list_base (impl, 0), nmtokens_impl_ (impl)
+ {
+ }
+#endif
+
+ // ncname_pskel
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ inline ncname_pskel::
+ ncname_pskel ()
+ : ncname_impl_ (0)
+ {
+ }
+
+ inline ncname_pskel::
+ ncname_pskel (ncname_pskel* impl, void*)
+ : simple_content (impl, 0), ncname_impl_ (impl)
+ {
+ }
+#endif
+
+ // id_pskel
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ inline id_pskel::
+ id_pskel ()
+ : id_impl_ (0)
+ {
+ }
+
+ inline id_pskel::
+ id_pskel (id_pskel* impl, void*)
+ : simple_content (impl, 0), id_impl_ (impl)
+ {
+ }
+#endif
+
+ // idref_pskel
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ inline idref_pskel::
+ idref_pskel ()
+ : idref_impl_ (0)
+ {
+ }
+
+ inline idref_pskel::
+ idref_pskel (idref_pskel* impl, void*)
+ : simple_content (impl, 0), idref_impl_ (impl)
+ {
+ }
+#endif
+
+ // idrefs_pskel
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ inline idrefs_pskel::
+ idrefs_pskel ()
+ : idrefs_impl_ (0)
+ {
+ }
+
+ inline idrefs_pskel::
+ idrefs_pskel (idrefs_pskel* impl, void*)
+ : list_base (impl, 0), idrefs_impl_ (impl)
+ {
+ }
+#endif
+
+ // language_pskel
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ inline language_pskel::
+ language_pskel ()
+ : language_impl_ (0)
+ {
+ }
+
+ inline language_pskel::
+ language_pskel (language_pskel* impl, void*)
+ : simple_content (impl, 0), language_impl_ (impl)
+ {
+ }
+#endif
+
+ // uri_pskel
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ inline uri_pskel::
+ uri_pskel ()
+ : uri_impl_ (0)
+ {
+ }
+
+ inline uri_pskel::
+ uri_pskel (uri_pskel* impl, void*)
+ : simple_content (impl, 0), uri_impl_ (impl)
+ {
+ }
+#endif
+
+ // qname_pskel
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ inline qname_pskel::
+ qname_pskel ()
+ : qname_impl_ (0)
+ {
+ }
+
+ inline qname_pskel::
+ qname_pskel (qname_pskel* impl, void*)
+ : simple_content (impl, 0), qname_impl_ (impl)
+ {
+ }
+#endif
+
+ // base64_binary_pskel
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ inline base64_binary_pskel::
+ base64_binary_pskel ()
+ : base64_binary_impl_ (0)
+ {
+ }
+
+ inline base64_binary_pskel::
+ base64_binary_pskel (base64_binary_pskel* impl, void*)
+ : simple_content (impl, 0), base64_binary_impl_ (impl)
+ {
+ }
+#endif
+
+ // hex_binary_pskel
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ inline hex_binary_pskel::
+ hex_binary_pskel ()
+ : hex_binary_impl_ (0)
+ {
+ }
+
+ inline hex_binary_pskel::
+ hex_binary_pskel (hex_binary_pskel* impl, void*)
+ : simple_content (impl, 0), hex_binary_impl_ (impl)
+ {
+ }
+#endif
+
+ // gday_pskel
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ inline gday_pskel::
+ gday_pskel ()
+ : gday_impl_ (0)
+ {
+ }
+
+ inline gday_pskel::
+ gday_pskel (gday_pskel* impl, void*)
+ : simple_content (impl, 0), gday_impl_ (impl)
+ {
+ }
+#endif
+
+ // gmonth_pskel
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ inline gmonth_pskel::
+ gmonth_pskel ()
+ : gmonth_impl_ (0)
+ {
+ }
+
+ inline gmonth_pskel::
+ gmonth_pskel (gmonth_pskel* impl, void*)
+ : simple_content (impl, 0), gmonth_impl_ (impl)
+ {
+ }
+#endif
+
+ // gyear_pskel
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ inline gyear_pskel::
+ gyear_pskel ()
+ : gyear_impl_ (0)
+ {
+ }
+
+ inline gyear_pskel::
+ gyear_pskel (gyear_pskel* impl, void*)
+ : simple_content (impl, 0), gyear_impl_ (impl)
+ {
+ }
+#endif
+
+ // gmonth_day_pskel
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ inline gmonth_day_pskel::
+ gmonth_day_pskel ()
+ : gmonth_day_impl_ (0)
+ {
+ }
+
+ inline gmonth_day_pskel::
+ gmonth_day_pskel (gmonth_day_pskel* impl, void*)
+ : simple_content (impl, 0), gmonth_day_impl_ (impl)
+ {
+ }
+#endif
+
+ // gyear_month_pskel
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ inline gyear_month_pskel::
+ gyear_month_pskel ()
+ : gyear_month_impl_ (0)
+ {
+ }
+
+ inline gyear_month_pskel::
+ gyear_month_pskel (gyear_month_pskel* impl, void*)
+ : simple_content (impl, 0), gyear_month_impl_ (impl)
+ {
+ }
+#endif
+
+ // date_pskel
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ inline date_pskel::
+ date_pskel ()
+ : date_impl_ (0)
+ {
+ }
+
+ inline date_pskel::
+ date_pskel (date_pskel* impl, void*)
+ : simple_content (impl, 0), date_impl_ (impl)
+ {
+ }
+#endif
+
+ // time_pskel
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ inline time_pskel::
+ time_pskel ()
+ : time_impl_ (0)
+ {
+ }
+
+ inline time_pskel::
+ time_pskel (time_pskel* impl, void*)
+ : simple_content (impl, 0), time_impl_ (impl)
+ {
+ }
+#endif
+
+ // date_time_pskel
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ inline date_time_pskel::
+ date_time_pskel ()
+ : date_time_impl_ (0)
+ {
+ }
+
+ inline date_time_pskel::
+ date_time_pskel (date_time_pskel* impl, void*)
+ : simple_content (impl, 0), date_time_impl_ (impl)
+ {
+ }
+#endif
+
+ // duration_pskel
+ //
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ inline duration_pskel::
+ duration_pskel ()
+ : duration_impl_ (0)
+ {
+ }
+
+ inline duration_pskel::
+ duration_pskel (duration_pskel* impl, void*)
+ : simple_content (impl, 0), duration_impl_ (impl)
+ {
+ }
+#endif
+ }
+ }
+ }
+}