aboutsummaryrefslogtreecommitdiff
path: root/libxsde/xsde/cxx/serializer
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 /libxsde/xsde/cxx/serializer
parent0dd6d623af5dfe3590d0c269f76a2fa322e75e58 (diff)
Support for validation of the pattern facet
New test: hybrid/pattern.
Diffstat (limited to 'libxsde/xsde/cxx/serializer')
-rw-r--r--libxsde/xsde/cxx/serializer/validating/string-common.cxx50
-rw-r--r--libxsde/xsde/cxx/serializer/validating/xml-schema-sskel.hxx25
-rw-r--r--libxsde/xsde/cxx/serializer/validating/xml-schema-sskel.ixx27
3 files changed, 101 insertions, 1 deletions
diff --git a/libxsde/xsde/cxx/serializer/validating/string-common.cxx b/libxsde/xsde/cxx/serializer/validating/string-common.cxx
index 5dab6c9..53958a4 100644
--- a/libxsde/xsde/cxx/serializer/validating/string-common.cxx
+++ b/libxsde/xsde/cxx/serializer/validating/string-common.cxx
@@ -3,7 +3,16 @@
// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC
// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+#include <xsde/cxx/config.hxx>
+
#include <string.h> // strlen
+
+#ifdef XSDE_REGEXP
+#ifdef XSDE_EXCEPTIONS
+# include <new> // std::bad_alloc
+#endif
+#endif
+
#include <xsde/cxx/string-search.hxx>
#include <xsde/cxx/serializer/validating/string-common.hxx>
@@ -23,7 +32,11 @@ namespace xsde
if (f.length_set_ ||
f.min_length_set_ ||
f.max_length_set_ ||
- f.enum_count_ != 0)
+ f.enum_count_ != 0
+#ifdef XSDE_REGEXP
+ || f.pattern_set_ != 0
+#endif
+ )
{
return validate_facets (s, strlen (s), f, ctx);
}
@@ -64,6 +77,41 @@ namespace xsde
}
}
+#ifdef XSDE_REGEXP
+ if (f.pattern_set_ != 0)
+ {
+ if (f.pattern_set_ == 1)
+ {
+ xmlRegexpPtr r = xmlRegexpCompile (
+ reinterpret_cast<const xmlChar*> (f.pattern_.str));
+
+ if (r == 0)
+ {
+#ifdef XSDE_EXCEPTIONS
+ throw std::bad_alloc ();
+#else
+ ctx.sys_error (sys_error::no_memory);
+ return false;
+#endif
+
+ }
+
+ string_facets::facets& t =
+ const_cast<string_facets::facets&> (f);
+
+ t.pattern_.regexp = r;
+ t.pattern_set_ = 2;
+ }
+
+ if (xmlRegexpExec (
+ f.pattern_.regexp,
+ reinterpret_cast<const xmlChar*> (s)) != 1)
+ {
+ ctx.schema_error (schema_error::value_pattern_mismatch);
+ return false;
+ }
+ }
+#endif
return true;
}
}
diff --git a/libxsde/xsde/cxx/serializer/validating/xml-schema-sskel.hxx b/libxsde/xsde/cxx/serializer/validating/xml-schema-sskel.hxx
index a97742a..b93012d 100644
--- a/libxsde/xsde/cxx/serializer/validating/xml-schema-sskel.hxx
+++ b/libxsde/xsde/cxx/serializer/validating/xml-schema-sskel.hxx
@@ -12,6 +12,10 @@
# include <string>
#endif
+#ifdef XSDE_REGEXP
+# include <xsde/c/regexp/xmlregexp.h>
+#endif
+
#include <xsde/cxx/serializer/xml-schema.hxx>
#include <xsde/cxx/serializer/validating/serializer.hxx>
@@ -643,6 +647,9 @@ namespace xsde
struct string_facets
{
string_facets ();
+#ifdef XSDE_REGEXP
+ ~string_facets ();
+#endif
void
_length_facet (size_t);
@@ -656,6 +663,9 @@ namespace xsde
void
_enumeration_facet (const char* const*, size_t count);
+ void
+ _pattern_facet (const char*);
+
public:
struct facets
{
@@ -666,9 +676,24 @@ namespace xsde
const char* const* enum_;
size_t enum_count_;
+#ifdef XSDE_REGEXP
+ union
+ {
+ const char* str;
+ xmlRegexpPtr regexp;
+ } pattern_;
+#endif
unsigned int length_set_ : 1;
unsigned int min_length_set_ : 1;
unsigned int max_length_set_ : 1;
+
+#ifdef XSDE_REGEXP
+ // 0 - not set
+ // 1 - string
+ // 2 - compiled
+ //
+ unsigned int pattern_set_: 2;
+#endif
};
protected:
diff --git a/libxsde/xsde/cxx/serializer/validating/xml-schema-sskel.ixx b/libxsde/xsde/cxx/serializer/validating/xml-schema-sskel.ixx
index d62fdd4..35ce5d9 100644
--- a/libxsde/xsde/cxx/serializer/validating/xml-schema-sskel.ixx
+++ b/libxsde/xsde/cxx/serializer/validating/xml-schema-sskel.ixx
@@ -458,7 +458,20 @@ namespace xsde
facets_.enum_ = 0;
facets_.enum_count_ = 0;
+
+#ifdef XSDE_REGEXP
+ facets_.pattern_set_ = 0;
+#endif
+ }
+
+#ifdef XSDE_REGEXP
+ inline string_facets::
+ ~string_facets ()
+ {
+ if (facets_.pattern_set_ == 2)
+ xmlRegFreeRegexp (facets_.pattern_.regexp);
}
+#endif
inline void string_facets::
_length_facet (size_t v)
@@ -488,6 +501,20 @@ namespace xsde
facets_.enum_count_ = count;
}
+#ifndef XSDE_REGEXP
+ inline void string_facets::
+ _pattern_facet (const char*)
+ {
+ }
+#else
+ inline void string_facets::
+ _pattern_facet (const char* s)
+ {
+ facets_.pattern_.str = s;
+ facets_.pattern_set_ = 1;
+ }
+#endif
+
// string_sskel
//
#ifdef XSDE_REUSE_STYLE_TIEIN