aboutsummaryrefslogtreecommitdiff
path: root/xsde/cxx/serializer/serializer-source.cxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2010-03-28 16:53:35 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2010-03-28 16:53:35 +0200
commit4332a60585a14ff51bc54d29a4a81d37b3b1df81 (patch)
treefd3b807e3f5b3841371d509505a50498d21a2f99 /xsde/cxx/serializer/serializer-source.cxx
parentc2d201480002a24c05f1f4bc934036555b79cad6 (diff)
Validate enumerations in the xsd:string parser/serializer
Diffstat (limited to 'xsde/cxx/serializer/serializer-source.cxx')
-rw-r--r--xsde/cxx/serializer/serializer-source.cxx29
1 files changed, 29 insertions, 0 deletions
diff --git a/xsde/cxx/serializer/serializer-source.cxx b/xsde/cxx/serializer/serializer-source.cxx
index 509acf4..e4fd239 100644
--- a/xsde/cxx/serializer/serializer-source.cxx
+++ b/xsde/cxx/serializer/serializer-source.cxx
@@ -5,6 +5,8 @@
#include <cxx/serializer/serializer-source.hxx>
+#include <cult/containers/set.hxx>
+
#include <xsd-frontend/semantic-graph.hxx>
#include <xsd-frontend/traversal.hxx>
@@ -382,6 +384,13 @@ namespace CXX
String const& arg (arg_type (e));
SemanticGraph::Type& base (e.inherits ().base ());
+ Boolean facets (false); // Whether we need to set facets.
+ if (validation)
+ {
+ StringBasedType t (facets);
+ t.dispatch (e);
+ }
+
os << "// " << name << endl
<< "//" << endl
<< endl;
@@ -470,6 +479,26 @@ namespace CXX
BaseOverride t (*this, name);
t.dispatch (base);
}
+
+ if (facets)
+ {
+ typedef Cult::Containers::Set<String> Enums;
+ Enums enums;
+
+ for (Type::NamesIterator i (e.names_begin ()),
+ end (e.names_end ()); i != end; ++i)
+ enums.insert (i->name ());
+
+ os << "const char* const " << name << "::" << "_xsde_" << name <<
+ "_enums_[" << enums.size () << "UL] = "
+ << "{";
+
+ for (Enums::Iterator b (enums.begin ()), i (b), end (enums.end ());
+ i != end; ++i)
+ os << (i != b ? ",\n" : "") << strlit (*i);
+
+ os << "};";
+ }
}
};