aboutsummaryrefslogtreecommitdiff
path: root/libxsde/xsde/cxx/parser/validating
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2010-10-08 15:35:23 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2010-10-08 15:35:23 +0200
commit7db026e8056914d113ac0bbfd9bdc4908a9e7874 (patch)
tree0ab15cb8b0ee160a10cca21edaf0aca1e97e8921 /libxsde/xsde/cxx/parser/validating
parent4f38adc11ab1a3a1ab2dd3f958c917182be7d71f (diff)
Add support for the whiteSpace facet
Use the same mechanism to handle whitespace processing for build-in types and enumerations.
Diffstat (limited to 'libxsde/xsde/cxx/parser/validating')
-rw-r--r--libxsde/xsde/cxx/parser/validating/id-stl.cxx14
-rw-r--r--libxsde/xsde/cxx/parser/validating/id.cxx14
-rw-r--r--libxsde/xsde/cxx/parser/validating/idref-stl.cxx14
-rw-r--r--libxsde/xsde/cxx/parser/validating/idref.cxx14
-rw-r--r--libxsde/xsde/cxx/parser/validating/language-stl.cxx21
-rw-r--r--libxsde/xsde/cxx/parser/validating/language.cxx21
-rw-r--r--libxsde/xsde/cxx/parser/validating/name-stl.cxx15
-rw-r--r--libxsde/xsde/cxx/parser/validating/name.cxx15
-rw-r--r--libxsde/xsde/cxx/parser/validating/ncname-stl.cxx14
-rw-r--r--libxsde/xsde/cxx/parser/validating/ncname.cxx14
-rw-r--r--libxsde/xsde/cxx/parser/validating/nmtoken-stl.cxx17
-rw-r--r--libxsde/xsde/cxx/parser/validating/nmtoken.cxx17
-rw-r--r--libxsde/xsde/cxx/parser/validating/normalized-string-stl.cxx23
-rw-r--r--libxsde/xsde/cxx/parser/validating/normalized-string.cxx38
-rw-r--r--libxsde/xsde/cxx/parser/validating/string-common.cxx75
-rw-r--r--libxsde/xsde/cxx/parser/validating/string-common.hxx20
-rw-r--r--libxsde/xsde/cxx/parser/validating/string-stl.cxx13
-rw-r--r--libxsde/xsde/cxx/parser/validating/string.cxx26
-rw-r--r--libxsde/xsde/cxx/parser/validating/token-stl.cxx30
-rw-r--r--libxsde/xsde/cxx/parser/validating/token.cxx32
-rw-r--r--libxsde/xsde/cxx/parser/validating/uri-stl.cxx6
-rw-r--r--libxsde/xsde/cxx/parser/validating/uri.cxx6
-rw-r--r--libxsde/xsde/cxx/parser/validating/xml-schema-pskel.hxx29
-rw-r--r--libxsde/xsde/cxx/parser/validating/xml-schema-pskel.ixx79
24 files changed, 287 insertions, 280 deletions
diff --git a/libxsde/xsde/cxx/parser/validating/id-stl.cxx b/libxsde/xsde/cxx/parser/validating/id-stl.cxx
index f20fa84..4ac0b63 100644
--- a/libxsde/xsde/cxx/parser/validating/id-stl.cxx
+++ b/libxsde/xsde/cxx/parser/validating/id-stl.cxx
@@ -39,19 +39,11 @@ namespace xsde
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);
+ if (!string_common::validate_facets (str_, _facets (), _context ()))
return;
- }
- string_common::validate_facets (
- str_.c_str (), str_.size (), _facets (), _context ());
+ if (!xml::valid_ncname (str_.c_str (), str_.size ()))
+ _schema_error (schema_error::invalid_id_value);
}
std::string id_pimpl::
diff --git a/libxsde/xsde/cxx/parser/validating/id.cxx b/libxsde/xsde/cxx/parser/validating/id.cxx
index d2fb79d..70713be 100644
--- a/libxsde/xsde/cxx/parser/validating/id.cxx
+++ b/libxsde/xsde/cxx/parser/validating/id.cxx
@@ -60,19 +60,11 @@ namespace xsde
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);
+ if (!string_common::validate_facets (str_, _facets (), _context ()))
return;
- }
- string_common::validate_facets (
- str_.data (), str_.size (), _facets (), _context ());
+ if (!xml::valid_ncname (str_.data (), str_.size ()))
+ _schema_error (schema_error::invalid_id_value);
}
char* id_pimpl::
diff --git a/libxsde/xsde/cxx/parser/validating/idref-stl.cxx b/libxsde/xsde/cxx/parser/validating/idref-stl.cxx
index 93d94dc..73b867b 100644
--- a/libxsde/xsde/cxx/parser/validating/idref-stl.cxx
+++ b/libxsde/xsde/cxx/parser/validating/idref-stl.cxx
@@ -39,19 +39,11 @@ namespace xsde
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);
+ if (!string_common::validate_facets (str_, _facets (), _context ()))
return;
- }
- string_common::validate_facets (
- str_.c_str (), str_.size (), _facets (), _context ());
+ if (!xml::valid_ncname (str_.c_str (), str_.size ()))
+ _schema_error (schema_error::invalid_idref_value);
}
std::string idref_pimpl::
diff --git a/libxsde/xsde/cxx/parser/validating/idref.cxx b/libxsde/xsde/cxx/parser/validating/idref.cxx
index 58ac4ca..a10da5d 100644
--- a/libxsde/xsde/cxx/parser/validating/idref.cxx
+++ b/libxsde/xsde/cxx/parser/validating/idref.cxx
@@ -60,19 +60,11 @@ namespace xsde
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);
+ if (!string_common::validate_facets (str_, _facets (), _context ()))
return;
- }
- string_common::validate_facets (
- str_.data (), str_.size (), _facets (), _context ());
+ if (!xml::valid_ncname (str_.data (), str_.size ()))
+ _schema_error (schema_error::invalid_idref_value);
}
char* idref_pimpl::
diff --git a/libxsde/xsde/cxx/parser/validating/language-stl.cxx b/libxsde/xsde/cxx/parser/validating/language-stl.cxx
index 61b4a1b..831711f 100644
--- a/libxsde/xsde/cxx/parser/validating/language-stl.cxx
+++ b/libxsde/xsde/cxx/parser/validating/language-stl.cxx
@@ -37,10 +37,11 @@ namespace xsde
void language_pimpl::
_post ()
{
- typedef ro_string::size_type size_type;
+ if (!string_common::validate_facets (str_, _facets (), _context ()))
+ return;
- ro_string tmp (str_);
- size_type size = trim_right (tmp);
+ typedef std::string::size_type size_type;
+ size_type size = str_.size ();
// language := ALPHA{1,8} *(-(ALPHA | DIGIT){1,8})
//
@@ -53,7 +54,7 @@ namespace xsde
for (; i < size && n < 8; ++n, ++i)
{
- char c = tmp[i];
+ char c = str_[i];
if (!((c >= 'a' && c <= 'z') ||
(c >= 'A' && c <= 'Z') ||
@@ -70,23 +71,15 @@ namespace xsde
if (i == size)
break;
- if (tmp[i++] != '-')
+ if (str_[i++] != '-')
{
ok = false;
break;
}
}
- if (ok)
- str_.resize (size);
- else
- {
+ if (!ok)
_schema_error (schema_error::invalid_language_value);
- return;
- }
-
- string_common::validate_facets (
- str_.c_str (), str_.size (), _facets (), _context ());
}
std::string language_pimpl::
diff --git a/libxsde/xsde/cxx/parser/validating/language.cxx b/libxsde/xsde/cxx/parser/validating/language.cxx
index bd39295..196f779 100644
--- a/libxsde/xsde/cxx/parser/validating/language.cxx
+++ b/libxsde/xsde/cxx/parser/validating/language.cxx
@@ -58,10 +58,11 @@ namespace xsde
void language_pimpl::
_post ()
{
- typedef ro_string::size_type size_type;
+ if (!string_common::validate_facets (str_, _facets (), _context ()))
+ return;
- ro_string tmp (str_);
- size_type size = trim_right (tmp);
+ typedef string::size_type size_type;
+ size_type size = str_.size ();
// language := ALPHA{1,8} *(-(ALPHA | DIGIT){1,8})
//
@@ -74,7 +75,7 @@ namespace xsde
for (; i < size && n < 8; ++n, ++i)
{
- char c = tmp[i];
+ char c = str_[i];
if (!((c >= 'a' && c <= 'z') ||
(c >= 'A' && c <= 'Z') ||
@@ -91,23 +92,15 @@ namespace xsde
if (i == size)
break;
- if (tmp[i++] != '-')
+ if (str_[i++] != '-')
{
ok = false;
break;
}
}
- if (ok)
- str_.truncate (size);
- else
- {
+ if (!ok)
_schema_error (schema_error::invalid_language_value);
- return;
- }
-
- string_common::validate_facets (
- str_.data (), str_.size (), _facets (), _context ());
}
char* language_pimpl::
diff --git a/libxsde/xsde/cxx/parser/validating/name-stl.cxx b/libxsde/xsde/cxx/parser/validating/name-stl.cxx
index 942b7cf..945beec 100644
--- a/libxsde/xsde/cxx/parser/validating/name-stl.cxx
+++ b/libxsde/xsde/cxx/parser/validating/name-stl.cxx
@@ -39,8 +39,11 @@ namespace xsde
void name_pimpl::
_post ()
{
- ro_string tmp (str_);
- ro_string::size_type size = trim_right (tmp);
+ if (!string_common::validate_facets (str_, _facets (), _context ()))
+ return;
+
+ typedef std::string::size_type size_type;
+ size_type size = str_.size ();
// For now we are only checking the US-ASCII characters.
//
@@ -68,16 +71,8 @@ namespace xsde
}
}
- str_.resize (size);
-
if (!ok)
- {
_schema_error (schema_error::invalid_name_value);
- return;
- }
-
- string_common::validate_facets (
- str_.c_str (), str_.size (), _facets (), _context ());
}
std::string name_pimpl::
diff --git a/libxsde/xsde/cxx/parser/validating/name.cxx b/libxsde/xsde/cxx/parser/validating/name.cxx
index 570a6cd..ce73940 100644
--- a/libxsde/xsde/cxx/parser/validating/name.cxx
+++ b/libxsde/xsde/cxx/parser/validating/name.cxx
@@ -60,8 +60,11 @@ namespace xsde
void name_pimpl::
_post ()
{
- ro_string tmp (str_.data (), str_.size ());
- ro_string::size_type size = trim_right (tmp);
+ if (!string_common::validate_facets (str_, _facets (), _context ()))
+ return;
+
+ typedef string::size_type size_type;
+ size_type size = str_.size ();
// For now we are only checking the US-ASCII characters.
//
@@ -89,16 +92,8 @@ namespace xsde
}
}
- str_.truncate (size);
-
if (!ok)
- {
_schema_error (schema_error::invalid_name_value);
- return;
- }
-
- string_common::validate_facets (
- str_.data (), str_.size (), _facets (), _context ());
}
char* name_pimpl::
diff --git a/libxsde/xsde/cxx/parser/validating/ncname-stl.cxx b/libxsde/xsde/cxx/parser/validating/ncname-stl.cxx
index 201f463..be42f2f 100644
--- a/libxsde/xsde/cxx/parser/validating/ncname-stl.cxx
+++ b/libxsde/xsde/cxx/parser/validating/ncname-stl.cxx
@@ -39,19 +39,11 @@ namespace xsde
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);
+ if (!string_common::validate_facets (str_, _facets (), _context ()))
return;
- }
- string_common::validate_facets (
- str_.c_str (), str_.size (), _facets (), _context ());
+ if (!xml::valid_ncname (str_.c_str (), str_.size ()))
+ _schema_error (schema_error::invalid_ncname_value);
}
std::string ncname_pimpl::
diff --git a/libxsde/xsde/cxx/parser/validating/ncname.cxx b/libxsde/xsde/cxx/parser/validating/ncname.cxx
index 233ea56..d6af7d6 100644
--- a/libxsde/xsde/cxx/parser/validating/ncname.cxx
+++ b/libxsde/xsde/cxx/parser/validating/ncname.cxx
@@ -60,19 +60,11 @@ namespace xsde
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);
+ if (!string_common::validate_facets (str_, _facets (), _context ()))
return;
- }
- string_common::validate_facets (
- str_.data (), str_.size (), _facets (), _context ());
+ if (!xml::valid_ncname (str_.data (), str_.size ()))
+ _schema_error (schema_error::invalid_ncname_value);
}
char* ncname_pimpl::
diff --git a/libxsde/xsde/cxx/parser/validating/nmtoken-stl.cxx b/libxsde/xsde/cxx/parser/validating/nmtoken-stl.cxx
index 62e867b..17ab6a0 100644
--- a/libxsde/xsde/cxx/parser/validating/nmtoken-stl.cxx
+++ b/libxsde/xsde/cxx/parser/validating/nmtoken-stl.cxx
@@ -39,8 +39,11 @@ namespace xsde
void nmtoken_pimpl::
_post ()
{
- ro_string tmp (str_);
- ro_string::size_type size = trim_right (tmp);
+ if (!string_common::validate_facets (str_, _facets (), _context ()))
+ return;
+
+ typedef std::string::size_type size_type;
+ size_type size = str_.size ();
// For now we are only checking the US-ASCII characters.
//
@@ -49,7 +52,7 @@ namespace xsde
if (ok)
{
- for (ro_string::size_type i = 0; i < size; ++i)
+ for (size_type i = 0; i < size; ++i)
{
unsigned char c = static_cast<unsigned char> (str_[i]);
@@ -61,16 +64,8 @@ namespace xsde
}
}
- str_.resize (size);
-
if (!ok)
- {
_schema_error (schema_error::invalid_nmtoken_value);
- return;
- }
-
- string_common::validate_facets (
- str_.c_str (), str_.size (), _facets (), _context ());
}
std::string nmtoken_pimpl::
diff --git a/libxsde/xsde/cxx/parser/validating/nmtoken.cxx b/libxsde/xsde/cxx/parser/validating/nmtoken.cxx
index cc19602..77da496 100644
--- a/libxsde/xsde/cxx/parser/validating/nmtoken.cxx
+++ b/libxsde/xsde/cxx/parser/validating/nmtoken.cxx
@@ -60,8 +60,11 @@ namespace xsde
void nmtoken_pimpl::
_post ()
{
- ro_string tmp (str_.data (), str_.size ());
- ro_string::size_type size = trim_right (tmp);
+ if (!string_common::validate_facets (str_, _facets (), _context ()))
+ return;
+
+ typedef string::size_type size_type;
+ size_type size = str_.size ();
// For now we are only checking the US-ASCII characters.
//
@@ -70,7 +73,7 @@ namespace xsde
if (ok)
{
- for (ro_string::size_type i = 0; i < size; ++i)
+ for (size_type i = 0; i < size; ++i)
{
unsigned char c = static_cast<unsigned char> (str_[i]);
@@ -82,16 +85,8 @@ namespace xsde
}
}
- str_.truncate (size);
-
if (!ok)
- {
_schema_error (schema_error::invalid_nmtoken_value);
- return;
- }
-
- string_common::validate_facets (
- str_.data (), str_.size (), _facets (), _context ());
}
char* nmtoken_pimpl::
diff --git a/libxsde/xsde/cxx/parser/validating/normalized-string-stl.cxx b/libxsde/xsde/cxx/parser/validating/normalized-string-stl.cxx
index f93ecf8..dcbe588 100644
--- a/libxsde/xsde/cxx/parser/validating/normalized-string-stl.cxx
+++ b/libxsde/xsde/cxx/parser/validating/normalized-string-stl.cxx
@@ -23,24 +23,21 @@ namespace xsde
void normalized_string_pimpl::
_characters (const ro_string& s)
{
- str_ += s;
+ if (_facets ().whitespace_ == 2 && str_.size () == 0)
+ {
+ ro_string tmp (s.data (), s.size ());
+
+ if (trim_left (tmp) != 0)
+ str_ += tmp;
+ }
+ else
+ str_ += s;
}
void normalized_string_pimpl::
_post ()
{
- 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;
- }
-
- string_common::validate_facets (
- str_.c_str (), str_.size (), _facets (), _context ());
+ string_common::validate_facets (str_, _facets (), _context ());
}
std::string normalized_string_pimpl::
diff --git a/libxsde/xsde/cxx/parser/validating/normalized-string.cxx b/libxsde/xsde/cxx/parser/validating/normalized-string.cxx
index 4807846..48af91e 100644
--- a/libxsde/xsde/cxx/parser/validating/normalized-string.cxx
+++ b/libxsde/xsde/cxx/parser/validating/normalized-string.cxx
@@ -30,31 +30,35 @@ namespace xsde
void normalized_string_pimpl::
_characters (const ro_string& s)
{
+ if (_facets ().whitespace_ == 2 && str_.size () == 0)
+ {
+ ro_string tmp (s.data (), s.size ());
+
+ if (trim_left (tmp) != 0)
+ {
#ifdef XSDE_EXCEPTIONS
- str_.append (s.data (), s.size ());
+ str_.append (tmp.data (), tmp.size ());
#else
- if (str_.append (s.data (), s.size ()))
- _sys_error (sys_error::no_memory);
+ 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 normalized_string_pimpl::
_post ()
{
- 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;
- }
-
- string_common::validate_facets (
- str_.data (), str_.size (), _facets (), _context ());
+ string_common::validate_facets (str_, _facets (), _context ());
}
char* normalized_string_pimpl::
diff --git a/libxsde/xsde/cxx/parser/validating/string-common.cxx b/libxsde/xsde/cxx/parser/validating/string-common.cxx
index 328f2ce..9558e30 100644
--- a/libxsde/xsde/cxx/parser/validating/string-common.cxx
+++ b/libxsde/xsde/cxx/parser/validating/string-common.cxx
@@ -15,11 +15,78 @@ namespace xsde
namespace validating
{
bool string_common::
- validate_facets (const char* s,
- size_t n,
- const string_facets::facets& f,
- context& ctx)
+ validate_facets (
+#ifdef XSDE_STL
+ std::string& str,
+#else
+ string& str,
+#endif
+ const string_facets::facets& f,
+ context& ctx)
{
+#ifdef XSDE_STL
+ typedef std::string::size_type size_type;
+#else
+ typedef string::size_type size_type;
+#endif
+
+ if (f.whitespace_ == 2)
+ {
+ // Collapse. The left trimming has already been performed.
+ //
+ 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;
+ }
+ }
+
+#ifdef XSDE_STL
+ str.resize (j);
+#else
+ str.truncate (j);
+#endif
+ }
+ else if (f.whitespace_ == 1)
+ {
+ // Replace.
+ //
+ 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;
+ }
+ }
+
+#ifdef XSDE_STL
+ const char* s = str.c_str ();
+#else
+ const char* s = str.data ();
+#endif
+ size_t n = str.size ();
+
if (f.length_set_ && n != f.length_)
{
ctx.schema_error (schema_error::length_not_equal_prescribed);
diff --git a/libxsde/xsde/cxx/parser/validating/string-common.hxx b/libxsde/xsde/cxx/parser/validating/string-common.hxx
index 3191a3c..f31fd16 100644
--- a/libxsde/xsde/cxx/parser/validating/string-common.hxx
+++ b/libxsde/xsde/cxx/parser/validating/string-common.hxx
@@ -6,6 +6,14 @@
#ifndef XSDE_CXX_PARSER_VALIDATING_STRING_COMMON_HXX
#define XSDE_CXX_PARSER_VALIDATING_STRING_COMMON_HXX
+#include <xsde/cxx/config.hxx>
+
+#ifdef XSDE_STL
+#include <string>
+#else
+#include <xsde/cxx/string.hxx>
+#endif
+
#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
namespace xsde
@@ -19,10 +27,14 @@ namespace xsde
struct string_common
{
static bool
- validate_facets (const char* s,
- size_t n,
- const string_facets::facets&,
- context&);
+ validate_facets (
+#ifdef XSDE_STL
+ std::string& str,
+#else
+ string& str,
+#endif
+ const string_facets::facets&,
+ context&);
};
}
}
diff --git a/libxsde/xsde/cxx/parser/validating/string-stl.cxx b/libxsde/xsde/cxx/parser/validating/string-stl.cxx
index 9e1ad13..e5f8a33 100644
--- a/libxsde/xsde/cxx/parser/validating/string-stl.cxx
+++ b/libxsde/xsde/cxx/parser/validating/string-stl.cxx
@@ -23,14 +23,21 @@ namespace xsde
void string_pimpl::
_characters (const ro_string& s)
{
- str_ += s;
+ if (_facets ().whitespace_ == 2 && str_.size () == 0)
+ {
+ ro_string tmp (s.data (), s.size ());
+
+ if (trim_left (tmp) != 0)
+ str_ += tmp;
+ }
+ else
+ str_ += s;
}
void string_pimpl::
_post ()
{
- string_common::validate_facets (
- str_.c_str (), str_.size (), _facets (), _context ());
+ string_common::validate_facets (str_, _facets (), _context ());
}
std::string string_pimpl::
diff --git a/libxsde/xsde/cxx/parser/validating/string.cxx b/libxsde/xsde/cxx/parser/validating/string.cxx
index 3e29a93..73c7edd 100644
--- a/libxsde/xsde/cxx/parser/validating/string.cxx
+++ b/libxsde/xsde/cxx/parser/validating/string.cxx
@@ -30,19 +30,35 @@ namespace xsde
void string_pimpl::
_characters (const ro_string& s)
{
+ if (_facets ().whitespace_ == 2 && str_.size () == 0)
+ {
+ ro_string tmp (s.data (), s.size ());
+
+ if (trim_left (tmp) != 0)
+ {
#ifdef XSDE_EXCEPTIONS
- str_.append (s.data (), s.size ());
+ str_.append (tmp.data (), tmp.size ());
#else
- if (str_.append (s.data (), s.size ()))
- _sys_error (sys_error::no_memory);
+ 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 string_pimpl::
_post ()
{
- string_common::validate_facets (
- str_.data (), str_.size (), _facets (), _context ());
+ string_common::validate_facets (str_, _facets (), _context ());
}
char* string_pimpl::
diff --git a/libxsde/xsde/cxx/parser/validating/token-stl.cxx b/libxsde/xsde/cxx/parser/validating/token-stl.cxx
index 5eafe39..8c98e11 100644
--- a/libxsde/xsde/cxx/parser/validating/token-stl.cxx
+++ b/libxsde/xsde/cxx/parser/validating/token-stl.cxx
@@ -37,35 +37,7 @@ namespace xsde
void token_pimpl::
_post ()
{
- 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);
-
- string_common::validate_facets (
- str_.c_str (), str_.size (), _facets (), _context ());
+ string_common::validate_facets (str_, _facets (), _context ());
}
std::string token_pimpl::
diff --git a/libxsde/xsde/cxx/parser/validating/token.cxx b/libxsde/xsde/cxx/parser/validating/token.cxx
index 338fa04..559bb3d 100644
--- a/libxsde/xsde/cxx/parser/validating/token.cxx
+++ b/libxsde/xsde/cxx/parser/validating/token.cxx
@@ -58,37 +58,7 @@ namespace xsde
void token_pimpl::
_post ()
{
- 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);
-
- string_common::validate_facets (
- str_.data (), str_.size (), _facets (), _context ());
+ string_common::validate_facets (str_, _facets (), _context ());
}
char* token_pimpl::
diff --git a/libxsde/xsde/cxx/parser/validating/uri-stl.cxx b/libxsde/xsde/cxx/parser/validating/uri-stl.cxx
index 43538a9..2ec578b 100644
--- a/libxsde/xsde/cxx/parser/validating/uri-stl.cxx
+++ b/libxsde/xsde/cxx/parser/validating/uri-stl.cxx
@@ -41,11 +41,7 @@ namespace xsde
// 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));
-
- string_common::validate_facets (
- str_.c_str (), str_.size (), _facets (), _context ());
+ string_common::validate_facets (str_, _facets (), _context ());
}
std::string uri_pimpl::
diff --git a/libxsde/xsde/cxx/parser/validating/uri.cxx b/libxsde/xsde/cxx/parser/validating/uri.cxx
index 90f55f2..5acdc41 100644
--- a/libxsde/xsde/cxx/parser/validating/uri.cxx
+++ b/libxsde/xsde/cxx/parser/validating/uri.cxx
@@ -62,11 +62,7 @@ namespace xsde
// 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));
-
- string_common::validate_facets (
- str_.data (), str_.size (), _facets (), _context ());
+ string_common::validate_facets (str_, _facets (), _context ());
}
char* uri_pimpl::
diff --git a/libxsde/xsde/cxx/parser/validating/xml-schema-pskel.hxx b/libxsde/xsde/cxx/parser/validating/xml-schema-pskel.hxx
index 4b6b126..1ef1005 100644
--- a/libxsde/xsde/cxx/parser/validating/xml-schema-pskel.hxx
+++ b/libxsde/xsde/cxx/parser/validating/xml-schema-pskel.hxx
@@ -655,7 +655,7 @@ namespace xsde
//
// String-based types. If STL is disabled you are getting a C
- // string that you have to delete with delete[] (or custom
+ // string that you have to delete with delete[] (or custom
// deallocator if enabled).
//
@@ -673,6 +673,9 @@ namespace xsde
_min_length_facet (size_t);
void
+ _whitespace_facet (unsigned int);
+
+ void
_enumeration_facet (const char* const*, size_t count);
public:
@@ -688,6 +691,12 @@ namespace xsde
unsigned int length_set_ : 1;
unsigned int min_length_set_ : 1;
unsigned int max_length_set_ : 1;
+
+ // 0 - preserve
+ // 1 - replace
+ // 2 - collapse
+ //
+ unsigned int whitespace_: 2;
};
protected:
@@ -739,9 +748,9 @@ namespace xsde
virtual const char*
_dynamic_type () const;
#endif
+ normalized_string_pskel ();
#ifdef XSDE_REUSE_STYLE_TIEIN
- normalized_string_pskel ();
normalized_string_pskel (normalized_string_pskel* impl, void*);
protected:
@@ -768,9 +777,9 @@ namespace xsde
virtual const char*
_dynamic_type () const;
#endif
+ token_pskel ();
#ifdef XSDE_REUSE_STYLE_TIEIN
- token_pskel ();
token_pskel (token_pskel* impl, void*);
protected:
@@ -797,9 +806,9 @@ namespace xsde
virtual const char*
_dynamic_type () const;
#endif
+ name_pskel ();
#ifdef XSDE_REUSE_STYLE_TIEIN
- name_pskel ();
name_pskel (name_pskel* impl, void*);
protected:
@@ -826,9 +835,9 @@ namespace xsde
virtual const char*
_dynamic_type () const;
#endif
+ nmtoken_pskel ();
#ifdef XSDE_REUSE_STYLE_TIEIN
- nmtoken_pskel ();
nmtoken_pskel (nmtoken_pskel* impl, void*);
protected:
@@ -877,9 +886,9 @@ namespace xsde
virtual const char*
_dynamic_type () const;
#endif
+ ncname_pskel ();
#ifdef XSDE_REUSE_STYLE_TIEIN
- ncname_pskel ();
ncname_pskel (ncname_pskel* impl, void*);
protected:
@@ -906,9 +915,9 @@ namespace xsde
virtual const char*
_dynamic_type () const;
#endif
+ id_pskel ();
#ifdef XSDE_REUSE_STYLE_TIEIN
- id_pskel ();
id_pskel (id_pskel* impl, void*);
protected:
@@ -935,9 +944,9 @@ namespace xsde
virtual const char*
_dynamic_type () const;
#endif
+ idref_pskel ();
#ifdef XSDE_REUSE_STYLE_TIEIN
- idref_pskel ();
idref_pskel (idref_pskel* impl, void*);
protected:
@@ -986,9 +995,9 @@ namespace xsde
virtual const char*
_dynamic_type () const;
#endif
+ language_pskel ();
#ifdef XSDE_REUSE_STYLE_TIEIN
- language_pskel ();
language_pskel (language_pskel* impl, void*);
protected:
@@ -1015,9 +1024,9 @@ namespace xsde
virtual const char*
_dynamic_type () const;
#endif
+ uri_pskel ();
#ifdef XSDE_REUSE_STYLE_TIEIN
- uri_pskel ();
uri_pskel (uri_pskel* impl, void*);
protected:
diff --git a/libxsde/xsde/cxx/parser/validating/xml-schema-pskel.ixx b/libxsde/xsde/cxx/parser/validating/xml-schema-pskel.ixx
index 61a862e..0a8f99a 100644
--- a/libxsde/xsde/cxx/parser/validating/xml-schema-pskel.ixx
+++ b/libxsde/xsde/cxx/parser/validating/xml-schema-pskel.ixx
@@ -454,6 +454,7 @@ namespace xsde
facets_.length_set_ = 0;
facets_.min_length_set_ = 0;
facets_.max_length_set_ = 0;
+ facets_.whitespace_ = 0;
facets_.enum_ = 0;
facets_.enum_count_ = 0;
@@ -481,6 +482,12 @@ namespace xsde
}
inline void string_facets::
+ _whitespace_facet (unsigned int v)
+ {
+ facets_.whitespace_ = v;
+ }
+
+ inline void string_facets::
_enumeration_facet (const char* const* e, size_t count)
{
facets_.enum_ = e;
@@ -516,17 +523,21 @@ namespace xsde
// normalized_string_pskel
//
-#ifdef XSDE_REUSE_STYLE_TIEIN
inline normalized_string_pskel::
normalized_string_pskel ()
- : normalized_string_impl_ (0)
{
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ normalized_string_impl_ = 0;
+#endif
+ _whitespace_facet (1); // replace
}
+#ifdef XSDE_REUSE_STYLE_TIEIN
inline normalized_string_pskel::
normalized_string_pskel (normalized_string_pskel* impl, void*)
: simple_content (impl, 0), normalized_string_impl_ (impl)
{
+ _whitespace_facet (1); // replace
}
#endif
@@ -544,17 +555,21 @@ namespace xsde
// token_pskel
//
-#ifdef XSDE_REUSE_STYLE_TIEIN
inline token_pskel::
token_pskel ()
- : token_impl_ (0)
{
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ token_impl_ = 0;
+#endif
+ _whitespace_facet (2); // collapse
}
+#ifdef XSDE_REUSE_STYLE_TIEIN
inline token_pskel::
token_pskel (token_pskel* impl, void*)
: simple_content (impl, 0), token_impl_ (impl)
{
+ _whitespace_facet (2); // collapse
}
#endif
inline const string_facets::facets& token_pskel::
@@ -570,17 +585,21 @@ namespace xsde
// name_pskel
//
-#ifdef XSDE_REUSE_STYLE_TIEIN
inline name_pskel::
name_pskel ()
- : name_impl_ (0)
{
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ name_impl_ = 0;
+#endif
+ _whitespace_facet (2); // collapse
}
+#ifdef XSDE_REUSE_STYLE_TIEIN
inline name_pskel::
name_pskel (name_pskel* impl, void*)
: simple_content (impl, 0), name_impl_ (impl)
{
+ _whitespace_facet (2); // collapse
}
#endif
inline const string_facets::facets& name_pskel::
@@ -596,17 +615,21 @@ namespace xsde
// nmtoken_pskel
//
-#ifdef XSDE_REUSE_STYLE_TIEIN
inline nmtoken_pskel::
nmtoken_pskel ()
- : nmtoken_impl_ (0)
{
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ nmtoken_impl_ = 0;
+#endif
+ _whitespace_facet (2); // collapse
}
+#ifdef XSDE_REUSE_STYLE_TIEIN
inline nmtoken_pskel::
nmtoken_pskel (nmtoken_pskel* impl, void*)
: simple_content (impl, 0), nmtoken_impl_ (impl)
{
+ _whitespace_facet (2); // collapse
}
#endif
inline const string_facets::facets& nmtoken_pskel::
@@ -638,17 +661,21 @@ namespace xsde
// ncname_pskel
//
-#ifdef XSDE_REUSE_STYLE_TIEIN
inline ncname_pskel::
ncname_pskel ()
- : ncname_impl_ (0)
{
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ ncname_impl_ = 0;
+#endif
+ _whitespace_facet (2); // collapse
}
+#ifdef XSDE_REUSE_STYLE_TIEIN
inline ncname_pskel::
ncname_pskel (ncname_pskel* impl, void*)
: simple_content (impl, 0), ncname_impl_ (impl)
{
+ _whitespace_facet (2); // collapse
}
#endif
inline const string_facets::facets& ncname_pskel::
@@ -664,17 +691,21 @@ namespace xsde
// id_pskel
//
-#ifdef XSDE_REUSE_STYLE_TIEIN
inline id_pskel::
id_pskel ()
- : id_impl_ (0)
{
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ id_impl_ = 0;
+#endif
+ _whitespace_facet (2); // collapse
}
+#ifdef XSDE_REUSE_STYLE_TIEIN
inline id_pskel::
id_pskel (id_pskel* impl, void*)
: simple_content (impl, 0), id_impl_ (impl)
{
+ _whitespace_facet (2); // collapse
}
#endif
inline const string_facets::facets& id_pskel::
@@ -690,17 +721,21 @@ namespace xsde
// idref_pskel
//
-#ifdef XSDE_REUSE_STYLE_TIEIN
inline idref_pskel::
idref_pskel ()
- : idref_impl_ (0)
{
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ idref_impl_ = 0;
+#endif
+ _whitespace_facet (2); // collapse
}
+#ifdef XSDE_REUSE_STYLE_TIEIN
inline idref_pskel::
idref_pskel (idref_pskel* impl, void*)
: simple_content (impl, 0), idref_impl_ (impl)
{
+ _whitespace_facet (2); // collapse
}
#endif
inline const string_facets::facets& idref_pskel::
@@ -732,17 +767,21 @@ namespace xsde
// language_pskel
//
-#ifdef XSDE_REUSE_STYLE_TIEIN
inline language_pskel::
language_pskel ()
- : language_impl_ (0)
{
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ language_impl_ = 0;
+#endif
+ _whitespace_facet (2); // collapse
}
+#ifdef XSDE_REUSE_STYLE_TIEIN
inline language_pskel::
language_pskel (language_pskel* impl, void*)
: simple_content (impl, 0), language_impl_ (impl)
{
+ _whitespace_facet (2); // collapse
}
#endif
inline const string_facets::facets& language_pskel::
@@ -758,17 +797,21 @@ namespace xsde
// uri_pskel
//
-#ifdef XSDE_REUSE_STYLE_TIEIN
inline uri_pskel::
uri_pskel ()
- : uri_impl_ (0)
{
+#ifdef XSDE_REUSE_STYLE_TIEIN
+ uri_impl_ = 0;
+#endif
+ _whitespace_facet (2); // collapse
}
+#ifdef XSDE_REUSE_STYLE_TIEIN
inline uri_pskel::
uri_pskel (uri_pskel* impl, void*)
: simple_content (impl, 0), uri_impl_ (impl)
{
+ _whitespace_facet (2); // collapse
}
#endif
inline const string_facets::facets& uri_pskel::