aboutsummaryrefslogtreecommitdiff
path: root/xsde/cxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2010-10-11 12:43:48 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2010-10-11 12:43:48 +0200
commit9553149aa6b6561c49981adf2848607a43765054 (patch)
treeff941ad89aa2c87ec5ddbd7a7bdd189fc33f87ba /xsde/cxx
parent0dd6d623af5dfe3590d0c269f76a2fa322e75e58 (diff)
Support for validation of the pattern facet
New test: hybrid/pattern.
Diffstat (limited to 'xsde/cxx')
-rw-r--r--xsde/cxx/parser/elements.cxx32
-rw-r--r--xsde/cxx/parser/parser-inline.cxx107
-rw-r--r--xsde/cxx/serializer/elements.cxx36
-rw-r--r--xsde/cxx/serializer/serializer-inline.cxx81
4 files changed, 164 insertions, 92 deletions
diff --git a/xsde/cxx/parser/elements.cxx b/xsde/cxx/parser/elements.cxx
index 2c138ce..25e2032 100644
--- a/xsde/cxx/parser/elements.cxx
+++ b/xsde/cxx/parser/elements.cxx
@@ -207,24 +207,30 @@ namespace CXX
SemanticGraph::Type& ub (ultimate_base (c));
Restricts::FacetIterator end (r.facet_end ());
- if ((ub.is_a<SemanticGraph::Fundamental::String> () ||
- ub.is_a<SemanticGraph::Fundamental::AnyURI> ()) &&
- r.facet_find (L"whiteSpace") != end)
- return true;
-
- if (validation)
+ if (ub.is_a<SemanticGraph::Fundamental::String> () ||
+ ub.is_a<SemanticGraph::Fundamental::AnyURI> ())
{
- if (ub.is_a<SemanticGraph::Fundamental::Short> () ||
- ub.is_a<SemanticGraph::Fundamental::UnsignedByte> () ||
- ub.is_a<SemanticGraph::Fundamental::UnsignedShort> () ||
- ub.is_a<SemanticGraph::Fundamental::UnsignedInt> () ||
- ub.is_a<SemanticGraph::Fundamental::String> () ||
- ub.is_a<SemanticGraph::Fundamental::AnyURI> ())
+ if (r.facet_find (L"whiteSpace") != end)
+ return true;
+
+ if (validation)
{
if (r.facet_find (L"length") != end ||
r.facet_find (L"minLength") != end ||
r.facet_find (L"maxLength") != end ||
- r.facet_find (L"minInclusive") != end ||
+ r.facet_find (L"pattern") != end)
+ return true;
+ }
+ }
+
+ if (ub.is_a<SemanticGraph::Fundamental::Short> () ||
+ ub.is_a<SemanticGraph::Fundamental::UnsignedByte> () ||
+ ub.is_a<SemanticGraph::Fundamental::UnsignedShort> () ||
+ ub.is_a<SemanticGraph::Fundamental::UnsignedInt> ())
+ {
+ if (validation)
+ {
+ if (r.facet_find (L"minInclusive") != end ||
r.facet_find (L"minExclusive") != end ||
r.facet_find (L"maxInclusive") != end ||
r.facet_find (L"maxExclusive") != end)
diff --git a/xsde/cxx/parser/parser-inline.cxx b/xsde/cxx/parser/parser-inline.cxx
index 984eca6..d20a3e7 100644
--- a/xsde/cxx/parser/parser-inline.cxx
+++ b/xsde/cxx/parser/parser-inline.cxx
@@ -17,54 +17,83 @@ namespace CXX
Void
facet_calls (SemanticGraph::Complex& c, Context& ctx)
{
+ using SemanticGraph::Restricts;
+
std::wostream& os (ctx.os);
- using SemanticGraph::Restricts;
+ SemanticGraph::Type& ub (ctx.ultimate_base (c));
Restricts& r (dynamic_cast<Restricts&> (c.inherits ()));
- for (Restricts::FacetIterator i (r.facet_begin ());
- i != r.facet_end (); ++i)
+ if (ub.is_a<SemanticGraph::Fundamental::String> () ||
+ ub.is_a<SemanticGraph::Fundamental::AnyURI> ())
{
- if (i->first == L"length")
- {
- os << "this->_length_facet (" << i->second << "UL);";
- }
- else if (i->first == L"minLength")
- {
- os << "this->_min_length_facet (" << i->second << "UL);";
- }
- else if (i->first == L"maxLength")
- {
- os << "this->_max_length_facet (" << i->second << "UL);";
- }
- else if (i->first == L"minInclusive")
- {
- os << "this->_min_facet (" << i->second << ", true);";
- }
- else if (i->first == L"minExclusive")
+ for (Restricts::FacetIterator i (r.facet_begin ());
+ i != r.facet_end (); ++i)
{
- os << "this->_min_facet (" << i->second << ", false);";
- }
- else if (i->first == L"maxInclusive")
- {
- os << "this->_max_facet (" << i->second << ", true);";
- }
- else if (i->first == L"maxExclusive")
- {
- os << "this->_max_facet (" << i->second << ", false);";
+ if (i->first == L"whiteSpace")
+ {
+ os << "this->_whitespace_facet (";
+
+ if (i->second == L"preserve")
+ os << "0";
+ else if (i->second == L"replace")
+ os << "1";
+ else if (i->second == L"collapse")
+ os << "2";
+
+ os << ");";
+ continue;
+ }
+
+ if (!ctx.validation)
+ continue;
+
+ if (i->first == L"length")
+ {
+ os << "this->_length_facet (" << i->second << "UL);";
+ }
+ else if (i->first == L"minLength")
+ {
+ os << "this->_min_length_facet (" << i->second << "UL);";
+ }
+ else if (i->first == L"maxLength")
+ {
+ os << "this->_max_length_facet (" << i->second << "UL);";
+ }
+ else if (i->first == L"pattern")
+ {
+ os << "this->_pattern_facet (" << ctx.strlit (i->second) << ");";
+ }
}
- else if (i->first == L"whiteSpace")
- {
- os << "this->_whitespace_facet (";
+ }
- if (i->second == L"preserve")
- os << "0";
- else if (i->second == L"replace")
- os << "1";
- else if (i->second == L"collapse")
- os << "2";
+ if (ub.is_a<SemanticGraph::Fundamental::Short> () ||
+ ub.is_a<SemanticGraph::Fundamental::UnsignedByte> () ||
+ ub.is_a<SemanticGraph::Fundamental::UnsignedShort> () ||
+ ub.is_a<SemanticGraph::Fundamental::UnsignedInt> ())
+ {
+ for (Restricts::FacetIterator i (r.facet_begin ());
+ i != r.facet_end (); ++i)
+ {
+ if (!ctx.validation)
+ continue;
- os << ");";
+ if (i->first == L"minInclusive")
+ {
+ os << "this->_min_facet (" << i->second << ", true);";
+ }
+ else if (i->first == L"minExclusive")
+ {
+ os << "this->_min_facet (" << i->second << ", false);";
+ }
+ else if (i->first == L"maxInclusive")
+ {
+ os << "this->_max_facet (" << i->second << ", true);";
+ }
+ else if (i->first == L"maxExclusive")
+ {
+ os << "this->_max_facet (" << i->second << ", false);";
+ }
}
}
}
diff --git a/xsde/cxx/serializer/elements.cxx b/xsde/cxx/serializer/elements.cxx
index 62fd32d..e598f8f 100644
--- a/xsde/cxx/serializer/elements.cxx
+++ b/xsde/cxx/serializer/elements.cxx
@@ -225,24 +225,34 @@ namespace CXX
return false;
SemanticGraph::Type& ub (ultimate_base (c));
+ Restricts::FacetIterator end (r.facet_end ());
+
+ if (ub.is_a<SemanticGraph::Fundamental::String> () ||
+ ub.is_a<SemanticGraph::Fundamental::AnyURI> ())
+ {
+ if (validation)
+ {
+ if (r.facet_find (L"length") != end ||
+ r.facet_find (L"minLength") != end ||
+ r.facet_find (L"maxLength") != end ||
+ r.facet_find (L"pattern") != end)
+ return true;
+ }
+ }
if (ub.is_a<SemanticGraph::Fundamental::Short> () ||
ub.is_a<SemanticGraph::Fundamental::UnsignedByte> () ||
ub.is_a<SemanticGraph::Fundamental::UnsignedShort> () ||
- ub.is_a<SemanticGraph::Fundamental::UnsignedInt> () ||
- ub.is_a<SemanticGraph::Fundamental::String> () ||
- ub.is_a<SemanticGraph::Fundamental::AnyURI> ())
+ ub.is_a<SemanticGraph::Fundamental::UnsignedInt> ())
{
- Restricts::FacetIterator end (r.facet_end ());
-
- if (r.facet_find (L"length") != end ||
- r.facet_find (L"minLength") != end ||
- r.facet_find (L"maxLength") != end ||
- r.facet_find (L"minInclusive") != end ||
- r.facet_find (L"minExclusive") != end ||
- r.facet_find (L"maxInclusive") != end ||
- r.facet_find (L"maxExclusive") != end)
- return true;
+ if (validation)
+ {
+ if (r.facet_find (L"minInclusive") != end ||
+ r.facet_find (L"minExclusive") != end ||
+ r.facet_find (L"maxInclusive") != end ||
+ r.facet_find (L"maxExclusive") != end)
+ return true;
+ }
}
}
diff --git a/xsde/cxx/serializer/serializer-inline.cxx b/xsde/cxx/serializer/serializer-inline.cxx
index f888e4f..4bebc9c 100644
--- a/xsde/cxx/serializer/serializer-inline.cxx
+++ b/xsde/cxx/serializer/serializer-inline.cxx
@@ -17,41 +17,68 @@ namespace CXX
Void
facet_calls (SemanticGraph::Complex& c, Context& ctx)
{
+ using SemanticGraph::Restricts;
+
std::wostream& os (ctx.os);
- using SemanticGraph::Restricts;
+ SemanticGraph::Type& ub (ctx.ultimate_base (c));
Restricts& r (dynamic_cast<Restricts&> (c.inherits ()));
- for (Restricts::FacetIterator i (r.facet_begin ());
- i != r.facet_end (); ++i)
+ if (ub.is_a<SemanticGraph::Fundamental::String> () ||
+ ub.is_a<SemanticGraph::Fundamental::AnyURI> ())
{
- if (i->first == L"length")
- {
- os << "this->_length_facet (" << i->second << "UL);";
- }
- else if (i->first == L"minLength")
- {
- os << "this->_min_length_facet (" << i->second << "UL);";
- }
- else if (i->first == L"maxLength")
- {
- os << "this->_max_length_facet (" << i->second << "UL);";
- }
- else if (i->first == L"minInclusive")
+ for (Restricts::FacetIterator i (r.facet_begin ());
+ i != r.facet_end (); ++i)
{
- os << "this->_min_facet (" << i->second << ", true);";
- }
- else if (i->first == L"minExclusive")
- {
- os << "this->_min_facet (" << i->second << ", false);";
- }
- else if (i->first == L"maxInclusive")
- {
- os << "this->_max_facet (" << i->second << ", true);";
+ if (!ctx.validation)
+ continue;
+
+ if (i->first == L"length")
+ {
+ os << "this->_length_facet (" << i->second << "UL);";
+ }
+ else if (i->first == L"minLength")
+ {
+ os << "this->_min_length_facet (" << i->second << "UL);";
+ }
+ else if (i->first == L"maxLength")
+ {
+ os << "this->_max_length_facet (" << i->second << "UL);";
+ }
+ else if (i->first == L"pattern")
+ {
+ os << "this->_pattern_facet (" << ctx.strlit (i->second) << ");";
+ }
}
- else if (i->first == L"maxExclusive")
+ }
+
+ if (ub.is_a<SemanticGraph::Fundamental::Short> () ||
+ ub.is_a<SemanticGraph::Fundamental::UnsignedByte> () ||
+ ub.is_a<SemanticGraph::Fundamental::UnsignedShort> () ||
+ ub.is_a<SemanticGraph::Fundamental::UnsignedInt> ())
+ {
+ for (Restricts::FacetIterator i (r.facet_begin ());
+ i != r.facet_end (); ++i)
{
- os << "this->_max_facet (" << i->second << ", false);";
+ if (!ctx.validation)
+ continue;
+
+ if (i->first == L"minInclusive")
+ {
+ os << "this->_min_facet (" << i->second << ", true);";
+ }
+ else if (i->first == L"minExclusive")
+ {
+ os << "this->_min_facet (" << i->second << ", false);";
+ }
+ else if (i->first == L"maxInclusive")
+ {
+ os << "this->_max_facet (" << i->second << ", true);";
+ }
+ else if (i->first == L"maxExclusive")
+ {
+ os << "this->_max_facet (" << i->second << ", false);";
+ }
}
}
}