diff --git a/hawk/lib/Hawk.cpp b/hawk/lib/Hawk.cpp index 835eced1..02270503 100644 --- a/hawk/lib/Hawk.cpp +++ b/hawk/lib/Hawk.cpp @@ -25,12 +25,90 @@ */ #include +#include // for MmgrStd only. i don't like this being mutually dependent #include "hawk-prv.h" ///////////////////////////////// HAWK_BEGIN_NAMESPACE(HAWK) ///////////////////////////////// + +////////////////////////////////////////////////////////////////// +// Mmged +////////////////////////////////////////////////////////////////// + +Mmged::Mmged (Mmgr* mmgr) +{ + if (!mmgr) mmgr = Mmgr::getDFL(); + this->_mmgr = mmgr; +} + +void Mmged::setMmgr (Mmgr* mmgr) +{ + if (!mmgr) mmgr = Mmgr::getDFL(); + this->_mmgr = mmgr; +} + +////////////////////////////////////////////////////////////////// +// Mmgr +////////////////////////////////////////////////////////////////// + + +void* Mmgr::alloc_mem (mmgr_t* mmgr, hawk_oow_t n) HAWK_CPP_NOEXCEPT +{ + return ((Mmgr*)mmgr->ctx)->allocMem (n); +} + +void* Mmgr::realloc_mem (mmgr_t* mmgr, void* ptr, hawk_oow_t n) HAWK_CPP_NOEXCEPT +{ + return ((Mmgr*)mmgr->ctx)->reallocMem (ptr, n); +} + +void Mmgr::free_mem (mmgr_t* mmgr, void* ptr) HAWK_CPP_NOEXCEPT +{ + ((Mmgr*)mmgr->ctx)->freeMem (ptr); +} + +void* Mmgr::callocate (hawk_oow_t n, bool raise_exception) /*HAWK_CPP_THREXCEPT1(MemoryError)*/ +{ + void* ptr = this->allocate(n, raise_exception); + HAWK_MEMSET (ptr, 0, n); + return ptr; +} + +#if 0 +#if defined(__GNUC__) +static MmgrStd __attribute__((init_priority(101))) std_dfl_mmgr; //<- this solved the problem +#else +static MmgrStd std_dfl_mmgr; //<-- has an issue for undefined initialization order +#endif +Mmgr* Mmgr::dfl_mmgr = &std_dfl_mmgr; +//Mmgr* Mmgr::dfl_mmgr = MmgrStd::getInstance(); //<--- has an issue as well +Mmgr* Mmgr::getDFL () HAWK_CPP_NOEXCEPT +{ + return Mmgr::dfl_mmgr; +} +#else +// C++ initialization order across translation units are not defined. +// so it's tricky to work around this... the init_priority attribute +// can solve this problem. but it's compiler dependent. +// Mmgr::getDFL() resets dfl_mmgr to &std_dfl_mmgr if it's NULL. +Mmgr* Mmgr::dfl_mmgr = HAWK_NULL; + +Mmgr* Mmgr::getDFL () HAWK_CPP_NOEXCEPT +{ + static MmgrStd std_dfl_mmgr; + Mmgr* mmgr = Mmgr::dfl_mmgr; + return mmgr? mmgr: &std_dfl_mmgr; +} +#endif + +void Mmgr::setDFL (Mmgr* mmgr) HAWK_CPP_NOEXCEPT +{ + Mmgr::dfl_mmgr = mmgr; +} + + ////////////////////////////////////////////////////////////////// // Hawk::Source ////////////////////////////////////////////////////////////////// @@ -1326,14 +1404,14 @@ int Hawk::open () hawk_prm_t prm; HAWK_MEMSET (&prm, 0, HAWK_SIZEOF(prm)); - prm.math.pow = pow; - prm.math.mod = mod; - prm.modopen = modopen; - prm.modclose = modclose; - prm.modgetsym = modgetsym; + prm.math.pow = Hawk::pow; + prm.math.mod = Hawk::mod; + prm.modopen = Hawk::modopen; + prm.modclose = Hawk::modclose; + prm.modgetsym = Hawk::modgetsym; hawk_errnum_t errnum; - this->awk = hawk_open(this->getMmgr(), HAWK_SIZEOF(xtn_t), &prm, &errnum); + this->awk = hawk_open(this->getMmgr(), HAWK_SIZEOF(xtn_t), hawk_get_cmgr_by_id(HAWK_CMGR_UTF8), &prm, &errnum); if (!this->awk) { this->setError (errnum); @@ -1348,7 +1426,7 @@ int Hawk::open () xtn->ecb.close = fini_xtn; xtn->ecb.clear = clear_xtn; - dflerrstr = hawk_geterrstr (this->awk); + dflerrstr = hawk_geterrstr(this->awk); hawk_seterrstr (this->awk, xerrstr); #if defined(HAWK_USE_HTB_FOR_FUNCTION_MAP) @@ -2447,3 +2525,38 @@ void* Hawk::modgetsym (awk_t* awk, void* handle, const hawk_ooch_t* name) ///////////////////////////////// HAWK_END_NAMESPACE(HAWK) ///////////////////////////////// + + + +void* operator new (hawk_oow_t size, HAWK::Mmgr* mmgr) /*HAWK_CPP_THREXCEPT1(HAWK::Mmgr::MemoryError)*/ +{ + return mmgr->allocate (size); +} + +#if defined(HAWK_CPP_NO_OPERATOR_DELETE_OVERLOADING) +void hawk_operator_delete (void* ptr, HAWK::Mmgr* mmgr) +#else +void operator delete (void* ptr, HAWK::Mmgr* mmgr) +#endif +{ + mmgr->dispose (ptr); +} + +void* operator new (hawk_oow_t size, HAWK::Mmgr* mmgr, void* existing_ptr) /*HAWK_CPP_THREXCEPT1(HAWK::Mmgr::MemoryError)*/ +{ + // mmgr unused. i put it in the parameter list to make this function + // less conflicting with the stock ::operator new() that doesn't allocate. + return existing_ptr; +} + +#if 0 +void* operator new[] (hawk_oow_t size, HAWK::Mmgr* mmgr) +{ + return mmgr->allocate (size); +} + +void operator delete[] (void* ptr, HAWK::Mmgr* mmgr) +{ + mmgr->dispose (ptr); +} +#endif diff --git a/hawk/lib/Hawk.hpp b/hawk/lib/Hawk.hpp index 433e3f86..bc64c854 100644 --- a/hawk/lib/Hawk.hpp +++ b/hawk/lib/Hawk.hpp @@ -28,10 +28,10 @@ #define _HAWK_HAWK_HPP_ #include -#include #define HAWK_USE_HTB_FOR_FUNCTION_MAP 1 //#define HAWK_VALUE_USE_IN_CLASS_PLACEMENT_NEW 1 +//#define HAWK_NO_LOCATION_IN_EXCEPTION 1 // TOOD: redefine these NAMESPACE stuffs or move them somewhere else #define HAWK_BEGIN_NAMESPACE(x) namespace x { @@ -51,11 +51,329 @@ HAWK_BEGIN_NAMESPACE(HAWK) ///////////////////////////////// +#if (__cplusplus >= 201103L) || (defined(_MSC_VER) && _MSC_VER >= 1900) // C++11 or later + #define HAWK_LANG_CPP11 1 + #define HAWK_CPP_NOEXCEPT noexcept(true) + + /// The HAWK_CPP_ENABLE_CPP11_MOVE macro enables C++11 move semantics in various classes. + #define HAWK_CPP_ENABLE_CPP11_MOVE 1 + + // The HAWK_CPP_CALL_DESTRUCTOR() macro calls a destructor explicitly. + #define HAWK_CPP_CALL_DESTRUCTOR(ptr, class_name) ((ptr)->~class_name()) + + // The HAWK_CPP_CALL_PLACEMENT_DELETE1() macro calls the global operator delete + // with 1 extra argument given. + #define HAWK_CPP_CALL_PLACEMENT_DELETE1(ptr, arg1) (::operator delete((ptr), (arg1))) + +#elif (__cplusplus >= 199711L) // C++98 + #undef HAWK_LANG_CPP11 + #define HAWK_CPP_NOEXCEPT throw() + + #define HAWK_CPP_CALL_DESTRUCTOR(ptr, class_name) ((ptr)->~class_name()) + #define HAWK_CPP_CALL_PLACEMENT_DELETE1(ptr, arg1) (::operator delete((ptr), (arg1))) +#else + #undef HAWK_LANG_CPP11 + #define HAWK_CPP_NOEXCEPT + + #if defined(__BORLANDC__) + + // Explicit destructor call requires a class name depending on the + // C++ standard/compiler. + // + // Node* x; + // x->~Node (); + // + // While x->~Node() is ok with modern compilers, some old compilers + // like BCC55 required the class name in the call as shown below. + // + // x->Node::~Node (); + + #define HAWK_CPP_CALL_DESTRUCTOR(ptr, class_name) ((ptr)->class_name::~class_name()) + #define HAWK_CPP_CALL_PLACEMENT_DELETE1(ptr, arg1) (::operator delete((ptr), (arg1))) + + + #elif defined(__WATCOMC__) + // WATCOM has a problem with this syntax. + // Node* x; x->Node::~Node(). + // But it doesn't support operator delete overloading. + + #define HAWK_CPP_CALL_DESTRUCTOR(ptr, class_name) ((ptr)->~class_name()) + #define HAWK_CPP_CALL_PLACEMENT_DELETE1(ptr, arg1) (::hawk_operator_delete((ptr), (arg1))) + + // When the name of a member template specialization appears after . or + // -> in a postfix-expression, or after :: in a qualified-id that explic- + // itly depends on a template-argument (_temp.dep_), the member template + // name must be prefixed by the keyword template. Otherwise the name is + // assumed to name a non-template. [Example: + // class X { + // public: + // template X* alloc(); + // }; + // void f(X* p) + // { + // X* p1 = p->alloc<200>(); + // // ill-formed: < means less than + // X* p2 = p->template alloc<200>(); + // // fine: < starts explicit qualification + // } + // --end example] + // + // WATCOM doesn't support this qualifier. + + #define HAWK_CPP_NO_OPERATOR_DELETE_OVERLOADING 1 + #else + + #define HAWK_CPP_CALL_DESTRUCTOR(ptr, class_name) ((ptr)->~class_name()) + #define HAWK_CPP_CALL_PLACEMENT_DELETE1(ptr, arg1) (::operator delete((ptr), (arg1))) + + #endif + +#endif + +#if defined(HAWK_CPP_ENABLE_CPP11_MOVE) + + template struct HAWK_CPP_RMREF { typedef T Type; }; + template struct HAWK_CPP_RMREF { typedef T Type; }; + template struct HAWK_CPP_RMREF { typedef T Type; }; + + template inline + typename HAWK_CPP_RMREF::Type&& HAWK_CPP_RVREF(T&& v) + { + return (typename HAWK_CPP_RMREF::Type&&)v; + } +#else + + /* + template inline + T& HAWK_CPP_RVREF(T& v) { return (T&)v; } + + template inline + const T& HAWK_CPP_RVREF(const T& v) { return (const T&)v; } + */ + #define HAWK_CPP_RVREF(x) x +#endif + +/// The Exception class implements the exception object. +class HAWK_EXPORT Exception +{ +public: + Exception ( + const hawk_ooch_t* name, const hawk_ooch_t* msg, + const hawk_ooch_t* file, hawk_oow_t line) HAWK_CPP_NOEXCEPT: + name(name), msg(msg) +#if !defined(HAWK_NO_LOCATION_IN_EXCEPTION) + , file(file), line(line) +#endif + { + } + + const hawk_ooch_t* name; + const hawk_ooch_t* msg; +#if !defined(HAWK_NO_LOCATION_IN_EXCEPTION) + const hawk_ooch_t* file; + hawk_oow_t line; +#endif +}; + +#define HAWK_THROW(ex_name) \ + throw ex_name(HAWK_Q(ex_name),HAWK_Q(ex_name), HAWK_T(__FILE__), (hawk_oow_t)__LINE__) +#define HAWK_THROW_WITH_MSG(ex_name,msg) \ + throw ex_name(HAWK_Q(ex_name),msg, HAWK_T(__FILE__), (hawk_oow_t)__LINE__) + +#define HAWK_EXCEPTION(ex_name) \ + class ex_name: public HAWK::Exception \ + { \ + public: \ + ex_name (const hawk_ooch_t* name, const hawk_ooch_t* msg, \ + const hawk_ooch_t* file, hawk_oow_t line) HAWK_CPP_NOEXCEPT: \ + HAWK::Exception (name, msg, file, line) {} \ + } + +#define HAWK_EXCEPTION_NAME(exception_object) ((exception_object).name) +#define HAWK_EXCEPTION_MSG(exception_object) ((exception_object).msg) + +#if !defined(HAWK_NO_LOCATION_IN_EXCEPTION) +# define HAWK_EXCEPTION_FILE(exception_object) ((exception_object).file) +# define HAWK_EXCEPTION_LINE(exception_object) ((exception_object).line) +#else +# define HAWK_EXCEPTION_FILE(exception_object) (HAWK_T("")) +# define HAWK_EXCEPTION_LINE(exception_object) (0) +#endif + +class HAWK_EXPORT Uncopyable +{ +public: + Uncopyable () HAWK_CPP_NOEXCEPT {} + //virtual ~Uncopyable () {} + +private: + Uncopyable (const Uncopyable&); + const Uncopyable& operator= (const Uncopyable&); +}; + +/// +/// The Mmgr class defines a memory manager interface that can be inherited +/// by a class in need of a memory manager as defined in the primitive +/// #hawk_mmgr_t type. Using the class over the primitive type enables you to +/// write code in more object-oriented fashion. An inheriting class should +/// implement three pure virtual functions. +/// +/// You are free to call allocMem(), reallocMem(), and freeMem() in C++ context +/// where no exception raising is desired. If you want an exception to be +/// raised upon memory allocation errors, you can call allocate(), reallocate(), +/// dispose() instead. +/// +/// +class HAWK_EXPORT Mmgr: public hawk_mmgr_t +{ +public: + /// defines an alias type to #hawk_mmgr_t + typedef hawk_mmgr_t mmgr_t; + + HAWK_EXCEPTION (MemoryError); + +public: + /// + /// The Mmgr() function builds a memory manager composed of bridge + /// functions connecting itself with it. + /// + Mmgr () HAWK_CPP_NOEXCEPT + { + // NOTE: + // the #hawk_mmgr_t interface is not affected by raise_exception + // because direct calls to the virtual functions that don't raise + // exceptions are made via bridge functions below. + this->alloc = alloc_mem; + this->realloc = realloc_mem; + this->free = free_mem; + this->ctx = this; + } + + /// + /// The ~Mmgr() function finalizes a memory manager. + /// + virtual ~Mmgr () HAWK_CPP_NOEXCEPT {} + + /// + /// The allocate() function calls allocMem() for memory + /// allocation. if it fails, it raise an exception if it's + /// configured to do so. + /// + void* allocate (hawk_oow_t n, bool raise_exception = true) + { + void* xptr = this->allocMem (n); + if (!xptr && raise_exception) HAWK_THROW (MemoryError); + return xptr; + } + + /// + /// The callocate() function allocates memory like allocate() and + /// clears the memory before returning. + /// + void* callocate (hawk_oow_t n, bool raise_exception = true); + + /// + /// The reallocate() function calls reallocMem() for memory + /// reallocation. if it fails, it raise an exception if it's + /// configured to do so. + /// + void* reallocate (void* ptr, hawk_oow_t n, bool raise_exception = true) + { + void* xptr = this->reallocMem (ptr, n); + if (!xptr && raise_exception) HAWK_THROW (MemoryError); + return xptr; + } + + /// + /// The dispose() function calls freeMem() for memory disposal. + /// + void dispose (void* ptr) HAWK_CPP_NOEXCEPT + { + this->freeMem (ptr); + } + +//protected: + /// + /// The allocMem() function allocates a chunk of memory of the + /// size \a n and return the pointer to the beginning of the chunk. + /// If it fails to allocate memory, it should return #HAWK_NULL. + /// + virtual void* allocMem ( + hawk_oow_t n ///< size of memory chunk to allocate in bytes + ) HAWK_CPP_NOEXCEPT = 0; + + /// + /// The reallocMem() function resizes a chunk of memory previously + /// allocated with the allocMem() function. When resized, the contents + /// of the surviving part of a memory chunk is preserved. If it fails to + /// resize memory, it should return HAWK_NULL. + /// + virtual void* reallocMem ( + void* ptr, ///< pointer to memory chunk to resize + hawk_oow_t n ///< new size in bytes + ) HAWK_CPP_NOEXCEPT = 0; + + /// + /// The freeMem() function frees a chunk of memory allocated with + /// the allocMem() function or resized with the reallocMem() function. + /// + virtual void freeMem ( + void* ptr ///< pointer to memory chunk to free + ) HAWK_CPP_NOEXCEPT = 0; + +protected: + /// + /// bridge function from the #hawk_mmgr_t type the allocMem() function. + /// + static void* alloc_mem (mmgr_t* mmgr, hawk_oow_t n) HAWK_CPP_NOEXCEPT; + + /// + /// bridge function from the #hawk_mmgr_t type the reallocMem() function. + /// + static void* realloc_mem (mmgr_t* mmgr, void* ptr, hawk_oow_t n) HAWK_CPP_NOEXCEPT; + + /// + /// bridge function from the #hawk_mmgr_t type the freeMem() function. + /// + static void free_mem (mmgr_t* mmgr, void* ptr) HAWK_CPP_NOEXCEPT; + +public: + static Mmgr* getDFL () HAWK_CPP_NOEXCEPT; + static void setDFL (Mmgr* mmgr) HAWK_CPP_NOEXCEPT; + +protected: + static Mmgr* dfl_mmgr; +}; + + +class HAWK_EXPORT Mmged +{ +public: + Mmged (Mmgr* mmgr = HAWK_NULL); + + /// + /// The getMmgr() function returns the memory manager associated. + /// + Mmgr* getMmgr () const { return this->_mmgr; } + +protected: + /// + /// The setMmgr() function changes the memory manager. + /// Changing memory manager requires extra care to be taken + /// especially when you have some data allocated with the previous + /// manager. for this reason, i put this as a protected function. + /// + void setMmgr(Mmgr* mmgr); + +private: + Mmgr* _mmgr; +}; + /// /// The Hawk class implements an AWK interpreter by wrapping around /// #hawk_t and #hawk_rtx_t. /// -class HAWK_EXPORT Hawk: public Uncopyable, public Types, public Mmged +class HAWK_EXPORT Hawk: public Uncopyable, public Mmged { public: @@ -1363,12 +1681,12 @@ protected: static int functionHandler (rtx_t* rtx, const fnc_info_t* fi); - static flt_t pow (awk_t* awk, flt_t x, flt_t y); - static flt_t mod (awk_t* awk, flt_t x, flt_t y); + static flt_t pow (awk_t* awk, flt_t x, flt_t y); + static flt_t mod (awk_t* awk, flt_t x, flt_t y); - static void* modopen (awk_t* awk, const mod_spec_t* spec); + static void* modopen (awk_t* awk, const mod_spec_t* spec); static void modclose (awk_t* awk, void* handle); - static void* modsym (awk_t* awk, void* handle, const hawk_ooch_t* name); + static void* modgetsym (awk_t* awk, void* handle, const hawk_ooch_t* name); public: // use this with care @@ -1431,4 +1749,33 @@ private: HAWK_END_NAMESPACE(HAWK) ///////////////////////////////// + +HAWK_EXPORT void* operator new (hawk_oow_t size, HAWK::Mmgr* mmgr); + +#if defined(HAWK_CPP_NO_OPERATOR_DELETE_OVERLOADING) +HAWK_EXPORT void hawk_operator_delete (void* ptr, HAWK::Mmgr* mmgr); +#else +HAWK_EXPORT void operator delete (void* ptr, HAWK::Mmgr* mmgr); +#endif + +HAWK_EXPORT void* operator new (hawk_oow_t size, HAWK::Mmgr* mmgr, void* existing_ptr); + +#if 0 +// i found no way to delete an array allocated with +// the placement new operator. if the array element is an instance +// of a class, the pointer returned by the new operator call +// may not be the actual pointer allocated. some compilers +// seem to put some information about the array at the +// beginning of the allocated memory and return the pointer +// off a few bytes from the beginning. +void* operator new[] (hawk_oow_t size, HAWK::Mmgr* mmgr); +void operator delete[] (void* ptr, HAWK::Mmgr* mmgr); +#endif + +#define HAWK_CPP_DELETE_WITH_MMGR(ptr, class_name, mmgr) \ + do { \ + HAWK_CPP_CALL_DESTRUCTOR (ptr, class_name); \ + HAWK_CPP_CALL_PLACEMENT_DELETE1(ptr, mmgr); \ + } while(0); + #endif diff --git a/hawk/lib/StdHawk.cpp b/hawk/lib/HawkStd.cpp similarity index 88% rename from hawk/lib/StdHawk.cpp rename to hawk/lib/HawkStd.cpp index 7df7c1b5..fe1d3163 100644 --- a/hawk/lib/StdHawk.cpp +++ b/hawk/lib/HawkStd.cpp @@ -24,7 +24,7 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include +#include #include "hawk-prv.h" #include @@ -45,14 +45,35 @@ # error UNSUPPORTED DYNAMIC LINKER #endif - ///////////////////////////////// HAWK_BEGIN_NAMESPACE(HAWK) ///////////////////////////////// -StdHawk::ioattr_t StdHawk::default_ioattr; +////////////////////////////////////////////////////////////////////////////// +// MmgrStd +////////////////////////////////////////////////////////////////////////////// +void* MmgrStd::allocMem (hawk_oow_t n) HAWK_CPP_NOEXCEPT +{ + return ::malloc(n); +} -static hawk_sio_t* open_sio (Hawk* awk, StdHawk::Run* run, const hawk_ooch_t* file, int flags) +void* MmgrStd::reallocMem (void* ptr, hawk_oow_t n) HAWK_CPP_NOEXCEPT +{ + return ::realloc(ptr, n); +} + +void MmgrStd::freeMem (void* ptr) HAWK_CPP_NOEXCEPT +{ + ::free (ptr); +} + +////////////////////////////////////////////////////////////////////////////// +// HawkStd +////////////////////////////////////////////////////////////////////////////// + +HawkStd::ioattr_t HawkStd::default_ioattr; + +static hawk_sio_t* open_sio (Hawk* awk, HawkStd::Run* run, const hawk_ooch_t* file, int flags) { hawk_sio_t* sio; @@ -69,7 +90,7 @@ static hawk_sio_t* open_sio (Hawk* awk, StdHawk::Run* run, const hawk_ooch_t* fi return sio; } -static hawk_sio_t* open_sio_std (Hawk* awk, StdHawk::Run* run, hawk_sio_std_t std, int flags) +static hawk_sio_t* open_sio_std (Hawk* awk, HawkStd::Run* run, hawk_sio_std_t std, int flags) { hawk_sio_t* sio; static const hawk_ooch_t* std_names[] = @@ -92,7 +113,7 @@ static hawk_sio_t* open_sio_std (Hawk* awk, StdHawk::Run* run, hawk_sio_std_t st return sio; } -int StdHawk::open () +int HawkStd::open () { int n = Hawk::open (); if (n == -1) return n; @@ -110,8 +131,8 @@ int StdHawk::open () if (addFunction (HAWK_T("rand"), 1, 0, HAWK_T("math"), HAWK_NULL, 0) <= -1 || addFunction (HAWK_T("srand"), 1, 0, HAWK_T("math"), HAWK_NULL, 0) <= -1 || addFunction (HAWK_T("system"), 1, 0, HAWK_T("sys"), HAWK_NULL, 0) <= -1 || - addFunction (HAWK_T("setioattr"), 3, 3, HAWK_NULL, (FunctionHandler)&StdHawk::setioattr, HAWK_RIO) <= -1 || - addFunction (HAWK_T("getioattr"), 3, 3, HAWK_T("vvr"), (FunctionHandler)&StdHawk::getioattr, HAWK_RIO) <= -1) + addFunction (HAWK_T("setioattr"), 3, 3, HAWK_NULL, (FunctionHandler)&HawkStd::setioattr, HAWK_RIO) <= -1 || + addFunction (HAWK_T("getioattr"), 3, 3, HAWK_T("vvr"), (FunctionHandler)&HawkStd::getioattr, HAWK_RIO) <= -1) { goto oops; } @@ -134,7 +155,7 @@ oops: return -1; } -void StdHawk::close () +void HawkStd::close () { if (this->cmgrtab_inited) { @@ -145,14 +166,14 @@ void StdHawk::close () clearConsoleOutputs (); // - // StdHawk called hawk_stdmodstartup() after Hawk::open(). + // HawkStd called hawk_stdmodstartup() after Hawk::open(). // It's logical to call hawk_stdmodshutdown() Hawk::close(). // but Hawk::close() still needs to call some module's fini and - // unload functions. So it must be done in StdHawk::uponClosing() + // unload functions. So it must be done in HawkStd::uponClosing() // which is called after modules have been unloaded but while // the underlying awk object is still alive. // - // See StdHawk::uponClosing() below. + // See HawkStd::uponClosing() below. // //if (this->stdmod_up) //{ @@ -164,7 +185,7 @@ void StdHawk::close () Hawk::close (); } -void StdHawk::uponClosing () +void HawkStd::uponClosing () { if (this->stdmod_up) { @@ -176,7 +197,7 @@ void StdHawk::uponClosing () Hawk::uponClosing (); } -StdHawk::Run* StdHawk::parse (Source& in, Source& out) +HawkStd::Run* HawkStd::parse (Source& in, Source& out) { Run* run = Hawk::parse(in, out); @@ -207,7 +228,7 @@ StdHawk::Run* StdHawk::parse (Source& in, Source& out) return run; } -int StdHawk::build_argcv (Run* run) +int HawkStd::build_argcv (Run* run) { Value argv (run); @@ -224,7 +245,7 @@ int StdHawk::build_argcv (Run* run) return 0; } -int StdHawk::__build_environ (Run* run, void* envptr) +int HawkStd::__build_environ (Run* run, void* envptr) { hawk_env_hawk_ooch_t** envarr = (hawk_env_hawk_ooch_t**)envptr; Value v_env (run); @@ -307,7 +328,7 @@ int StdHawk::__build_environ (Run* run, void* envptr) return run->setGlobal (this->gbl_environ, v_env); } -int StdHawk::build_environ (Run* run) +int HawkStd::build_environ (Run* run) { hawk_env_t env; int xret; @@ -324,7 +345,7 @@ int StdHawk::build_environ (Run* run) return xret; } -int StdHawk::make_additional_globals (Run* run) +int HawkStd::make_additional_globals (Run* run) { if (build_argcv (run) <= -1 || build_environ (run) <= -1) return -1; @@ -332,7 +353,7 @@ int StdHawk::make_additional_globals (Run* run) return 0; } -hawk_cmgr_t* StdHawk::getiocmgr (const hawk_ooch_t* ioname) +hawk_cmgr_t* HawkStd::getiocmgr (const hawk_ooch_t* ioname) { HAWK_ASSERT (this->cmgrtab_inited == true); @@ -343,7 +364,7 @@ hawk_cmgr_t* StdHawk::getiocmgr (const hawk_ooch_t* ioname) return HAWK_NULL; } -StdHawk::ioattr_t* StdHawk::get_ioattr (const hawk_ooch_t* ptr, hawk_oow_t len) +HawkStd::ioattr_t* HawkStd::get_ioattr (const hawk_ooch_t* ptr, hawk_oow_t len) { hawk_htb_pair_t* pair; @@ -353,7 +374,7 @@ StdHawk::ioattr_t* StdHawk::get_ioattr (const hawk_ooch_t* ptr, hawk_oow_t len) return (ioattr_t*)HAWK_HTB_VPTR(pair); } -StdHawk::ioattr_t* StdHawk::find_or_make_ioattr (const hawk_ooch_t* ptr, hawk_oow_t len) +HawkStd::ioattr_t* HawkStd::find_or_make_ioattr (const hawk_ooch_t* ptr, hawk_oow_t len) { hawk_htb_pair_t* pair; @@ -362,8 +383,8 @@ StdHawk::ioattr_t* StdHawk::find_or_make_ioattr (const hawk_ooch_t* ptr, hawk_oo { pair = hawk_htb_insert ( &this->cmgrtab, (void*)ptr, len, - (void*)&StdHawk::default_ioattr, - HAWK_SIZEOF(StdHawk::default_ioattr)); + (void*)&HawkStd::default_ioattr, + HAWK_SIZEOF(HawkStd::default_ioattr)); if (pair == HAWK_NULL) { this->setError (HAWK_ENOMEM); @@ -383,7 +404,7 @@ static int timeout_code (const hawk_ooch_t* name) return -1; } -int StdHawk::setioattr ( +int HawkStd::setioattr ( Run& run, Value& ret, Value* args, hawk_oow_t nargs, const hawk_ooch_t* name, hawk_oow_t len) { @@ -458,7 +479,7 @@ int StdHawk::setioattr ( } } -int StdHawk::getioattr ( +int HawkStd::getioattr ( Run& run, Value& ret, Value* args, hawk_oow_t nargs, const hawk_ooch_t* name, hawk_oow_t len) { @@ -476,7 +497,7 @@ int StdHawk::getioattr ( hawk_strxchr (ptr[1], l[1], HAWK_T('\0')) == HAWK_NULL) { ioattr_t* ioattr = get_ioattr (ptr[0], l[0]); - if (ioattr == HAWK_NULL) ioattr = &StdHawk::default_ioattr; + if (ioattr == HAWK_NULL) ioattr = &HawkStd::default_ioattr; int tmout; if ((tmout = timeout_code(ptr[1])) >= 0) @@ -499,7 +520,7 @@ int StdHawk::getioattr ( return ret.setInt ((int_t)xx); } -int StdHawk::open_nwio (Pipe& io, int flags, void* nwad) +int HawkStd::open_nwio (Pipe& io, int flags, void* nwad) { hawk_nwio_tmout_t tmout_buf; hawk_nwio_tmout_t* tmout = HAWK_NULL; @@ -534,7 +555,7 @@ int StdHawk::open_nwio (Pipe& io, int flags, void* nwad) return 1; } -int StdHawk::open_pio (Pipe& io) +int HawkStd::open_pio (Pipe& io) { Hawk::Pipe::Mode mode = io.getMode(); hawk_pio_t* pio = HAWK_NULL; @@ -611,7 +632,7 @@ static int parse_rwpipe_uri (const hawk_ooch_t* uri, int* flags, hawk_nwad_t* nw return -1; } -int StdHawk::openPipe (Pipe& io) +int HawkStd::openPipe (Pipe& io) { int flags; hawk_nwad_t nwad; @@ -627,7 +648,7 @@ int StdHawk::openPipe (Pipe& io) } } -int StdHawk::closePipe (Pipe& io) +int HawkStd::closePipe (Pipe& io) { if (io.getUflags() > 0) { @@ -657,35 +678,35 @@ int StdHawk::closePipe (Pipe& io) return 0; } -hawk_ooi_t StdHawk::readPipe (Pipe& io, hawk_ooch_t* buf, hawk_oow_t len) +hawk_ooi_t HawkStd::readPipe (Pipe& io, hawk_ooch_t* buf, hawk_oow_t len) { return (io.getUflags() > 0)? hawk_nwio_read ((hawk_nwio_t*)io.getHandle(), buf, len): hawk_pio_read ((hawk_pio_t*)io.getHandle(), HAWK_PIO_OUT, buf, len); } -hawk_ooi_t StdHawk::writePipe (Pipe& io, const hawk_ooch_t* buf, hawk_oow_t len) +hawk_ooi_t HawkStd::writePipe (Pipe& io, const hawk_ooch_t* buf, hawk_oow_t len) { return (io.getUflags() > 0)? hawk_nwio_write((hawk_nwio_t*)io.getHandle(), buf, len): hawk_pio_write((hawk_pio_t*)io.getHandle(), HAWK_PIO_IN, buf, len); } -hawk_ooi_t StdHawk::writePipeBytes (Pipe& io, const hawk_bch_t* buf, hawk_oow_t len) +hawk_ooi_t HawkStd::writePipeBytes (Pipe& io, const hawk_bch_t* buf, hawk_oow_t len) { return (io.getUflags() > 0)? hawk_nwio_writebytes((hawk_nwio_t*)io.getHandle(), buf, len): hawk_pio_writebytes((hawk_pio_t*)io.getHandle(), HAWK_PIO_IN, buf, len); } -int StdHawk::flushPipe (Pipe& io) +int HawkStd::flushPipe (Pipe& io) { return (io.getUflags() > 0)? hawk_nwio_flush ((hawk_nwio_t*)io.getHandle()): hawk_pio_flush ((hawk_pio_t*)io.getHandle(), HAWK_PIO_IN); } -int StdHawk::openFile (File& io) +int HawkStd::openFile (File& io) { Hawk::File::Mode mode = io.getMode(); hawk_sio_t* sio = HAWK_NULL; @@ -718,44 +739,44 @@ int StdHawk::openFile (File& io) return 1; } -int StdHawk::closeFile (File& io) +int HawkStd::closeFile (File& io) { hawk_sio_close ((hawk_sio_t*)io.getHandle()); return 0; } -hawk_ooi_t StdHawk::readFile (File& io, hawk_ooch_t* buf, hawk_oow_t len) +hawk_ooi_t HawkStd::readFile (File& io, hawk_ooch_t* buf, hawk_oow_t len) { return hawk_sio_getoochars((hawk_sio_t*)io.getHandle(), buf, len); } -hawk_ooi_t StdHawk::writeFile (File& io, const hawk_ooch_t* buf, hawk_oow_t len) +hawk_ooi_t HawkStd::writeFile (File& io, const hawk_ooch_t* buf, hawk_oow_t len) { return hawk_sio_putoochars((hawk_sio_t*)io.getHandle(), buf, len); } -hawk_ooi_t StdHawk::writeFileBytes (File& io, const hawk_bch_t* buf, hawk_oow_t len) +hawk_ooi_t HawkStd::writeFileBytes (File& io, const hawk_bch_t* buf, hawk_oow_t len) { return hawk_sio_putbchars((hawk_sio_t*)io.getHandle(), buf, len); } -int StdHawk::flushFile (File& io) +int HawkStd::flushFile (File& io) { return hawk_sio_flush((hawk_sio_t*)io.getHandle()); } -void StdHawk::setConsoleCmgr (const hawk_cmgr_t* cmgr) +void HawkStd::setConsoleCmgr (const hawk_cmgr_t* cmgr) { this->console_cmgr = (hawk_cmgr_t*)cmgr; } -const hawk_cmgr_t* StdHawk::getConsoleCmgr () const +const hawk_cmgr_t* HawkStd::getConsoleCmgr () const { return this->console_cmgr; } -int StdHawk::addConsoleOutput (const hawk_ooch_t* arg, hawk_oow_t len) +int HawkStd::addConsoleOutput (const hawk_ooch_t* arg, hawk_oow_t len) { HAWK_ASSERT (awk != HAWK_NULL); int n = this->ofile.add (awk, arg, len); @@ -763,17 +784,17 @@ int StdHawk::addConsoleOutput (const hawk_ooch_t* arg, hawk_oow_t len) return n; } -int StdHawk::addConsoleOutput (const hawk_ooch_t* arg) +int HawkStd::addConsoleOutput (const hawk_ooch_t* arg) { return addConsoleOutput (arg, hawk_count_oocstr(arg)); } -void StdHawk::clearConsoleOutputs () +void HawkStd::clearConsoleOutputs () { this->ofile.clear (awk); } -int StdHawk::open_console_in (Console& io) +int HawkStd::open_console_in (Console& io) { hawk_rtx_t* rtx = (rtx_t*)io; @@ -932,7 +953,7 @@ int StdHawk::open_console_in (Console& io) } -int StdHawk::open_console_out (Console& io) +int HawkStd::open_console_out (Console& io) { hawk_rtx_t* rtx = (rtx_t*)io; @@ -1005,7 +1026,7 @@ int StdHawk::open_console_out (Console& io) } } -int StdHawk::openConsole (Console& io) +int HawkStd::openConsole (Console& io) { Console::Mode mode = io.getMode(); @@ -1030,13 +1051,13 @@ int StdHawk::openConsole (Console& io) } } -int StdHawk::closeConsole (Console& io) +int HawkStd::closeConsole (Console& io) { hawk_sio_close ((hawk_sio_t*)io.getHandle()); return 0; } -hawk_ooi_t StdHawk::readConsole (Console& io, hawk_ooch_t* data, hawk_oow_t size) +hawk_ooi_t HawkStd::readConsole (Console& io, hawk_ooch_t* data, hawk_oow_t size) { hawk_ooi_t nn; @@ -1060,22 +1081,22 @@ hawk_ooi_t StdHawk::readConsole (Console& io, hawk_ooch_t* data, hawk_oow_t size return nn; } -hawk_ooi_t StdHawk::writeConsole (Console& io, const hawk_ooch_t* data, hawk_oow_t size) +hawk_ooi_t HawkStd::writeConsole (Console& io, const hawk_ooch_t* data, hawk_oow_t size) { return hawk_sio_putoochars((hawk_sio_t*)io.getHandle(), data, size); } -hawk_ooi_t StdHawk::writeConsoleBytes (Console& io, const hawk_bch_t* data, hawk_oow_t size) +hawk_ooi_t HawkStd::writeConsoleBytes (Console& io, const hawk_bch_t* data, hawk_oow_t size) { return hawk_sio_putbchars((hawk_sio_t*)io.getHandle(), data, size); } -int StdHawk::flushConsole (Console& io) +int HawkStd::flushConsole (Console& io) { return hawk_sio_flush ((hawk_sio_t*)io.getHandle()); } -int StdHawk::nextConsole (Console& io) +int HawkStd::nextConsole (Console& io) { int n; hawk_sio_t* sio = (hawk_sio_t*)io.getHandle(); @@ -1095,34 +1116,34 @@ int StdHawk::nextConsole (Console& io) } // memory allocation primitives -void* StdHawk::allocMem (hawk_oow_t n) +void* HawkStd::allocMem (hawk_oow_t n) { return ::malloc (n); } -void* StdHawk::reallocMem (void* ptr, hawk_oow_t n) +void* HawkStd::reallocMem (void* ptr, hawk_oow_t n) { return ::realloc (ptr, n); } -void StdHawk::freeMem (void* ptr) +void HawkStd::freeMem (void* ptr) { ::free (ptr); } // miscellaneous primitive -StdHawk::flt_t StdHawk::pow (flt_t x, flt_t y) +HawkStd::flt_t HawkStd::pow (flt_t x, flt_t y) { return hawk_stdmathpow (this->awk, x, y); } -StdHawk::flt_t StdHawk::mod (flt_t x, flt_t y) +HawkStd::flt_t HawkStd::mod (flt_t x, flt_t y) { return hawk_stdmathmod (this->awk, x, y); } -void* StdHawk::modopen (const mod_spec_t* spec) +void* HawkStd::modopen (const mod_spec_t* spec) { void* h; h = hawk_stdmodopen (this->awk, spec); @@ -1130,12 +1151,12 @@ void* StdHawk::modopen (const mod_spec_t* spec) return h; } -void StdHawk::modclose (void* handle) +void HawkStd::modclose (void* handle) { hawk_stdmodclose (this->awk, handle); } -void* StdHawk::modgetsym (void* handle, const hawk_ooch_t* name) +void* HawkStd::modgetsym (void* handle, const hawk_ooch_t* name) { void* s; s = hawk_stdmodgetsym (this->awk, handle, name); @@ -1143,7 +1164,7 @@ void* StdHawk::modgetsym (void* handle, const hawk_ooch_t* name) return s; } -int StdHawk::SourceFile::open (Data& io) +int HawkStd::SourceFile::open (Data& io) { hawk_sio_t* sio; @@ -1242,7 +1263,7 @@ int StdHawk::SourceFile::open (Data& io) return 1; } -int StdHawk::SourceFile::close (Data& io) +int HawkStd::SourceFile::close (Data& io) { hawk_sio_t* sio = (hawk_sio_t*)io.getHandle(); hawk_sio_flush (sio); @@ -1250,17 +1271,17 @@ int StdHawk::SourceFile::close (Data& io) return 0; } -hawk_ooi_t StdHawk::SourceFile::read (Data& io, hawk_ooch_t* buf, hawk_oow_t len) +hawk_ooi_t HawkStd::SourceFile::read (Data& io, hawk_ooch_t* buf, hawk_oow_t len) { return hawk_sio_getoochars ((hawk_sio_t*)io.getHandle(), buf, len); } -hawk_ooi_t StdHawk::SourceFile::write (Data& io, const hawk_ooch_t* buf, hawk_oow_t len) +hawk_ooi_t HawkStd::SourceFile::write (Data& io, const hawk_ooch_t* buf, hawk_oow_t len) { return hawk_sio_putoochars ((hawk_sio_t*)io.getHandle(), buf, len); } -int StdHawk::SourceString::open (Data& io) +int HawkStd::SourceString::open (Data& io) { hawk_sio_t* sio; @@ -1336,13 +1357,13 @@ int StdHawk::SourceString::open (Data& io) return 1; } -int StdHawk::SourceString::close (Data& io) +int HawkStd::SourceString::close (Data& io) { if (!io.isMaster()) hawk_sio_close ((hawk_sio_t*)io.getHandle()); return 0; } -hawk_ooi_t StdHawk::SourceString::read (Data& io, hawk_ooch_t* buf, hawk_oow_t len) +hawk_ooi_t HawkStd::SourceString::read (Data& io, hawk_ooch_t* buf, hawk_oow_t len) { if (io.isMaster()) { @@ -1356,7 +1377,7 @@ hawk_ooi_t StdHawk::SourceString::read (Data& io, hawk_ooch_t* buf, hawk_oow_t l } } -hawk_ooi_t StdHawk::SourceString::write (Data& io, const hawk_ooch_t* buf, hawk_oow_t len) +hawk_ooi_t HawkStd::SourceString::write (Data& io, const hawk_ooch_t* buf, hawk_oow_t len) { if (io.isMaster()) { diff --git a/hawk/lib/StdHawk.hpp b/hawk/lib/HawkStd.hpp similarity index 91% rename from hawk/lib/StdHawk.hpp rename to hawk/lib/HawkStd.hpp index d027d51c..ef21eb72 100644 --- a/hawk/lib/StdHawk.hpp +++ b/hawk/lib/HawkStd.hpp @@ -24,11 +24,10 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef _HAWK_STDAWK_HPP_ -#define _HAWK_STDAWK_HPP_ +#ifndef _HAWK_HAWK_STD_HPP_ +#define _HAWK_HAWK_STD_HPP_ #include -#include /// \file /// Standard AWK Interpreter @@ -37,12 +36,27 @@ HAWK_BEGIN_NAMESPACE(HAWK) //////////////////////////////// +class HAWK_EXPORT MmgrStd: public Mmgr +{ +public: + MmgrStd () HAWK_CPP_NOEXCEPT: Mmgr () {} + + void* allocMem (hawk_oow_t n) HAWK_CPP_NOEXCEPT; + void* reallocMem (void* ptr, hawk_oow_t n) HAWK_CPP_NOEXCEPT; + void freeMem (void* ptr) HAWK_CPP_NOEXCEPT; + +#if 0 + /// The getInstance() function returns the stock instance of the MmgrStd class. + static MmgrStd* getInstance () HAWK_CPP_NOEXCEPT; +#endif +}; + /// -/// The StdHawk class provides an easier-to-use interface by overriding +/// The HawkStd class provides an easier-to-use interface by overriding /// primitive methods, and implementing the file handler, the pipe handler, /// and common intrinsic functions. /// -class HAWK_EXPORT StdHawk: public Hawk +class HAWK_EXPORT HawkStd: public Hawk { public: /// @@ -87,7 +101,7 @@ public: const hawk_ooch_t* ptr; }; - StdHawk (Mmgr* mmgr = HAWK_NULL): Hawk(mmgr), stdmod_up(false), console_cmgr(HAWK_NULL) + HawkStd (Mmgr* mmgr = HAWK_NULL): Hawk(mmgr), stdmod_up(false), console_cmgr(HAWK_NULL) { } diff --git a/hawk/lib/Makefile.am b/hawk/lib/Makefile.am index 670f7518..0650a22a 100644 --- a/hawk/lib/Makefile.am +++ b/hawk/lib/Makefile.am @@ -158,8 +158,9 @@ libhawk_la_LIBADD += $(UNWIND_LIBS) endif if ENABLE_CXX +pkginclude_HEADERS += Hawk.hpp HawkStd.hpp pkglib_LTLIBRARIES += libhawkxx.la -libhawkxx_la_SOURCES = Hawk.cpp StdHawk.cpp +libhawkxx_la_SOURCES = Hawk.cpp HawkStd.cpp libhawkxx_la_CPPFLAGS = $(CPPFLAGS_LIB_COMMON) libhawkxx_la_LDFLAGS = $(LDFLAGS_LIB_COMMON) libhawkxx_la_LIBADD = -lhawk $(LIBADD_LIB_COMMON) diff --git a/hawk/lib/Makefile.in b/hawk/lib/Makefile.in index 34ede9d5..ba5a9620 100644 --- a/hawk/lib/Makefile.in +++ b/hawk/lib/Makefile.in @@ -93,26 +93,27 @@ host_triplet = @host@ @ENABLE_LIBLTDL_TRUE@am__append_4 = $(LTDL_LIBS) @ENABLE_LIBLTDL_FALSE@am__append_5 = $(DL_LIBS) @ENABLE_LIBUNWIND_TRUE@am__append_6 = $(UNWIND_LIBS) -@ENABLE_CXX_TRUE@am__append_7 = libhawkxx.la +@ENABLE_CXX_TRUE@am__append_7 = Hawk.hpp HawkStd.hpp +@ENABLE_CXX_TRUE@am__append_8 = libhawkxx.la ################################################## # STATIC MODULES BUILT INTO MAIN LIBRARY ################################################## -@ENABLE_STATIC_MODULE_TRUE@am__append_8 = \ +@ENABLE_STATIC_MODULE_TRUE@am__append_9 = \ @ENABLE_STATIC_MODULE_TRUE@ imap-imp.h \ @ENABLE_STATIC_MODULE_TRUE@ mod-math.c mod-math.h \ @ENABLE_STATIC_MODULE_TRUE@ mod-str.c mod-str.h \ @ENABLE_STATIC_MODULE_TRUE@ mod-sys.c mod-sys.h -@ENABLE_STATIC_MODULE_TRUE@am__append_9 = -@ENABLE_MOD_MYSQL_TRUE@@ENABLE_STATIC_MODULE_TRUE@am__append_10 = -lhawk-mysql -@ENABLE_MOD_MYSQL_TRUE@@ENABLE_STATIC_MODULE_TRUE@am__append_11 = ../mod/libhawk-mysql.la -@ENABLE_MOD_UCI_TRUE@@ENABLE_STATIC_MODULE_TRUE@am__append_12 = -lhawk-uci -@ENABLE_MOD_UCI_TRUE@@ENABLE_STATIC_MODULE_TRUE@am__append_13 = ../mod/libhawk-uci.la +@ENABLE_STATIC_MODULE_TRUE@am__append_10 = +@ENABLE_MOD_MYSQL_TRUE@@ENABLE_STATIC_MODULE_TRUE@am__append_11 = -lhawk-mysql +@ENABLE_MOD_MYSQL_TRUE@@ENABLE_STATIC_MODULE_TRUE@am__append_12 = ../mod/libhawk-mysql.la +@ENABLE_MOD_UCI_TRUE@@ENABLE_STATIC_MODULE_TRUE@am__append_13 = -lhawk-uci +@ENABLE_MOD_UCI_TRUE@@ENABLE_STATIC_MODULE_TRUE@am__append_14 = ../mod/libhawk-uci.la #pkglibdir = $(libdir) #pkglib_LTLIBRARIES = -@ENABLE_STATIC_MODULE_FALSE@am__append_14 = libhawk-math.la \ +@ENABLE_STATIC_MODULE_FALSE@am__append_15 = libhawk-math.la \ @ENABLE_STATIC_MODULE_FALSE@ libhawk-str.la libhawk-sys.la subdir = lib ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 @@ -126,7 +127,7 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_sign.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) -DIST_COMMON = $(srcdir)/Makefile.am $(pkginclude_HEADERS) \ +DIST_COMMON = $(srcdir)/Makefile.am $(am__pkginclude_HEADERS_DIST) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = hawk-cfg.h @@ -204,24 +205,25 @@ am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) am__libhawk_la_SOURCES_DIST = hawk.h hawk-chr.h hawk-cmn.h hawk-dir.h \ hawk-ecs.h hawk-fmt.h hawk-gem.h hawk-htb.h hawk-rbt.h \ hawk-pack1.h hawk-utl.h hawk-std.h hawk-tre.h hawk-unpack.h \ - arr.c chr.c dir.c ecs-imp.h ecs.c err-prv.h err.c err-sys.c \ - fmt-imp.h fmt.c fnc-prv.h fnc.c htb.c gem.c gem-skad.c \ - gem-nwif.c gem-nwif2.c hawk-prv.h hawk.c mb8.c misc-prv.h \ - misc.c parse-prv.h parse.c rbt.c rec.c rio-prv.h rio.c \ - run-prv.h run.c tre-prv.h tre-ast.c tre-ast.h tre-compile.c \ - tre-compile.h tre-match-bt.c tre-match-pa.c tre-match-ut.h \ - tre-mem.c tre-mem.h tre-parse.c tre-parse.h tre-stack.c \ - tre-stack.h tre.c tree-prv.h tree.c utf16.c utf8.c utl-ass.c \ - utl-skad.c utl-skad.h utl-sort.c utl-str.c utl-sys.c utl.c \ - val-prv.h val.c hawk-cli.h hawk-fio.h hawk-mtx.h hawk-pio.h \ - hawk-sio.h hawk-tio.h cli.c fio.c mtx.c pio.c sio.c syscall.h \ - tio.c std-prv.h std.c imap-imp.h mod-math.c mod-math.h \ - mod-str.c mod-str.h mod-sys.c mod-sys.h + Hawk.hpp HawkStd.hpp arr.c chr.c dir.c ecs-imp.h ecs.c \ + err-prv.h err.c err-sys.c fmt-imp.h fmt.c fnc-prv.h fnc.c \ + htb.c gem.c gem-skad.c gem-nwif.c gem-nwif2.c hawk-prv.h \ + hawk.c mb8.c misc-prv.h misc.c parse-prv.h parse.c rbt.c rec.c \ + rio-prv.h rio.c run-prv.h run.c tre-prv.h tre-ast.c tre-ast.h \ + tre-compile.c tre-compile.h tre-match-bt.c tre-match-pa.c \ + tre-match-ut.h tre-mem.c tre-mem.h tre-parse.c tre-parse.h \ + tre-stack.c tre-stack.h tre.c tree-prv.h tree.c utf16.c utf8.c \ + utl-ass.c utl-skad.c utl-skad.h utl-sort.c utl-str.c utl-sys.c \ + utl.c val-prv.h val.c hawk-cli.h hawk-fio.h hawk-mtx.h \ + hawk-pio.h hawk-sio.h hawk-tio.h cli.c fio.c mtx.c pio.c sio.c \ + syscall.h tio.c std-prv.h std.c imap-imp.h mod-math.c \ + mod-math.h mod-str.c mod-str.h mod-sys.c mod-sys.h am__objects_1 = -@ENABLE_STATIC_MODULE_TRUE@am__objects_2 = libhawk_la-mod-math.lo \ +am__objects_2 = $(am__objects_1) +@ENABLE_STATIC_MODULE_TRUE@am__objects_3 = libhawk_la-mod-math.lo \ @ENABLE_STATIC_MODULE_TRUE@ libhawk_la-mod-str.lo \ @ENABLE_STATIC_MODULE_TRUE@ libhawk_la-mod-sys.lo -am_libhawk_la_OBJECTS = $(am__objects_1) libhawk_la-arr.lo \ +am_libhawk_la_OBJECTS = $(am__objects_2) libhawk_la-arr.lo \ libhawk_la-chr.lo libhawk_la-dir.lo libhawk_la-ecs.lo \ libhawk_la-err.lo libhawk_la-err-sys.lo libhawk_la-fmt.lo \ libhawk_la-fnc.lo libhawk_la-htb.lo libhawk_la-gem.lo \ @@ -238,14 +240,14 @@ am_libhawk_la_OBJECTS = $(am__objects_1) libhawk_la-arr.lo \ libhawk_la-utl-str.lo libhawk_la-utl-sys.lo libhawk_la-utl.lo \ libhawk_la-val.lo libhawk_la-cli.lo libhawk_la-fio.lo \ libhawk_la-mtx.lo libhawk_la-pio.lo libhawk_la-sio.lo \ - libhawk_la-tio.lo libhawk_la-std.lo $(am__objects_2) + libhawk_la-tio.lo libhawk_la-std.lo $(am__objects_3) libhawk_la_OBJECTS = $(am_libhawk_la_OBJECTS) libhawk_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libhawk_la_LDFLAGS) $(LDFLAGS) -o $@ -am__libhawkxx_la_SOURCES_DIST = Hawk.cpp StdHawk.cpp +am__libhawkxx_la_SOURCES_DIST = Hawk.cpp HawkStd.cpp @ENABLE_CXX_TRUE@am_libhawkxx_la_OBJECTS = libhawkxx_la-Hawk.lo \ -@ENABLE_CXX_TRUE@ libhawkxx_la-StdHawk.lo +@ENABLE_CXX_TRUE@ libhawkxx_la-HawkStd.lo libhawkxx_la_OBJECTS = $(am_libhawkxx_la_OBJECTS) libhawkxx_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ @@ -316,6 +318,10 @@ am__can_run_installinfo = \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac +am__pkginclude_HEADERS_DIST = hawk.h hawk-chr.h hawk-cmn.h hawk-dir.h \ + hawk-ecs.h hawk-fmt.h hawk-gem.h hawk-htb.h hawk-rbt.h \ + hawk-pack1.h hawk-utl.h hawk-std.h hawk-tre.h hawk-unpack.h \ + Hawk.hpp HawkStd.hpp HEADERS = $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ $(LISP)hawk-cfg.h.in @@ -535,23 +541,11 @@ DEPENDENCIES_LIB_COMMON = @WIN32_TRUE@CPPFLAGS_PFMOD = -DHAWK_DEFAULT_MODPREFIX=\"libhawk-\" \ @WIN32_TRUE@ -DHAWK_DEFAULT_MODPOSTFIX=\"-1.dll\" \ @WIN32_TRUE@ $(am__append_1) $(am__append_2) -pkginclude_HEADERS = \ - hawk.h \ - hawk-chr.h \ - hawk-cmn.h \ - hawk-dir.h \ - hawk-ecs.h \ - hawk-fmt.h \ - hawk-gem.h \ - hawk-htb.h \ - hawk-rbt.h \ - hawk-pack1.h \ - hawk-utl.h \ - hawk-std.h \ - hawk-tre.h \ - hawk-unpack.h - -pkglib_LTLIBRARIES = libhawk.la $(am__append_7) $(am__append_14) +pkginclude_HEADERS = hawk.h hawk-chr.h hawk-cmn.h hawk-dir.h \ + hawk-ecs.h hawk-fmt.h hawk-gem.h hawk-htb.h hawk-rbt.h \ + hawk-pack1.h hawk-utl.h hawk-std.h hawk-tre.h hawk-unpack.h \ + $(am__append_7) +pkglib_LTLIBRARIES = libhawk.la $(am__append_8) $(am__append_15) libhawk_la_SOURCES = $(pkginclude_HEADERS) arr.c chr.c dir.c ecs-imp.h \ ecs.c err-prv.h err.c err-sys.c fmt-imp.h fmt.c fnc-prv.h \ fnc.c htb.c gem.c gem-skad.c gem-nwif.c gem-nwif2.c hawk-prv.h \ @@ -563,15 +557,15 @@ libhawk_la_SOURCES = $(pkginclude_HEADERS) arr.c chr.c dir.c ecs-imp.h \ utl-ass.c utl-skad.c utl-skad.h utl-sort.c utl-str.c utl-sys.c \ utl.c val-prv.h val.c hawk-cli.h hawk-fio.h hawk-mtx.h \ hawk-pio.h hawk-sio.h hawk-tio.h cli.c fio.c mtx.c pio.c sio.c \ - syscall.h tio.c std-prv.h std.c $(am__append_8) + syscall.h tio.c std-prv.h std.c $(am__append_9) libhawk_la_CPPFLAGS = $(CPPFLAGS_LIB_COMMON) $(am__append_3) libhawk_la_LDFLAGS = $(LDFLAGS_LIB_COMMON) libhawk_la_LIBADD = $(LIBADD_LIB_COMMON) $(am__append_4) \ - $(am__append_5) $(am__append_6) $(am__append_9) \ - $(am__append_10) $(am__append_12) -libhawk_la_DEPENDENCIES = $(DEPENDENCIES_LIB_COMMON) $(am__append_11) \ - $(am__append_13) -@ENABLE_CXX_TRUE@libhawkxx_la_SOURCES = Hawk.cpp StdHawk.cpp + $(am__append_5) $(am__append_6) $(am__append_10) \ + $(am__append_11) $(am__append_13) +libhawk_la_DEPENDENCIES = $(DEPENDENCIES_LIB_COMMON) $(am__append_12) \ + $(am__append_14) +@ENABLE_CXX_TRUE@libhawkxx_la_SOURCES = Hawk.cpp HawkStd.cpp @ENABLE_CXX_TRUE@libhawkxx_la_CPPFLAGS = $(CPPFLAGS_LIB_COMMON) @ENABLE_CXX_TRUE@libhawkxx_la_LDFLAGS = $(LDFLAGS_LIB_COMMON) @ENABLE_CXX_TRUE@libhawkxx_la_LIBADD = -lhawk $(LIBADD_LIB_COMMON) @@ -758,7 +752,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhawk_str_la-mod-str.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhawk_sys_la-mod-sys.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhawkxx_la-Hawk.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhawkxx_la-StdHawk.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhawkxx_la-HawkStd.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @@ -1179,12 +1173,12 @@ libhawkxx_la-Hawk.lo: Hawk.cpp @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhawkxx_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libhawkxx_la-Hawk.lo `test -f 'Hawk.cpp' || echo '$(srcdir)/'`Hawk.cpp -libhawkxx_la-StdHawk.lo: StdHawk.cpp -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhawkxx_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libhawkxx_la-StdHawk.lo -MD -MP -MF $(DEPDIR)/libhawkxx_la-StdHawk.Tpo -c -o libhawkxx_la-StdHawk.lo `test -f 'StdHawk.cpp' || echo '$(srcdir)/'`StdHawk.cpp -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhawkxx_la-StdHawk.Tpo $(DEPDIR)/libhawkxx_la-StdHawk.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='StdHawk.cpp' object='libhawkxx_la-StdHawk.lo' libtool=yes @AMDEPBACKSLASH@ +libhawkxx_la-HawkStd.lo: HawkStd.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhawkxx_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libhawkxx_la-HawkStd.lo -MD -MP -MF $(DEPDIR)/libhawkxx_la-HawkStd.Tpo -c -o libhawkxx_la-HawkStd.lo `test -f 'HawkStd.cpp' || echo '$(srcdir)/'`HawkStd.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhawkxx_la-HawkStd.Tpo $(DEPDIR)/libhawkxx_la-HawkStd.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='HawkStd.cpp' object='libhawkxx_la-HawkStd.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhawkxx_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libhawkxx_la-StdHawk.lo `test -f 'StdHawk.cpp' || echo '$(srcdir)/'`StdHawk.cpp +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhawkxx_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libhawkxx_la-HawkStd.lo `test -f 'HawkStd.cpp' || echo '$(srcdir)/'`HawkStd.cpp mostlyclean-libtool: -rm -f *.lo diff --git a/hawk/lib/generrcode.awk b/hawk/lib/generrcode.awk index c70c8c46..2c672971 100644 --- a/hawk/lib/generrcode.awk +++ b/hawk/lib/generrcode.awk @@ -1,7 +1,7 @@ # # generrcode.awk # -# qseawk -f generrcode.awk awk.h +# hawk -f generrcode.awk hawk-cmn.h # BEGIN { diff --git a/hawk/lib/genoptcode.awk b/hawk/lib/genoptcode.awk index a7c649ea..8463aa27 100644 --- a/hawk/lib/genoptcode.awk +++ b/hawk/lib/genoptcode.awk @@ -1,7 +1,7 @@ # # genoptcode.awk # -# qseawk -f generror.awk awk.h +# hawk -f generror.awk hawk.h # BEGIN { diff --git a/hawk/lib/hawk-cmn.h b/hawk/lib/hawk-cmn.h index 2eb43139..551d5536 100644 --- a/hawk/lib/hawk-cmn.h +++ b/hawk/lib/hawk-cmn.h @@ -420,11 +420,20 @@ typedef unsigned char hawk_bchu_t; /* unsigned version of hawk_bch_t f typedef hawk_uint32_t hawk_uchu_t; /* same as hawk_uch_t as it is already unsigned */ # define HAWK_SIZEOF_UCH_T 4 -#elif defined(__GNUC__) && defined(__CHAR16_TYPE__) - typedef __CHAR16_TYPE__ hawk_uch_t; - typedef hawk_uint16_t hawk_uchu_t; /* same as hawk_uch_t as it is already unsigned */ +#elif (defined(__cplusplus) && (defined(HAWK_USE_CPP_CHAR16_T) || (__cplusplus >= 201103L) || (defined(_MSC_VER) && _MSC_VER >= 1900))) /* user chosen or C++11 or later */ + /* you can define HAWK_USE_CPP_CHAR16_T if you know the C++ compiler supports char16_t and + * it treats the u"XXX" or u'x' literals incompatibly with __CHAR16_TYPE__ */ + typedef char16_t hawk_uch_t; /* char16_t is an unsigned integer type used for 16-bit wide characters */ + typedef char16_t hawk_uchu_t; /* same as hawk_uch_t as it is already unsigned */ # define HAWK_SIZEOF_UCH_T 2 # define HAWK_UCH_IS_CHAR16_T + +#elif defined(__GNUC__) && defined(__CHAR16_TYPE__) + typedef __CHAR16_TYPE__ hawk_uch_t; /* this part isn't fully compatible with c++. try 'const __CHAR16_TYPE__* x = u"abc";' with g++ */ + typedef hawk_uint16_t hawk_uchu_t; +# define HAWK_SIZEOF_UCH_T 2 +# define HAWK_UCH_IS_CHAR16_T + #else typedef hawk_uint16_t hawk_uch_t; typedef hawk_uint16_t hawk_uchu_t; /* same as hawk_uch_t as it is already unsigned */ @@ -1249,19 +1258,19 @@ typedef enum hawk_log_mask_t hawk_log_mask_t; /* ========================================================================= * CHARACTER/STRING LITERALS * =========================================================================*/ -#define HAWK_MQ_I(val) #val -#define HAWK_MQ(val) HAWK_MQ_I(val) +#define HAWK_BQ_I(val) #val +#define HAWK_BQ(val) HAWK_BQ_I(val) /** * The #HAWK_BT macro maps a multi-byte literal string literal as it is. */ #define HAWK_BT(txt) (txt) #if defined(HAWK_UCH_IS_CHAR16_T) -# define HAWK_WQ_I(val) (u ## #val) -# define HAWK_WQ(val) HAWK_WQ_I(val) +# define HAWK_UQ_I(val) (u ## #val) +# define HAWK_UQ(val) HAWK_UQ_I(val) #else -# define HAWK_WQ_I(val) (L ## #val) -# define HAWK_WQ(val) HAWK_WQ_I(val) +# define HAWK_UQ_I(val) (L ## #val) +# define HAWK_UQ(val) HAWK_UQ_I(val) #endif /** @@ -1281,10 +1290,10 @@ typedef enum hawk_log_mask_t hawk_log_mask_t; * #HAWK_UT if #HAWK_OOCH_IS_UCH is defined. */ #if defined(HAWK_OOCH_IS_BCH) -# define HAWK_Q(val) HAWK_MQ(val) +# define HAWK_Q(val) HAWK_BQ(val) # define HAWK_T(txt) HAWK_BT(txt) #else -# define HAWK_Q(val) HAWK_WQ(val) +# define HAWK_Q(val) HAWK_UQ(val) # define HAWK_T(txt) HAWK_UT(txt) #endif diff --git a/hawk/lib/mod-math.c b/hawk/lib/mod-math.c index c1ee75b3..b1bf6bec 100644 --- a/hawk/lib/mod-math.c +++ b/hawk/lib/mod-math.c @@ -65,7 +65,7 @@ typedef struct modctx_t unsigned int seed; #if defined(HAVE_INITSTATE_R) && defined(HAVE_SRANDOM_R) && defined(HAVE_RANDOM_R) struct random_data prand; - hawk_uint8_t prand_bin[256]; + char prand_bin[256]; /* or hawk_uint8_t? */ #endif } modctx_t;