aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2009-03-11 14:18:16 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2009-03-11 14:18:16 +0200
commitda1ce0f39a36a2fca1f8d51a67b92be6368ddbfd (patch)
tree5752560e8054e8ba61cd6138d3a11a429b30e257
parentfb2b2359be798213a7a1a6d58b3627e63f8315d7 (diff)
Use the common POD stack container for the parser state
-rw-r--r--dist/libxsde/xsde/makefile2
-rw-r--r--dist/libxsde/xsde/nmakefile2
-rw-r--r--libxsde/xsde/cxx/parser/state.cxx37
-rw-r--r--libxsde/xsde/cxx/parser/state.hxx49
-rw-r--r--libxsde/xsde/cxx/parser/state.ixx64
-rw-r--r--libxsde/xsde/cxx/parser/validating/parser.hxx5
-rw-r--r--libxsde/xsde/cxx/parser/validating/parser.ixx12
-rw-r--r--libxsde/xsde/makefile2
-rw-r--r--xsde/cxx/parser/parser-header.cxx7
9 files changed, 39 insertions, 141 deletions
diff --git a/dist/libxsde/xsde/makefile b/dist/libxsde/xsde/makefile
index b852189..eb1abb3 100644
--- a/dist/libxsde/xsde/makefile
+++ b/dist/libxsde/xsde/makefile
@@ -71,7 +71,7 @@ endif
## C++/Parser
##
-src += cxx/parser/elements.cxx cxx/parser/state.cxx
+src += cxx/parser/elements.cxx
src += cxx/parser/expat/document.cxx cxx/parser/expat/xml-error.cxx
ifeq ($(XSDE_POLYMORPHIC),y)
diff --git a/dist/libxsde/xsde/nmakefile b/dist/libxsde/xsde/nmakefile
index 506b874..fb2789a 100644
--- a/dist/libxsde/xsde/nmakefile
+++ b/dist/libxsde/xsde/nmakefile
@@ -73,7 +73,7 @@ cxx\hybrid\xdr\string-sequence.cxx
## C++/Parser
##
-src = $(src) cxx\parser\elements.cxx cxx\parser\state.cxx
+src = $(src) cxx\parser\elements.cxx
src = $(src) cxx\parser\expat\document.cxx cxx\parser\expat\xml-error.cxx
!if "$(XSDE_POLYMORPHIC)" == "y"
diff --git a/libxsde/xsde/cxx/parser/state.cxx b/libxsde/xsde/cxx/parser/state.cxx
deleted file mode 100644
index 756190e..0000000
--- a/libxsde/xsde/cxx/parser/state.cxx
+++ /dev/null
@@ -1,37 +0,0 @@
-// file : xsde/cxx/parser/state.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 <string.h> // memcpy
-
-#include <xsde/cxx/parser/state.hxx>
-
-namespace xsde
-{
- namespace cxx
- {
- namespace parser
- {
- stack::error stack::
- grow ()
- {
- size_t c = capacity_ ? capacity_ * 2 : 8;
- char* d = new char[c * el_size_];
-
- if (d == 0)
- return error_no_memory;
-
- if (size_ > 1)
- memcpy (d, data_, (size_ - 1) * el_size_);
-
- delete[] data_;
-
- data_ = d;
- capacity_ = c;
-
- return error_none;
- }
- }
- }
-}
diff --git a/libxsde/xsde/cxx/parser/state.hxx b/libxsde/xsde/cxx/parser/state.hxx
index 11ace8d..4250949 100644
--- a/libxsde/xsde/cxx/parser/state.hxx
+++ b/libxsde/xsde/cxx/parser/state.hxx
@@ -6,8 +6,9 @@
#ifndef XSDE_CXX_PARSER_STATE_HXX
#define XSDE_CXX_PARSER_STATE_HXX
-#include <stddef.h> // size_t
+#include <xsde/cxx/config.hxx>
+#include <xsde/cxx/stack.hxx>
#include <xsde/cxx/parser/elements.hxx>
namespace xsde
@@ -16,55 +17,17 @@ namespace xsde
{
namespace parser
{
- // POD stack with pre-allocated first element. You may
- // need to pad your elements to get the proper alignment.
- //
- struct stack
- {
- enum error
- {
- error_none,
- error_no_memory
- };
-
- ~stack ();
- stack (size_t element_size, void* first_element);
-
- public:
- void
- pop ();
-
- error
- push ();
-
- void*
- top ();
-
- size_t
- element_size () const;
-
- void
- clear ();
-
- private:
- error
- grow ();
-
- private:
- size_t el_size_;
- void* first_;
- char* data_;
- size_t size_;
- size_t capacity_;
- };
-
// Optimized state stack for non-recursive case (one element).
//
struct parser_stack
{
parser_stack (parser_state& first);
+#ifdef XSDE_EXCEPTIONS
+ void
+#else
stack::error
+#endif
push (parser_state&);
void
diff --git a/libxsde/xsde/cxx/parser/state.ixx b/libxsde/xsde/cxx/parser/state.ixx
index 6f9c4b7..fdd547f 100644
--- a/libxsde/xsde/cxx/parser/state.ixx
+++ b/libxsde/xsde/cxx/parser/state.ixx
@@ -9,58 +9,6 @@ namespace xsde
{
namespace parser
{
- // stack
- //
-
- inline stack::
- ~stack ()
- {
- delete[] data_;
- }
-
- inline stack::
- stack (size_t el_size, void* first_el)
- : el_size_ (el_size), first_ (first_el),
- data_ (0), size_ (0), capacity_ (0)
- {
- }
-
- inline void stack::
- pop ()
- {
- --size_;
- }
-
- inline stack::error stack::
- push ()
- {
- if (size_ > capacity_)
- if (error e = grow ())
- return e;
-
- ++size_;
-
- return error_none;
- }
-
- inline void* stack::
- top ()
- {
- return size_ == 1 ? first_ : data_ + (size_ - 1) * el_size_;
- }
-
- inline size_t stack::
- element_size () const
- {
- return el_size_;
- }
-
- inline void stack::
- clear ()
- {
- size_ = 0;
- }
-
// parser_stack
//
inline parser_stack::
@@ -69,14 +17,25 @@ namespace xsde
{
}
+#ifdef XSDE_EXCEPTIONS
+ inline void parser_stack::
+#else
inline stack::error parser_stack::
+#endif
push (parser_state& s)
{
+#ifdef XSDE_EXCEPTIONS
+ stack_.push ();
+#else
if (stack::error e = stack_.push ())
return e;
+#endif
*static_cast<parser_state*> (stack_.top ()) = s;
+
+#ifndef XSDE_EXCEPTIONS
return stack::error_none;
+#endif
}
inline void parser_stack::
@@ -99,4 +58,3 @@ namespace xsde
}
}
}
-
diff --git a/libxsde/xsde/cxx/parser/validating/parser.hxx b/libxsde/xsde/cxx/parser/validating/parser.hxx
index 246b7c9..0a0aa2b 100644
--- a/libxsde/xsde/cxx/parser/validating/parser.hxx
+++ b/libxsde/xsde/cxx/parser/validating/parser.hxx
@@ -10,6 +10,7 @@
#include <stddef.h> // size_t
+#include <xsde/cxx/stack.hxx>
#include <xsde/cxx/string.hxx>
#include <xsde/cxx/ro-string.hxx>
@@ -253,7 +254,11 @@ namespace xsde
{
all_stack (size_t n, unsigned char* first);
+#ifdef XSDE_EXCEPTIONS
+ void
+#else
stack::error
+#endif
push ();
void
diff --git a/libxsde/xsde/cxx/parser/validating/parser.ixx b/libxsde/xsde/cxx/parser/validating/parser.ixx
index 4a0e176..22697cf 100644
--- a/libxsde/xsde/cxx/parser/validating/parser.ixx
+++ b/libxsde/xsde/cxx/parser/validating/parser.ixx
@@ -67,18 +67,27 @@ namespace xsde
{
}
+#ifdef XSDE_EXCEPTIONS
+ inline void all_stack::
+#else
inline stack::error all_stack::
+#endif
push ()
{
+#ifdef XSDE_EXCEPTIONS
+ stack_.push ();
+#else
if (stack::error e = stack_.push ())
return e;
-
+#endif
unsigned char* p = static_cast<unsigned char*> (stack_.top ());
for (size_t i = 0; i < stack_.element_size (); ++i)
p[i] = 0;
+#ifndef XSDE_EXCEPTIONS
return stack::error_none;
+#endif
}
inline void all_stack::
@@ -118,4 +127,3 @@ namespace xsde
}
}
}
-
diff --git a/libxsde/xsde/makefile b/libxsde/xsde/makefile
index b9b3884..f7d17ed 100644
--- a/libxsde/xsde/makefile
+++ b/libxsde/xsde/makefile
@@ -68,7 +68,7 @@ endif
## C++/Parser
##
-cxx_tun += cxx/parser/elements.cxx cxx/parser/state.cxx
+cxx_tun += cxx/parser/elements.cxx
ifeq ($(xsde_polymorphic),y)
cxx_tun += cxx/parser/map.cxx cxx/parser/substitution-map.cxx
diff --git a/xsde/cxx/parser/parser-header.cxx b/xsde/cxx/parser/parser-header.cxx
index 95642ab..f1559e8 100644
--- a/xsde/cxx/parser/parser-header.cxx
+++ b/xsde/cxx/parser/parser-header.cxx
@@ -1006,7 +1006,7 @@ namespace CXX
<< "};";
os << "v_state_ v_state_first_;"
- << "::xsde::cxx::parser::stack v_state_stack_;"
+ << "::xsde::cxx::stack v_state_stack_;"
<< endl;
os << "virtual void" << endl
@@ -1033,7 +1033,7 @@ namespace CXX
os << "};";
os << "v_state_attr_ v_state_attr_first_;"
- << "::xsde::cxx::parser::stack v_state_attr_stack_;"
+ << "::xsde::cxx::stack v_state_attr_stack_;"
<< endl;
os << "virtual void" << endl
@@ -1716,7 +1716,8 @@ namespace CXX
// Parsers.
//
if (ctx.validation)
- ctx.os << "#include <xsde/cxx/parser/validating/parser.hxx>" << endl
+ ctx.os << "#include <xsde/cxx/stack.hxx>" << endl
+ << "#include <xsde/cxx/parser/validating/parser.hxx>" << endl
<< "#include <xsde/cxx/parser/validating/xml-schema-pskel.hxx>" << endl
<< "#include <xsde/cxx/parser/validating/xml-schema-pimpl.hxx>" << endl
<< endl;