From da1ce0f39a36a2fca1f8d51a67b92be6368ddbfd Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Wed, 11 Mar 2009 14:18:16 +0200 Subject: Use the common POD stack container for the parser state --- dist/libxsde/xsde/makefile | 2 +- dist/libxsde/xsde/nmakefile | 2 +- libxsde/xsde/cxx/parser/state.cxx | 37 ---------------- libxsde/xsde/cxx/parser/state.hxx | 49 +++----------------- libxsde/xsde/cxx/parser/state.ixx | 64 +++++---------------------- libxsde/xsde/cxx/parser/validating/parser.hxx | 5 +++ libxsde/xsde/cxx/parser/validating/parser.ixx | 12 ++++- libxsde/xsde/makefile | 2 +- xsde/cxx/parser/parser-header.cxx | 7 +-- 9 files changed, 39 insertions(+), 141 deletions(-) delete mode 100644 libxsde/xsde/cxx/parser/state.cxx 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 -// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC -// license : GNU GPL v2 + exceptions; see accompanying LICENSE file - -#include // memcpy - -#include - -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 // size_t +#include +#include #include 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 (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 // size_t +#include #include #include @@ -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 (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 " << endl + ctx.os << "#include " << endl + << "#include " << endl << "#include " << endl << "#include " << endl << endl; -- cgit v1.1