aboutsummaryrefslogtreecommitdiff
path: root/libxsde/xsde/cxx/parser/validating/idrefs-stl.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'libxsde/xsde/cxx/parser/validating/idrefs-stl.cxx')
-rw-r--r--libxsde/xsde/cxx/parser/validating/idrefs-stl.cxx133
1 files changed, 133 insertions, 0 deletions
diff --git a/libxsde/xsde/cxx/parser/validating/idrefs-stl.cxx b/libxsde/xsde/cxx/parser/validating/idrefs-stl.cxx
new file mode 100644
index 0000000..0451a43
--- /dev/null
+++ b/libxsde/xsde/cxx/parser/validating/idrefs-stl.cxx
@@ -0,0 +1,133 @@
+// file : xsde/cxx/parser/validating/idrefs-stl.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <xsde/cxx/pre.hxx>
+
+#include <xsde/cxx/config.hxx>
+
+#include <xsde/cxx/parser/validating/idrefs-stl.hxx>
+
+namespace xsde
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ namespace validating
+ {
+ idrefs_pimpl::
+ ~idrefs_pimpl ()
+ {
+ if (!base_)
+ delete seq_;
+ }
+
+ void idrefs_pimpl::
+ _reset ()
+ {
+ idrefs_pskel::_reset ();
+
+ if (!base_)
+ {
+ delete seq_;
+ seq_ = 0;
+ }
+
+ parser_._reset ();
+ }
+
+ idrefs_pimpl::
+ idrefs_pimpl (bool base)
+ : base_ (base), seq_ (0)
+ {
+ }
+
+ void idrefs_pimpl::
+ pre_impl (string_sequence* seq)
+ {
+ seq_ = seq;
+ }
+
+ void idrefs_pimpl::
+ _pre ()
+ {
+ if (seq_ == 0)
+ {
+ seq_ = new string_sequence ();
+
+#ifndef XSDE_EXCEPTIONS
+ if (seq_ == 0)
+ {
+ _sys_error (sys_error::no_memory);
+ return;
+ }
+#endif
+ }
+
+ idrefs_pskel::_pre ();
+ }
+
+ void idrefs_pimpl::
+ _post ()
+ {
+ idrefs_pskel::_post ();
+
+ // Should have at least one element.
+ //
+ if (!_context ().error_type () && seq_->size () < 1)
+ _schema_error (schema_error::invalid_idrefs_value);
+ }
+
+ string_sequence* idrefs_pimpl::
+ post_idrefs ()
+ {
+ string_sequence* r = seq_;
+ seq_ = 0;
+ return r;
+ }
+
+ void idrefs_pimpl::
+ _xsde_parse_item (const ro_string& s)
+ {
+ context& ctx = _context ();
+
+ idref_pskel& p = parser_;
+
+ p.pre ();
+
+#ifndef XSDE_EXCEPTIONS
+ if (!p._error_type ())
+ p._pre_impl (ctx);
+ else
+ p._copy_error (ctx);
+#else
+ p._pre_impl (ctx);
+#endif
+ if (!ctx.error_type ())
+ p._characters (s);
+
+ if (!ctx.error_type ())
+ p._post_impl ();
+
+ if (!ctx.error_type ())
+ {
+ const std::string& x = p.post_idref ();
+
+#ifndef XSDE_EXCEPTIONS
+ if (!p._error_type ())
+ seq_->push_back (x);
+ else
+ p._copy_error (ctx);
+#else
+ seq_->push_back (x);
+#endif
+ }
+ }
+ }
+ }
+ }
+}
+
+#include <xsde/cxx/post.hxx>