aboutsummaryrefslogtreecommitdiff
path: root/libxsde/xsde/cxx/serializer/validating/string-common.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'libxsde/xsde/cxx/serializer/validating/string-common.cxx')
-rw-r--r--libxsde/xsde/cxx/serializer/validating/string-common.cxx50
1 files changed, 49 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;
}
}