aboutsummaryrefslogtreecommitdiff
path: root/libxsde/xsde/cxx/parser/validating
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 /libxsde/xsde/cxx/parser/validating
parentc2d201480002a24c05f1f4bc934036555b79cad6 (diff)
Validate enumerations in the xsd:string parser/serializer
Diffstat (limited to 'libxsde/xsde/cxx/parser/validating')
-rw-r--r--libxsde/xsde/cxx/parser/validating/string-common.cxx61
-rw-r--r--libxsde/xsde/cxx/parser/validating/string-common.hxx32
-rw-r--r--libxsde/xsde/cxx/parser/validating/string-stl.cxx24
-rw-r--r--libxsde/xsde/cxx/parser/validating/string.cxx24
-rw-r--r--libxsde/xsde/cxx/parser/validating/xml-schema-pskel.hxx67
-rw-r--r--libxsde/xsde/cxx/parser/validating/xml-schema-pskel.ixx52
6 files changed, 170 insertions, 90 deletions
diff --git a/libxsde/xsde/cxx/parser/validating/string-common.cxx b/libxsde/xsde/cxx/parser/validating/string-common.cxx
new file mode 100644
index 0000000..15956f6
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/string-common.cxx
@@ -0,0 +1,61 @@
+// file : xsde/cxx/parser/validating/string-common.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <string.h> // strcmp
+#include <xsde/cxx/parser/validating/string-common.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ void string_common::
+ validate_facets (const char* s,
+ size_t n,
+ const string_facets::facets& f,
+ context& ctx)
+ {
+ if (f.length_set_ && n != f.length_)
+ {
+ ctx.schema_error (schema_error::length_not_equal_prescribed);
+ return;
+ }
+
+ if (f.min_length_set_ && n < f.min_length_)
+ {
+ ctx.schema_error (schema_error::length_less_than_min);
+ return;
+ }
+
+ if (f.max_length_set_ && n > f.max_length_)
+ {
+ ctx.schema_error (schema_error::length_greater_than_max);
+ return;
+ }
+
+ if (f.enum_count_ != 0)
+ {
+ size_t i = 0;
+
+ for (; i < f.enum_count_; ++i)
+ {
+ if (strcmp (s, f.enum_[i]) == 0)
+ break;
+ }
+
+ if (i == f.enum_count_)
+ {
+ ctx.schema_error (schema_error::value_not_in_enumeration);
+ return;
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/libxsde/xsde/cxx/parser/validating/string-common.hxx b/libxsde/xsde/cxx/parser/validating/string-common.hxx
new file mode 100644
index 0000000..52ea0c5
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/string-common.hxx
@@ -0,0 +1,32 @@
+// file : xsde/cxx/parser/validating/string-common.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSDE_CXX_PARSER_VALIDATING_STRING_COMMON_HXX
+#define XSDE_CXX_PARSER_VALIDATING_STRING_COMMON_HXX
+
+#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ struct string_common
+ {
+ static void
+ validate_facets (const char* s,
+ size_t n,
+ const string_facets::facets&,
+ context&);
+ };
+ }
+ }
+ }
+}
+
+#endif // XSDE_CXX_PARSER_VALIDATING_STRING_COMMON_HXX
diff --git a/libxsde/xsde/cxx/parser/validating/string-stl.cxx b/libxsde/xsde/cxx/parser/validating/string-stl.cxx
index d0d0e14..9e1ad13 100644
--- a/libxsde/xsde/cxx/parser/validating/string-stl.cxx
+++ b/libxsde/xsde/cxx/parser/validating/string-stl.cxx
@@ -4,6 +4,7 @@
// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
#include <xsde/cxx/parser/validating/string-stl.hxx>
+#include <xsde/cxx/parser/validating/string-common.hxx>
namespace xsde
{
@@ -28,27 +29,8 @@ namespace xsde
void string_pimpl::
_post ()
{
- // Check facets.
- //
- const facets& f = _facets ();
-
- if (f.length_set_ && str_.size () != f.length_)
- {
- _schema_error (schema_error::length_not_equal_prescribed);
- return;
- }
-
- if (f.min_length_set_ && str_.size () < f.min_length_)
- {
- _schema_error (schema_error::length_less_than_min);
- return;
- }
-
- if (f.max_length_set_ && str_.size () > f.max_length_)
- {
- _schema_error (schema_error::length_greater_than_max);
- return;
- }
+ string_common::validate_facets (
+ str_.c_str (), str_.size (), _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 c40a7c9..3e29a93 100644
--- a/libxsde/xsde/cxx/parser/validating/string.cxx
+++ b/libxsde/xsde/cxx/parser/validating/string.cxx
@@ -6,6 +6,7 @@
#include <xsde/cxx/config.hxx>
#include <xsde/cxx/parser/validating/string.hxx>
+#include <xsde/cxx/parser/validating/string-common.hxx>
namespace xsde
{
@@ -40,27 +41,8 @@ namespace xsde
void string_pimpl::
_post ()
{
- // Check facets.
- //
- const facets& f = _facets ();
-
- if (f.length_set_ && str_.size () != f.length_)
- {
- _schema_error (schema_error::length_not_equal_prescribed);
- return;
- }
-
- if (f.min_length_set_ && str_.size () < f.min_length_)
- {
- _schema_error (schema_error::length_less_than_min);
- return;
- }
-
- if (f.max_length_set_ && str_.size () > f.max_length_)
- {
- _schema_error (schema_error::length_greater_than_max);
- return;
- }
+ string_common::validate_facets (
+ str_.data (), str_.size (), _facets (), _context ());
}
char* string_pimpl::
diff --git a/libxsde/xsde/cxx/parser/validating/xml-schema-pskel.hxx b/libxsde/xsde/cxx/parser/validating/xml-schema-pskel.hxx
index 1e05778..ed0ff4f 100644
--- a/libxsde/xsde/cxx/parser/validating/xml-schema-pskel.hxx
+++ b/libxsde/xsde/cxx/parser/validating/xml-schema-pskel.hxx
@@ -653,10 +653,47 @@ namespace xsde
};
+ //
// String-based types. If STL is disabled you are getting a C
// string that you have to delete with delete[].
//
- struct string_pskel: simple_content
+
+ struct string_facets
+ {
+ string_facets ();
+
+ void
+ _length_facet (size_t);
+
+ void
+ _max_length_facet (size_t);
+
+ void
+ _min_length_facet (size_t);
+
+ void
+ _enumeration_facet (const char* const*, size_t count);
+
+ public:
+ struct facets
+ {
+ size_t length_;
+ size_t min_length_;
+ size_t max_length_;
+
+ const char* const* enum_;
+ size_t enum_count_;
+
+ unsigned int length_set_ : 1;
+ unsigned int min_length_set_ : 1;
+ unsigned int max_length_set_ : 1;
+ };
+
+ protected:
+ facets facets_;
+ };
+
+ struct string_pskel: simple_content, string_facets
{
#ifdef XSDE_STL
virtual std::string
@@ -673,9 +710,8 @@ namespace xsde
_dynamic_type () const;
#endif
- string_pskel ();
-
#ifdef XSDE_REUSE_STYLE_TIEIN
+ string_pskel ();
string_pskel (string_pskel* impl, void*);
protected:
@@ -683,33 +719,8 @@ namespace xsde
#endif
// Facets.
//
- public:
- void
- _length_facet (size_t);
-
- void
- _max_length_facet (size_t);
-
- void
- _min_length_facet (size_t);
-
- protected:
- struct facets
- {
- size_t length_;
- size_t min_length_;
- size_t max_length_;
-
- unsigned int length_set_ : 1;
- unsigned int min_length_set_ : 1;
- unsigned int max_length_set_ : 1;
- };
-
const facets&
_facets () const;
-
- private:
- facets facets_;
};
struct normalized_string_pskel: simple_content
diff --git a/libxsde/xsde/cxx/parser/validating/xml-schema-pskel.ixx b/libxsde/xsde/cxx/parser/validating/xml-schema-pskel.ixx
index 3d69e15..c08fb09 100644
--- a/libxsde/xsde/cxx/parser/validating/xml-schema-pskel.ixx
+++ b/libxsde/xsde/cxx/parser/validating/xml-schema-pskel.ixx
@@ -446,51 +446,63 @@ namespace xsde
}
#endif
- // string_pskel
+ // string_facets
//
- inline string_pskel::
- string_pskel ()
+ inline string_facets::
+ string_facets ()
{
-#ifdef XSDE_REUSE_STYLE_TIEIN
- string_impl_ = 0;
-#endif
facets_.length_set_ = 0;
facets_.min_length_set_ = 0;
facets_.max_length_set_ = 0;
- }
-#ifdef XSDE_REUSE_STYLE_TIEIN
- inline string_pskel::
- string_pskel (string_pskel* impl, void*)
- : simple_content (impl, 0), string_impl_ (impl)
- {
- facets_.length_set_ = 0;
- facets_.min_length_set_ = 0;
- facets_.max_length_set_ = 0;
+ facets_.enum_ = 0;
+ facets_.enum_count_ = 0;
}
-#endif
- inline void string_pskel::
+ inline void string_facets::
_length_facet (size_t v)
{
facets_.length_ = v;
facets_.length_set_ = 1;
}
- inline void string_pskel::
+ inline void string_facets::
_max_length_facet (size_t v)
{
facets_.max_length_ = v;
facets_.max_length_set_ = 1;
}
- inline void string_pskel::
+ inline void string_facets::
_min_length_facet (size_t v)
{
facets_.min_length_ = v;
facets_.min_length_set_ = 1;
}
+ inline void string_facets::
+ _enumeration_facet (const char* const* e, size_t count)
+ {
+ facets_.enum_ = e;
+ facets_.enum_count_ = count;
+ }
+
+ // 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
+
inline const string_pskel::facets& string_pskel::
_facets () const
{
@@ -499,7 +511,7 @@ namespace xsde
return static_cast<const string_pskel&> (*parent_).facets_;
else
#endif
- return facets_;
+ return facets_;
}
// normalized_string_pskel