From 4332a60585a14ff51bc54d29a4a81d37b3b1df81 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Sun, 28 Mar 2010 16:53:35 +0200 Subject: Validate enumerations in the xsd:string parser/serializer --- .../cxx/serializer/validating/string-common.cxx | 69 ++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 libxsde/xsde/cxx/serializer/validating/string-common.cxx (limited to 'libxsde/xsde/cxx/serializer/validating/string-common.cxx') diff --git a/libxsde/xsde/cxx/serializer/validating/string-common.cxx b/libxsde/xsde/cxx/serializer/validating/string-common.cxx new file mode 100644 index 0000000..20a1b34 --- /dev/null +++ b/libxsde/xsde/cxx/serializer/validating/string-common.cxx @@ -0,0 +1,69 @@ +// file : xsde/cxx/serializer/validating/string-common.cxx +// author : Boris Kolpackov +// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// license : GNU GPL v2 + exceptions; see accompanying LICENSE file + +#include // strlen, strcmp +#include + +namespace xsde +{ + namespace cxx + { + namespace serializer + { + namespace validating + { + void string_common:: + validate_facets (const char* s, +#ifdef XSDE_STL + size_t n, +#endif + const string_facets::facets& f, + context& ctx) + { +#ifndef XSDE_STL + size_t n; + if (f.length_set_ || f.min_length_set_ || f.max_length_set_) + n = strlen (s); +#endif + + 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; + } + } + } + } + } + } +} -- cgit v1.1