From 26b4ecd16eb7895ac5624e27464cfc79082ae5ec Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Tue, 17 Feb 2009 02:11:31 +0000 Subject: [PATCH] cleaned up code --- qse/cmd/awk/Awk.cpp | 112 ++++++++++++-------- qse/cmd/awk/awk.c | 15 ++- qse/include/qse/awk/Awk.hpp | 34 +++--- qse/include/qse/awk/StdAwk.hpp | 4 +- qse/include/qse/awk/awk.h | 187 ++++++++++++++++++--------------- qse/include/qse/cmn/chr.h | 6 +- qse/include/qse/macros.h | 27 ++++- qse/include/qse/types.h | 19 ++-- qse/lib/awk/Awk.cpp | 160 ++++++++++++---------------- qse/lib/awk/StdAwk.cpp | 8 +- qse/lib/awk/awk.c | 76 ++++++-------- qse/lib/awk/awk.h | 38 ++++--- qse/lib/awk/misc.c | 2 +- qse/lib/awk/parse.c | 16 ++- qse/lib/awk/rio.c | 24 ++--- qse/lib/awk/run.c | 36 ++++--- qse/lib/awk/std.c | 108 ++++++++++--------- qse/lib/awk/val.c | 74 ++++--------- qse/lib/cmn/chr.c | 16 +-- 19 files changed, 492 insertions(+), 470 deletions(-) diff --git a/qse/cmd/awk/Awk.cpp b/qse/cmd/awk/Awk.cpp index e7333852..2ab94615 100644 --- a/qse/cmd/awk/Awk.cpp +++ b/qse/cmd/awk/Awk.cpp @@ -1,5 +1,19 @@ /* * $Id: Awk.cpp 341 2008-08-20 10:58:19Z baconevi $ + * + Copyright 2006-2009 Chung, Hyung-Hwan. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. */ #include @@ -34,6 +48,9 @@ static BOOL WINAPI stop_run (DWORD ctrl_type); static void stop_run (int sig); #endif +static void set_intr_run (void); +static void unset_intr_run (void); + TestAwk* app_awk = QSE_NULL; static bool verbose = false; @@ -232,57 +249,16 @@ public: protected: - bool onRunStart (Run& run) - { - if (verbose) qse_printf (QSE_T("*** awk run started ***\n")); - - app_awk = this; - #ifdef _WIN32 - SetConsoleCtrlHandler (stop_run, TRUE); - #else - struct sigaction sa_int; - sa_int.sa_handler = stop_run; - sigemptyset (&sa_int.sa_mask); - sa_int.sa_flags = 0; - #ifdef SA_RESTART - sa_int.sa_flags |= SA_RESTART; - #endif - sigaction (SIGINT, &sa_int, NULL); - #endif - - return true; - } - - void onRunEnd (Run& run) - { - ErrorCode err = run.getErrorCode(); - - if (err != ERR_NOERR) - { - qse_fprintf (stderr, QSE_T("cannot run: LINE[%d] %s\n"), - run.getErrorLine(), run.getErrorMessage()); - } - - #ifdef _WIN32 - SetConsoleCtrlHandler (stop_run, FALSE); - #else - struct sigaction sa_int; - sa_int.sa_handler = SIG_DFL; - sigemptyset (&sa_int.sa_mask); - sa_int.sa_flags = 0; - sigaction (SIGINT, &sa_int, NULL); - #endif - app_awk = QSE_NULL; - if (verbose) qse_printf (QSE_T("*** awk run ended ***\n")); - } - bool onRunEnter (Run& run) { + set_intr_run (); return true; } - void onRunReturn (Run& run, const Argument& ret) + void onRunExit (Run& run, const Argument& ret) { + unset_intr_run (); + if (verbose) { size_t len; @@ -290,6 +266,7 @@ protected: qse_printf (QSE_T("*** return [%.*s] ***\n"), (int)len, ptr); } } + int openSource (Source& io) { @@ -650,6 +627,31 @@ static BOOL WINAPI stop_run (DWORD ctrl_type) return FALSE; } #else + +static int setsignal (int sig, void(*handler)(int), int restart) +{ + struct sigaction sa_int; + + sa_int.sa_handler = handler; + sigemptyset (&sa_int.sa_mask); + + sa_int.sa_flags = 0; + + if (restart) + { + #ifdef SA_RESTART + sa_int.sa_flags |= SA_RESTART; + #endif + } + else + { + #ifdef SA_INTERRUPT + sa_int.sa_flags |= SA_INTERRUPT; + #endif + } + return sigaction (sig, &sa_int, NULL); +} + static void stop_run (int sig) { int e = errno; @@ -658,6 +660,24 @@ static void stop_run (int sig) } #endif +static void set_intr_run (void) +{ +#ifdef _WIN32 + SetConsoleCtrlHandler (stop_run, TRUE); +#else + /*setsignal (SIGINT, stop_run, 1); TO BE MORE COMPATIBLE WITH WIN32*/ + setsignal (SIGINT, stop_run, 0); +#endif +} + +static void unset_intr_run (void) +{ +#ifdef _WIN32 + SetConsoleCtrlHandler (stop_run, FALSE); +#else + setsignal (SIGINT, SIG_DFL, 1); +#endif +} #ifndef NDEBUG void qse_assert_abort (void) @@ -921,6 +941,7 @@ static int awk_main (int argc, qse_char_t* argv[]) } awk.enableRunCallback (); + app_awk = &awk; if (awk.run (args, nargs) == -1) { @@ -930,6 +951,7 @@ static int awk_main (int argc, qse_char_t* argv[]) return -1; } + app_awk = QSE_NULL; awk.close (); return 0; diff --git a/qse/cmd/awk/awk.c b/qse/cmd/awk/awk.c index 23bd562e..f498fc80 100644 --- a/qse/cmd/awk/awk.c +++ b/qse/cmd/awk/awk.c @@ -1,5 +1,19 @@ /* * $Id: awk.c 499 2008-12-16 09:42:48Z baconevi $ + * + Copyright 2006-2009 Chung, Hyung-Hwan. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. */ #include @@ -22,7 +36,6 @@ # include # include # include - # if defined(_MSC_VER) && defined(_DEBUG) # define _CRTDBG_MAP_ALLOC # include diff --git a/qse/include/qse/awk/Awk.hpp b/qse/include/qse/awk/Awk.hpp index 10f344bd..8964b536 100644 --- a/qse/include/qse/awk/Awk.hpp +++ b/qse/include/qse/awk/Awk.hpp @@ -68,7 +68,7 @@ public: /** Represents an runtime I/O data */ typedef qse_awk_riod_t riod_t; - enum ccls_type_t + enum ccls_id_t { CCLS_UPPER = QSE_CCLS_UPPER, CCLS_LOWER = QSE_CCLS_LOWER, @@ -743,10 +743,9 @@ public: void free (void* ptr); protected: - Awk* awk; + Awk* awk; rtx_t* run; - bool callbackFailed; - void* data; + void* data; }; /** Constructor */ @@ -1045,8 +1044,6 @@ protected: /*@}*/ // run-time callbacks - virtual bool onRunStart (Run& run); - virtual void onRunEnd (Run& run); virtual bool onRunEnter (Run& run); virtual void onRunExit (Run& run, const Argument& ret); virtual void onRunStatement (Run& run, size_t line); @@ -1056,8 +1053,8 @@ protected: virtual void* reallocMem (void* ptr, size_t n) = 0; virtual void freeMem (void* ptr) = 0; - virtual bool_t isType (cint_t c, ccls_type_t type) = 0; - virtual cint_t transCase (cint_t c, ccls_type_t type) = 0; + virtual bool_t isType (cint_t c, ccls_id_t type) = 0; + virtual cint_t transCase (cint_t c, ccls_id_t type) = 0; virtual real_t pow (real_t x, real_t y) = 0; virtual int vsprintf (char_t* buf, size_t size, @@ -1065,23 +1062,24 @@ protected: // static glue members for various handlers static ssize_t sourceReader ( - awk_t* awk, int cmd, char_t* data, size_t count); + awk_t* awk, qse_awk_sio_cmd_t cmd, char_t* data, size_t count); static ssize_t sourceWriter ( - awk_t* awk, int cmd, char_t* data, size_t count); + awk_t* awk, qse_awk_sio_cmd_t cmd, char_t* data, size_t count); static ssize_t pipeHandler ( - rtx_t* rtx, int cmd, riod_t* riod, char_t* data, size_t count); + rtx_t* rtx, qse_awk_rio_cmd_t cmd, riod_t* riod, + char_t* data, size_t count); static ssize_t fileHandler ( - rtx_t* rtx, int cmd, riod_t* riod, char_t* data, size_t count); + rtx_t* rtx, qse_awk_rio_cmd_t cmd, riod_t* riod, + char_t* data, size_t count); static ssize_t consoleHandler ( - rtx_t* rtx, int cmd, riod_t* riod, char_t* data, size_t count); + rtx_t* rtx, qse_awk_rio_cmd_t cmd, riod_t* riod, + char_t* data, size_t count); static int functionHandler ( rtx_t* rtx, const char_t* name, size_t len); static void freeFunctionMapValue (map_t* map, void* dptr, size_t dlen); - static int onRunStart (rtx_t* run, void* data); - static void onRunEnd (rtx_t* run, int errnum, void* data); static int onRunEnter (rtx_t* run, void* data); static void onRunExit (rtx_t* run, val_t* ret, void* data); static void onRunStatement (rtx_t* run, size_t line, void* data); @@ -1090,8 +1088,8 @@ protected: static void* reallocMem (void* data, void* ptr, size_t n); static void freeMem (void* data, void* ptr); - static bool_t isType (void* data, cint_t c, qse_ccls_type_t type); - static cint_t transCase (void* data, cint_t c, qse_ccls_type_t type); + static bool_t isType (awk_t* awk, cint_t c, qse_ccls_id_t type); + static cint_t transCase (awk_t* awk, cint_t c, qse_ccls_id_t type); static real_t pow (awk_t* data, real_t x, real_t y); static int sprintf (awk_t* data, char_t* buf, size_t size, @@ -1115,8 +1113,6 @@ private: Awk& operator= (const Awk&); mmgr_t mmgr; - ccls_t ccls; - qse_awk_prm_t prm; }; ///////////////////////////////// diff --git a/qse/include/qse/awk/StdAwk.hpp b/qse/include/qse/awk/StdAwk.hpp index adb69aa0..6689d179 100644 --- a/qse/include/qse/awk/StdAwk.hpp +++ b/qse/include/qse/awk/StdAwk.hpp @@ -84,8 +84,8 @@ protected: void* reallocMem (void* ptr, size_t n); void freeMem (void* ptr); - bool_t isType (cint_t c, ccls_type_t type); - cint_t transCase (cint_t c, ccls_type_t type); + bool_t isType (cint_t c, ccls_id_t type); + cint_t transCase (cint_t c, ccls_id_t type); real_t pow (real_t x, real_t y); int vsprintf (char_t* buf, size_t size, diff --git a/qse/include/qse/awk/awk.h b/qse/include/qse/awk/awk.h index 9e792416..f776f212 100644 --- a/qse/include/qse/awk/awk.h +++ b/qse/include/qse/awk/awk.h @@ -58,7 +58,6 @@ typedef struct qse_awk_rio_t qse_awk_rio_t; typedef struct qse_awk_riod_t qse_awk_riod_t; typedef struct qse_awk_rcb_t qse_awk_rcb_t; -typedef struct qse_awk_rexfns_t qse_awk_rexfns_t; typedef qse_real_t (*qse_awk_pow_t) ( qse_awk_t* awk, @@ -74,36 +73,70 @@ typedef int (*qse_awk_sprintf_t) ( ... ); +typedef qse_bool_t (*qse_awk_isccls_t) ( + qse_awk_t* awk, + qse_cint_t c, + qse_ccls_id_t type +); + +typedef qse_cint_t (*qse_awk_toccls_t) ( + qse_awk_t* awk, + qse_cint_t c, + qse_ccls_id_t type +); + +enum qse_awk_sio_cmd_t +{ + QSE_AWK_SIO_OPEN = 0, + QSE_AWK_SIO_CLOSE = 1, + QSE_AWK_SIO_READ = 2, + QSE_AWK_SIO_WRITE = 3 +}; + +typedef enum qse_awk_sio_cmd_t qse_awk_sio_cmd_t; + /****t* AWK/qse_awk_siof_t * NAME * qse_awk_siof_t - define a source IO function * SYNOPSIS */ typedef qse_ssize_t (*qse_awk_siof_t) ( - qse_awk_t* awk, - int cmd, - qse_char_t* data, - qse_size_t count + qse_awk_t* awk, + qse_awk_sio_cmd_t cmd, + qse_char_t* data, + qse_size_t count ); /*****/ +enum qse_awk_rio_cmd_t +{ + QSE_AWK_RIO_OPEN = 0, + QSE_AWK_RIO_CLOSE = 1, + QSE_AWK_RIO_READ = 2, + QSE_AWK_RIO_WRITE = 3, + QSE_AWK_RIO_FLUSH = 4, + QSE_AWK_RIO_NEXT = 5 +}; + +typedef enum qse_awk_rio_cmd_t qse_awk_rio_cmd_t; + /****f* AWK/qse_awk_riof_t * NAME * qse_awk_riof_t - define a runtime IO function * SYNOPSIS */ typedef qse_ssize_t (*qse_awk_riof_t) ( - qse_awk_rtx_t* rtx, - int cmd, - qse_awk_riod_t* riod, - qse_char_t* data, - qse_size_t count + qse_awk_rtx_t* rtx, + qse_awk_rio_cmd_t cmd, + qse_awk_riod_t* riod, + qse_char_t* data, + qse_size_t count ); /******/ /****f* AWK/qse_awk_riod_t * NAME - * qse_awk_riod_f - define a data passed to a rio function + * qse_awk_riod_f - define the data passed to a rio function * SYNOPSIS */ struct qse_awk_riod_t @@ -135,40 +168,13 @@ struct qse_awk_riod_t struct qse_awk_prm_t { - qse_awk_pow_t pow; /* required */ - qse_awk_sprintf_t sprintf; /* required */ -}; + qse_awk_pow_t pow; + qse_awk_sprintf_t sprintf; + qse_awk_isccls_t isccls; + qse_awk_toccls_t toccls; -struct qse_awk_sio_t -{ - qse_awk_siof_t in; - qse_awk_siof_t out; -}; - -struct qse_awk_rio_t -{ - qse_awk_riof_t pipe; - qse_awk_riof_t file; - qse_awk_riof_t console; -}; - -struct qse_awk_rcb_t -{ - int (*on_enter) ( - qse_awk_rtx_t* rtx, void* data); - - void (*on_statement) ( - qse_awk_rtx_t* rtx, qse_size_t line, void* data); - - void (*on_exit) ( - qse_awk_rtx_t* rtx, qse_awk_val_t* ret, void* data); - - void* data; -}; - -struct qse_awk_rexfns_t -{ - /* TODO: implement functions to get/set rexfns */ +#if 0 + /* TODO: accept regular expression handling functions */ void* (*build) ( qse_awk_t* awk, const qse_char_t* ptn, @@ -196,17 +202,34 @@ struct qse_awk_rexfns_t qse_awk_t* awk, void* code ); +#endif }; -/* io function commands */ -enum qse_awk_iocmd_t +struct qse_awk_sio_t { - QSE_AWK_IO_OPEN = 0, - QSE_AWK_IO_CLOSE = 1, - QSE_AWK_IO_READ = 2, - QSE_AWK_IO_WRITE = 3, - QSE_AWK_IO_FLUSH = 4, - QSE_AWK_IO_NEXT = 5 + qse_awk_siof_t in; + qse_awk_siof_t out; +}; + +struct qse_awk_rio_t +{ + qse_awk_riof_t pipe; + qse_awk_riof_t file; + qse_awk_riof_t console; +}; + +struct qse_awk_rcb_t +{ + int (*on_enter) ( + qse_awk_rtx_t* rtx, void* data); + + void (*on_statement) ( + qse_awk_rtx_t* rtx, qse_size_t line, void* data); + + void (*on_exit) ( + qse_awk_rtx_t* rtx, qse_awk_val_t* ret, void* data); + + void* data; }; /* various options */ @@ -649,19 +672,35 @@ extern qse_awk_val_t* qse_awk_val_one; * NAME * qse_awk_open - create an awk object * DESCRIPTION - * The qse_awk_open() function creates a new qse_awk_t instance. + * The qse_awk_open() function creates a new qse_awk_t object. * The instance created can be passed to other qse_awk_xxx() functions and * is valid until it is successfully destroyed using the qse_qse_close() - * function. + * function. The function save the memory manager pointer while it copies + * the contents of the primitive function structures. Therefore, you should + * keep the memory manager valid during the whole life cycle of an qse_awk_t + * object. + * + * qse_awk_t* dummy() + * { + * qse_mmgr_t mmgr; + * qse_awk_prm_t prm; + * return qse_awk_open ( + * &mmgr, // NOT OK because the contents of mmgr is + * // invalidated when dummy() returns. + * 0, + * &prm // OK + * ); + * } + * * RETURN - * The qse_awk_open() function returns the pointer to a qse_awk_t instance + * The qse_awk_open() function returns the pointer to a qse_awk_t object * on success and QSE_NULL on failure. * SYNOPSIS */ qse_awk_t* qse_awk_open ( - qse_mmgr_t* mmgr /* a memory manager */, - qse_size_t xtn /* the size of extension in bytes */, - qse_ccls_t* ccls + qse_mmgr_t* mmgr /* a memory manager */, + qse_size_t xtn /* the size of extension in bytes */, + qse_awk_prm_t* prm /* primitive functoins */ ); /******/ @@ -723,27 +762,6 @@ void* qse_awk_getxtn ( ); /******/ -/****f* AWK/qse_awk_getccls - * NAME - * qse_awk_getccls - get a character classifier - * SYNOPSIS - */ -qse_ccls_t* qse_awk_getccls ( - qse_awk_t* awk -); -/******/ - -/****f* AWK/qse_awk_setccls - * NAME - * qse_awk_setccls - set the character classfier - * SYNOPSIS - */ -void qse_awk_setccls ( - qse_awk_t* awk, - qse_ccls_t* ccls -); -/******/ - /****f* AWK/qse_awk_getprm * NAME * qse_awk_getprm - get primitive functions @@ -754,14 +772,13 @@ qse_awk_prm_t* qse_awk_getprm ( ); /******/ -/****f* AWK/qse_awk_setprm +/****f* AWK/qse_awk_getccls * NAME - * qse_awk_setprm - set primitive functions + * qse_awk_getcclas - get the character classifier * SYNOPSIS */ -void qse_awk_setprm ( - qse_awk_t* awk, - qse_awk_prm_t* prm +qse_ccls_t* qse_awk_getccls ( + qse_awk_t* ccls ); /******/ @@ -1450,7 +1467,7 @@ qse_awk_val_t* qse_awk_rtx_makerefval ( qse_awk_val_t** adr ); -qse_bool_t qse_awk_isstaticval ( +qse_bool_t qse_awk_rtx_isstaticval ( qse_awk_rtx_t* rtx, qse_awk_val_t* val ); diff --git a/qse/include/qse/cmn/chr.h b/qse/include/qse/cmn/chr.h index 923d2a81..eff1d8ac 100644 --- a/qse/include/qse/cmn/chr.h +++ b/qse/include/qse/cmn/chr.h @@ -53,16 +53,14 @@ extern qse_ccls_t* qse_ccls; qse_bool_t qse_ccls_is ( qse_cint_t c, - qse_ccls_type_t type + qse_ccls_id_t type ); qse_cint_t qse_ccls_to ( qse_cint_t c, - qse_ccls_type_t type + qse_ccls_id_t type ); - - qse_size_t qse_mblen ( const qse_mchar_t* mb, qse_size_t mblen diff --git a/qse/include/qse/macros.h b/qse/include/qse/macros.h index be9b1a10..5e9e7fed 100644 --- a/qse/include/qse/macros.h +++ b/qse/include/qse/macros.h @@ -172,6 +172,26 @@ qse_mmgr_t* qse_##name##_getmmgr (qse_##name##_t* name); \ void* qse_##name##_getxtn (qse_##name##_t* name); /******/ +/****d* Base/QSE_MMGR + * NAME + * QSE_MMGR - get the memory manager field + * SYNOPSIS + */ +#define QSE_MMGR(obj) (obj->mmgr) +/******/ + +/****d* Base/QSE_XTN + * NAME + * QSE_XTN - get a pointer to extension space + * DESCRIPTION + * The QSE_XTN() macro is a convenience macro to retrieve the pointer to + * extension space located at the end of an object. The type of the object + * should be known in advance for it to work properly. + * SYNOPSIS + */ +#define QSE_XTN(obj) ((void*)(obj + 1)) +/******/ + /****d* Base/QSE_IMPLEMENT_COMMON_FUNCTIONS * NAME * QSE_IMPLEMENT_COMMON_FUNCTIONS - implement common functions @@ -180,16 +200,17 @@ void* qse_##name##_getxtn (qse_##name##_t* name); #define QSE_IMPLEMENT_COMMON_FUNCTIONS(name) \ void qse_##name##_setmmgr (qse_##name##_t* name, qse_mmgr_t* mmgr) \ { \ - name->mmgr = mmgr; \ + QSE_MMGR(name) = mmgr; \ } \ qse_mmgr_t* qse_##name##_getmmgr (qse_##name##_t* name) \ { \ - return name->mmgr; \ + return QSE_MMGR(name); \ } \ void* qse_##name##_getxtn (qse_##name##_t* name) \ { \ - return (void*)(name + 1); \ + return QSE_XTN(name); \ } /******/ + #endif diff --git a/qse/include/qse/types.h b/qse/include/qse/types.h index 7b57f82d..c9dfbfe7 100644 --- a/qse/include/qse/types.h +++ b/qse/include/qse/types.h @@ -413,12 +413,12 @@ struct qse_mmgr_t }; /******/ -/****t* Base/qse_ccls_type_t +/****t* Base/qse_ccls_id_t * NAME - * qse_ccls_type_t - define character class types + * qse_ccls_id_t - define character class types * SYNOPSIS */ -enum qse_ccls_type_t +enum qse_ccls_id_t { QSE_CCLS_UPPER, QSE_CCLS_LOWER, @@ -434,7 +434,12 @@ enum qse_ccls_type_t }; /******/ -typedef enum qse_ccls_type_t qse_ccls_type_t; +typedef enum qse_ccls_id_t qse_ccls_id_t; + +typedef qse_bool_t (*qse_ccls_is_t) ( + void* data, qse_cint_t c, qse_ccls_id_t type); +typedef qse_cint_t (*qse_ccls_to_t) ( + void* data, qse_cint_t c, qse_ccls_id_t type); /****t* Base/qse_ccls_t * NAME @@ -443,9 +448,9 @@ typedef enum qse_ccls_type_t qse_ccls_type_t; */ struct qse_ccls_t { - qse_bool_t (*is) (void* data, qse_cint_t c, qse_ccls_type_t type); - qse_cint_t (*to) (void* data, qse_cint_t c, qse_ccls_type_t type); - void* data; + qse_ccls_is_t is; + qse_ccls_to_t to; + void* data; }; /******/ diff --git a/qse/lib/awk/Awk.cpp b/qse/lib/awk/Awk.cpp index 0f0d702c..9ed8f502 100644 --- a/qse/lib/awk/Awk.cpp +++ b/qse/lib/awk/Awk.cpp @@ -19,6 +19,7 @@ #include #include #include "../cmn/mem.h" +#include "awk.h" #include ///////////////////////////////// @@ -83,7 +84,7 @@ void Awk::RIO::setHandle (void* handle) Awk::RIO::operator Awk::Awk* () const { - rxtn_t* rxtn = (rxtn_t*) qse_awk_rtx_getxtn (this->rtx); + rxtn_t* rxtn = (rxtn_t*) QSE_XTN (this->rtx); return rxtn->run->awk; } @@ -909,13 +910,11 @@ void Awk::Return::clear () // Awk::Run ////////////////////////////////////////////////////////////////// -Awk::Run::Run (Awk* awk): - awk (awk), run (QSE_NULL), callbackFailed (false) +Awk::Run::Run (Awk* awk): awk (awk), run (QSE_NULL) { } -Awk::Run::Run (Awk* awk, rtx_t* run): - awk (awk), run (run), callbackFailed (false), data (QSE_NULL) +Awk::Run::Run (Awk* awk, rtx_t* run): awk (awk), run (run), data (QSE_NULL) { QSE_ASSERT (this->run != QSE_NULL); } @@ -1077,13 +1076,6 @@ Awk::Awk (): awk (QSE_NULL), functionMap (QSE_NULL), mmgr.realloc = reallocMem; mmgr.free = freeMem; mmgr.data = this; - - ccls.is = isType; - ccls.to = transCase; - ccls.data = this; - - prm.pow = pow; - prm.sprintf = sprintf; } Awk::~Awk () @@ -1196,7 +1188,13 @@ int Awk::open () { QSE_ASSERT (awk == QSE_NULL && functionMap == QSE_NULL); - awk = qse_awk_open (&mmgr, QSE_SIZEOF(xtn_t), &ccls); + qse_awk_prm_t prm; + prm.pow = pow; + prm.sprintf = sprintf; + prm.isccls = isType; + prm.toccls = transCase; + + awk = qse_awk_open (&mmgr, QSE_SIZEOF(xtn_t), &prm); if (awk == QSE_NULL) { setError (ERR_NOMEM); @@ -1204,11 +1202,9 @@ int Awk::open () } // associate this Awk object with the underlying awk object - xtn_t* xtn = (xtn_t*)qse_awk_getxtn (awk); + xtn_t* xtn = (xtn_t*) QSE_XTN (awk); xtn->awk = this; - qse_awk_setprm (awk, &prm); - //functionMap = qse_map_open ( // this, 512, 70, freeFunctionMapValue, QSE_NULL, // qse_awk_getmmgr(awk)); @@ -1223,7 +1219,7 @@ int Awk::open () return -1; } - *(Awk**)qse_map_getxtn(functionMap) = this; + *(Awk**)QSE_XTN(functionMap) = this; qse_map_setcopier (functionMap, QSE_MAP_KEY, QSE_MAP_COPIER_INLINE); qse_map_setfreeer (functionMap, QSE_MAP_VAL, freeFunctionMapValue); qse_map_setscale (functionMap, QSE_MAP_KEY, QSE_SIZEOF(qse_char_t)); @@ -1415,7 +1411,7 @@ int Awk::run (const char_t** args, size_t nargs) { runctx.run = rtx; - rxtn_t* rxtn = (rxtn_t*) qse_awk_rtx_getxtn (rtx); + rxtn_t* rxtn = (rxtn_t*) QSE_XTN (rtx); rxtn->run = &runctx; if (runCallback) qse_awk_rtx_setrcb (rtx, &rcb); @@ -1581,15 +1577,6 @@ void Awk::disableRunCallback () runCallback = false; } -bool Awk::onRunStart (Run& run) -{ - return true; -} - -void Awk::onRunEnd (Run& run) -{ -} - bool Awk::onRunEnter (Run& run) { return true; @@ -1604,45 +1591,50 @@ void Awk::onRunStatement (Run& run, size_t line) } Awk::ssize_t Awk::sourceReader ( - awk_t* awk, int cmd, char_t* data, size_t count) + awk_t* awk, qse_awk_sio_cmd_t cmd, char_t* data, size_t count) { - xtn_t* xtn = (xtn_t*) qse_awk_getxtn (awk); + xtn_t* xtn = (xtn_t*) QSE_XTN (awk); switch (cmd) { - case QSE_AWK_IO_OPEN: + case QSE_AWK_SIO_OPEN: return xtn->awk->openSource (xtn->awk->sourceIn); - case QSE_AWK_IO_CLOSE: + case QSE_AWK_SIO_CLOSE: return xtn->awk->closeSource (xtn->awk->sourceIn); - case QSE_AWK_IO_READ: + case QSE_AWK_SIO_READ: return xtn->awk->readSource (xtn->awk->sourceIn, data, count); + case QSE_AWK_SIO_WRITE: + return -1; } return -1; } Awk::ssize_t Awk::sourceWriter ( - awk_t* awk, int cmd, char_t* data, size_t count) + awk_t* awk, qse_awk_sio_cmd_t cmd, char_t* data, size_t count) { - xtn_t* xtn = (xtn_t*) qse_awk_getxtn (awk); + xtn_t* xtn = (xtn_t*) QSE_XTN (awk); switch (cmd) { - case QSE_AWK_IO_OPEN: + case QSE_AWK_SIO_OPEN: return xtn->awk->openSource (xtn->awk->sourceOut); - case QSE_AWK_IO_CLOSE: + case QSE_AWK_SIO_CLOSE: return xtn->awk->closeSource (xtn->awk->sourceOut); - case QSE_AWK_IO_WRITE: + case QSE_AWK_SIO_WRITE: return xtn->awk->writeSource (xtn->awk->sourceOut, data, count); + case QSE_AWK_SIO_READ: + return -1; } return -1; } Awk::ssize_t Awk::pipeHandler ( - rtx_t* rtx, int cmd, riod_t* riod, char_t* data, size_t count) + rtx_t* rtx, qse_awk_rio_cmd_t cmd, riod_t* riod, + char_t* data, size_t count) { - rxtn_t* rxtn = (rxtn_t*) qse_awk_rtx_getxtn (rtx); + rxtn_t* rxtn = (rxtn_t*) QSE_XTN (rtx); Awk* awk = rxtn->run->awk; QSE_ASSERT ((riod->type & 0xFF) == QSE_AWK_RIO_PIPE); @@ -1651,20 +1643,20 @@ Awk::ssize_t Awk::pipeHandler ( switch (cmd) { - case QSE_AWK_IO_OPEN: + case QSE_AWK_RIO_OPEN: return awk->openPipe (pipe); - case QSE_AWK_IO_CLOSE: + case QSE_AWK_RIO_CLOSE: return awk->closePipe (pipe); - case QSE_AWK_IO_READ: + case QSE_AWK_RIO_READ: return awk->readPipe (pipe, data, count); - case QSE_AWK_IO_WRITE: + case QSE_AWK_RIO_WRITE: return awk->writePipe (pipe, data, count); - case QSE_AWK_IO_FLUSH: + case QSE_AWK_RIO_FLUSH: return awk->flushPipe (pipe); - case QSE_AWK_IO_NEXT: + case QSE_AWK_RIO_NEXT: return -1; } @@ -1672,9 +1664,10 @@ Awk::ssize_t Awk::pipeHandler ( } Awk::ssize_t Awk::fileHandler ( - rtx_t* rtx, int cmd, riod_t* riod, char_t* data, size_t count) + rtx_t* rtx, qse_awk_rio_cmd_t cmd, riod_t* riod, + char_t* data, size_t count) { - rxtn_t* rxtn = (rxtn_t*) qse_awk_rtx_getxtn (rtx); + rxtn_t* rxtn = (rxtn_t*) QSE_XTN (rtx); Awk* awk = rxtn->run->awk; QSE_ASSERT ((riod->type & 0xFF) == QSE_AWK_RIO_FILE); @@ -1683,20 +1676,20 @@ Awk::ssize_t Awk::fileHandler ( switch (cmd) { - case QSE_AWK_IO_OPEN: + case QSE_AWK_RIO_OPEN: return awk->openFile (file); - case QSE_AWK_IO_CLOSE: + case QSE_AWK_RIO_CLOSE: return awk->closeFile (file); - case QSE_AWK_IO_READ: + case QSE_AWK_RIO_READ: return awk->readFile (file, data, count); - case QSE_AWK_IO_WRITE: + case QSE_AWK_RIO_WRITE: return awk->writeFile (file, data, count); - case QSE_AWK_IO_FLUSH: + case QSE_AWK_RIO_FLUSH: return awk->flushFile (file); - case QSE_AWK_IO_NEXT: + case QSE_AWK_RIO_NEXT: return -1; } @@ -1704,9 +1697,10 @@ Awk::ssize_t Awk::fileHandler ( } Awk::ssize_t Awk::consoleHandler ( - rtx_t* rtx, int cmd, riod_t* riod, char_t* data, size_t count) + rtx_t* rtx, qse_awk_rio_cmd_t cmd, riod_t* riod, + char_t* data, size_t count) { - rxtn_t* rxtn = (rxtn_t*) qse_awk_rtx_getxtn (rtx); + rxtn_t* rxtn = (rxtn_t*) QSE_XTN (rtx); Awk* awk = rxtn->run->awk; QSE_ASSERT ((riod->type & 0xFF) == QSE_AWK_RIO_CONSOLE); @@ -1715,19 +1709,19 @@ Awk::ssize_t Awk::consoleHandler ( switch (cmd) { - case QSE_AWK_IO_OPEN: + case QSE_AWK_RIO_OPEN: return awk->openConsole (console); - case QSE_AWK_IO_CLOSE: + case QSE_AWK_RIO_CLOSE: return awk->closeConsole (console); - case QSE_AWK_IO_READ: + case QSE_AWK_RIO_READ: return awk->readConsole (console, data, count); - case QSE_AWK_IO_WRITE: + case QSE_AWK_RIO_WRITE: return awk->writeConsole (console, data, count); - case QSE_AWK_IO_FLUSH: + case QSE_AWK_RIO_FLUSH: return awk->flushConsole (console); - case QSE_AWK_IO_NEXT: + case QSE_AWK_RIO_NEXT: return awk->nextConsole (console); } @@ -1736,57 +1730,35 @@ Awk::ssize_t Awk::consoleHandler ( int Awk::functionHandler (rtx_t* rtx, const char_t* name, size_t len) { - rxtn_t* rxtn = (rxtn_t*) qse_awk_rtx_getxtn (rtx); + rxtn_t* rxtn = (rxtn_t*) QSE_XTN (rtx); return rxtn->run->awk->dispatchFunction (rxtn->run, name, len); } void Awk::freeFunctionMapValue (map_t* map, void* dptr, size_t dlen) { - //Awk* awk = (Awk*)owner; - Awk* awk = *(Awk**)qse_map_getxtn(map); + Awk* awk = *(Awk**) QSE_XTN (map); qse_awk_free (awk->awk, dptr); } -int Awk::onRunStart (rtx_t* run, void* data) -{ - Run* r = (Run*)data; - r->callbackFailed = false; - return r->awk->onRunStart(*r)? 0: -1; -} - -void Awk::onRunEnd (rtx_t* run, int errnum, void* data) -{ - Run* r = (Run*)data; - - if (errnum == ERR_NOERR && r->callbackFailed) - { - qse_awk_rtx_seterrnum (r->run, ERR_NOMEM); - } - - r->awk->onRunEnd (*r); -} - int Awk::onRunEnter (rtx_t* run, void* data) { Run* r = (Run*)data; - if (r->callbackFailed) return false; return r->awk->onRunEnter(*r)? 0: -1; } void Awk::onRunExit (rtx_t* run, val_t* ret, void* data) { Run* r = (Run*)data; - if (r->callbackFailed) return; Argument x (r); - if (x.init (ret) == -1) r->callbackFailed = true; + if (x.init (ret) == -1) + qse_awk_rtx_seterrnum (r->run, ERR_NOMEM); else r->awk->onRunExit (*r, x); } void Awk::onRunStatement (rtx_t* run, size_t line, void* data) { Run* r = (Run*)data; - if (r->callbackFailed) return; r->awk->onRunStatement (*r, line); } @@ -1805,26 +1777,28 @@ void Awk::freeMem (void* data, void* ptr) ((Awk*)data)->freeMem (ptr); } -Awk::bool_t Awk::isType (void* data, cint_t c, qse_ccls_type_t type) +Awk::bool_t Awk::isType (awk_t* awk, cint_t c, qse_ccls_id_t type) { - return ((Awk*)data)->isType (c, (ccls_type_t)type); + xtn_t* xtn = (xtn_t*) QSE_XTN (awk); + return xtn->awk->isType (c, (ccls_id_t)type); } -Awk::cint_t Awk::transCase (void* data, cint_t c, qse_ccls_type_t type) +Awk::cint_t Awk::transCase (awk_t* awk, cint_t c, qse_ccls_id_t type) { - return ((Awk*)data)->transCase (c, (ccls_type_t)type); + xtn_t* xtn = (xtn_t*) QSE_XTN (awk); + return xtn->awk->transCase (c, (ccls_id_t)type); } Awk::real_t Awk::pow (awk_t* awk, real_t x, real_t y) { - xtn_t* xtn = (xtn_t*) qse_awk_getxtn (awk); + xtn_t* xtn = (xtn_t*) QSE_XTN (awk); return xtn->awk->pow (x, y); } int Awk::sprintf (awk_t* awk, char_t* buf, size_t size, const char_t* fmt, ...) { - xtn_t* xtn = (xtn_t*) qse_awk_getxtn (awk); + xtn_t* xtn = (xtn_t*) QSE_XTN (awk); va_list ap; va_start (ap, fmt); diff --git a/qse/lib/awk/StdAwk.cpp b/qse/lib/awk/StdAwk.cpp index 0dfbd590..7fb14856 100644 --- a/qse/lib/awk/StdAwk.cpp +++ b/qse/lib/awk/StdAwk.cpp @@ -412,14 +412,14 @@ void StdAwk::freeMem (void* ptr) } // character handling primitive -Awk::bool_t StdAwk::isType (cint_t c, ccls_type_t type) +Awk::bool_t StdAwk::isType (cint_t c, ccls_id_t type) { - return qse_ccls_is (c, (qse_ccls_type_t)type); + return qse_ccls_is (c, (qse_ccls_id_t)type); } -Awk::cint_t StdAwk::transCase (cint_t c, ccls_type_t type) +Awk::cint_t StdAwk::transCase (cint_t c, ccls_id_t type) { - return qse_ccls_to (c, (qse_ccls_type_t)type); + return qse_ccls_to (c, (qse_ccls_id_t)type); } // miscellaneous primitive diff --git a/qse/lib/awk/awk.c b/qse/lib/awk/awk.c index f6b763ef..3c1237ae 100644 --- a/qse/lib/awk/awk.c +++ b/qse/lib/awk/awk.c @@ -35,7 +35,7 @@ static void free_fun (qse_map_t* map, void* vptr, qse_size_t vlen) { - qse_awk_t* awk = *(qse_awk_t**)qse_map_getxtn(map); + qse_awk_t* awk = *(qse_awk_t**)QSE_XTN(map); qse_awk_fun_t* f = (qse_awk_fun_t*)vptr; /* f->name doesn't have to be freed */ @@ -47,13 +47,13 @@ static void free_fun (qse_map_t* map, void* vptr, qse_size_t vlen) static void free_fnc (qse_map_t* map, void* vptr, qse_size_t vlen) { - qse_awk_t* awk = *(qse_awk_t**)qse_map_getxtn(map); + qse_awk_t* awk = *(qse_awk_t**)QSE_XTN(map); qse_awk_fnc_t* f = (qse_awk_fnc_t*)vptr; QSE_AWK_FREE (awk, f); } -qse_awk_t* qse_awk_open (qse_mmgr_t* mmgr, qse_size_t xtn, qse_ccls_t* ccls) +qse_awk_t* qse_awk_open (qse_mmgr_t* mmgr, qse_size_t xtn, qse_awk_prm_t* prm) { qse_awk_t* awk; @@ -67,19 +67,34 @@ qse_awk_t* qse_awk_open (qse_mmgr_t* mmgr, qse_size_t xtn, qse_ccls_t* ccls) if (mmgr == QSE_NULL) return QSE_NULL; } + /* allocate the object */ awk = QSE_MMGR_ALLOC (mmgr, QSE_SIZEOF(qse_awk_t) + xtn); if (awk == QSE_NULL) return QSE_NULL; + /* zero out the object */ QSE_MEMSET (awk, 0, QSE_SIZEOF(qse_awk_t) + xtn); + + /* remember the memory manager */ awk->mmgr = mmgr; - awk->ccls = ccls; + + /* progagate the primitive functions */ + QSE_ASSERT (prm->pow != QSE_NULL); + QSE_ASSERT (prm->sprintf != QSE_NULL); + QSE_ASSERT (prm->isccls != QSE_NULL); + QSE_ASSERT (prm->toccls != QSE_NULL); + awk->prm = *prm; + + /* build a character classifier from the primitive functions */ + awk->ccls.is = (qse_ccls_is_t) prm->isccls; + awk->ccls.to = (qse_ccls_to_t) prm->toccls; + awk->ccls.data = awk; awk->token.name = qse_str_open (mmgr, 0, 128); if (awk->token.name == QSE_NULL) goto oops; awk->wtab = qse_map_open (mmgr, QSE_SIZEOF(awk), 512, 70); if (awk->wtab == QSE_NULL) goto oops; - *(qse_awk_t**)qse_map_getxtn(awk->wtab) = awk; + *(qse_awk_t**)QSE_XTN(awk->wtab) = awk; qse_map_setcopier (awk->wtab, QSE_MAP_KEY, QSE_MAP_COPIER_INLINE); qse_map_setcopier (awk->wtab, QSE_MAP_VAL, QSE_MAP_COPIER_INLINE); qse_map_setscale (awk->wtab, QSE_MAP_KEY, QSE_SIZEOF(qse_char_t)); @@ -87,7 +102,7 @@ qse_awk_t* qse_awk_open (qse_mmgr_t* mmgr, qse_size_t xtn, qse_ccls_t* ccls) awk->rwtab = qse_map_open (mmgr, QSE_SIZEOF(awk), 512, 70); if (awk->rwtab == QSE_NULL) goto oops; - *(qse_awk_t**)qse_map_getxtn(awk->rwtab) = awk; + *(qse_awk_t**)QSE_XTN(awk->rwtab) = awk; qse_map_setcopier (awk->rwtab, QSE_MAP_KEY, QSE_MAP_COPIER_INLINE); qse_map_setcopier (awk->rwtab, QSE_MAP_VAL, QSE_MAP_COPIER_INLINE); qse_map_setscale (awk->rwtab, QSE_MAP_KEY, QSE_SIZEOF(qse_char_t)); @@ -96,21 +111,21 @@ qse_awk_t* qse_awk_open (qse_mmgr_t* mmgr, qse_size_t xtn, qse_ccls_t* ccls) /* TODO: initial map size?? */ awk->tree.funs = qse_map_open (mmgr, QSE_SIZEOF(awk), 512, 70); if (awk->tree.funs == QSE_NULL) goto oops; - *(qse_awk_t**)qse_map_getxtn(awk->tree.funs) = awk; + *(qse_awk_t**)QSE_XTN(awk->tree.funs) = awk; qse_map_setcopier (awk->tree.funs, QSE_MAP_KEY, QSE_MAP_COPIER_INLINE); qse_map_setfreeer (awk->tree.funs, QSE_MAP_VAL, free_fun); qse_map_setscale (awk->tree.funs, QSE_MAP_KEY, QSE_SIZEOF(qse_char_t)); awk->parse.funs = qse_map_open (mmgr, QSE_SIZEOF(awk), 256, 70); if (awk->parse.funs == QSE_NULL) goto oops; - *(qse_awk_t**)qse_map_getxtn(awk->parse.funs) = awk; + *(qse_awk_t**)QSE_XTN(awk->parse.funs) = awk; qse_map_setcopier (awk->parse.funs, QSE_MAP_KEY, QSE_MAP_COPIER_INLINE); qse_map_setcopier (awk->parse.funs, QSE_MAP_VAL, QSE_MAP_COPIER_INLINE); qse_map_setscale (awk->parse.funs, QSE_MAP_KEY, QSE_SIZEOF(qse_char_t)); awk->parse.named = qse_map_open (mmgr, QSE_SIZEOF(awk), 256, 70); if (awk->parse.named == QSE_NULL) goto oops; - *(qse_awk_t**)qse_map_getxtn(awk->parse.named) = awk; + *(qse_awk_t**)QSE_XTN(awk->parse.named) = awk; qse_map_setcopier (awk->parse.named, QSE_MAP_KEY, QSE_MAP_COPIER_INLINE); qse_map_setcopier (awk->parse.named, QSE_MAP_VAL, QSE_MAP_COPIER_INLINE); qse_map_setscale (awk->parse.named, QSE_MAP_KEY, QSE_SIZEOF(qse_char_t)); @@ -123,15 +138,15 @@ qse_awk_t* qse_awk_open (qse_mmgr_t* mmgr, qse_size_t xtn, qse_ccls_t* ccls) awk->parse.lcls == QSE_NULL || awk->parse.params == QSE_NULL) goto oops; - *(qse_awk_t**)qse_lda_getxtn(awk->parse.gbls) = awk; + *(qse_awk_t**)QSE_XTN(awk->parse.gbls) = awk; qse_lda_setcopier (awk->parse.gbls, QSE_LDA_COPIER_INLINE); qse_lda_setscale (awk->parse.gbls, QSE_SIZEOF(qse_char_t)); - *(qse_awk_t**)qse_lda_getxtn(awk->parse.lcls) = awk; + *(qse_awk_t**)QSE_XTN(awk->parse.lcls) = awk; qse_lda_setcopier (awk->parse.lcls, QSE_LDA_COPIER_INLINE); qse_lda_setscale (awk->parse.lcls, QSE_SIZEOF(qse_char_t)); - *(qse_awk_t**)qse_lda_getxtn(awk->parse.params) = awk; + *(qse_awk_t**)QSE_XTN(awk->parse.params) = awk; qse_lda_setcopier (awk->parse.params, QSE_LDA_COPIER_INLINE); qse_lda_setscale (awk->parse.params, QSE_SIZEOF(qse_char_t)); @@ -169,7 +184,7 @@ qse_awk_t* qse_awk_open (qse_mmgr_t* mmgr, qse_size_t xtn, qse_ccls_t* ccls) awk->fnc.sys = QSE_NULL; awk->fnc.user = qse_map_open (mmgr, QSE_SIZEOF(awk), 512, 70); if (awk->fnc.user == QSE_NULL) goto oops; - *(qse_awk_t**)qse_map_getxtn(awk->fnc.user) = awk; + *(qse_awk_t**)QSE_XTN(awk->fnc.user) = awk; qse_map_setcopier (awk->fnc.user, QSE_MAP_KEY, QSE_MAP_COPIER_INLINE); qse_map_setfreeer (awk->fnc.user, QSE_MAP_VAL, free_fnc); qse_map_setscale (awk->fnc.user, QSE_MAP_KEY, QSE_SIZEOF(qse_char_t)); @@ -329,28 +344,14 @@ void qse_awk_setmmgr (qse_awk_t* awk, qse_mmgr_t* mmgr) awk->mmgr = mmgr; } -qse_ccls_t* qse_awk_getccls (qse_awk_t* awk) -{ - return awk->ccls; -} - -void qse_awk_setccls (qse_awk_t* awk, qse_ccls_t* ccls) -{ - QSE_ASSERT (ccls->is != QSE_NULL); - QSE_ASSERT (ccls->to != QSE_NULL); - awk->ccls = ccls; -} - qse_awk_prm_t* qse_awk_getprm (qse_awk_t* awk) { return &awk->prm; } -void qse_awk_setprm (qse_awk_t* awk, qse_awk_prm_t* prm) +qse_ccls_t* qse_awk_getccls (qse_awk_t* awk) { - QSE_ASSERT (prm->pow != QSE_NULL); - QSE_ASSERT (prm->sprintf != QSE_NULL); - awk->prm = *prm; + return &awk->ccls; } int qse_awk_getoption (qse_awk_t* awk) @@ -446,20 +447,3 @@ int qse_awk_setword (qse_awk_t* awk, return 0; } -#if 0 -/* TODO: qse_awk_setrexfns... */ -int qse_awk_setrexfns (qse_awk_t* awk, qse_awk_rexfns_t* rexfns) -{ - if (rexfns->build == QSE_NULL || - rexfns->match == QSE_NULL || - rexfns->free == QSE_NULL || - rexfns->isempty == QSE_NULL) - { - SETERR (awk, QSE_AWK_EINVAL); - return -1; - } - - awk->rexfns = rexfns; - return 0; -} -#endif diff --git a/qse/lib/awk/awk.h b/qse/lib/awk/awk.h index 852d8cc8..117448d6 100644 --- a/qse/lib/awk/awk.h +++ b/qse/lib/awk/awk.h @@ -46,19 +46,19 @@ typedef struct qse_awk_tree_t qse_awk_tree_t; #define QSE_AWK_REALLOC(awk,ptr,size) QSE_MMGR_REALLOC((awk)->mmgr,ptr,size) #define QSE_AWK_FREE(awk,ptr) QSE_MMGR_FREE((awk)->mmgr,ptr) -#define QSE_AWK_ISUPPER(awk,c) QSE_CCLS_ISUPPER((awk)->ccls,c) -#define QSE_AWK_ISLOWER(awk,c) QSE_CCLS_ISLOWER((awk)->ccls,c) -#define QSE_AWK_ISALPHA(awk,c) QSE_CCLS_ISALPHA((awk)->ccls,c) -#define QSE_AWK_ISDIGIT(awk,c) QSE_CCLS_ISDIGIT((awk)->ccls,c) -#define QSE_AWK_ISXDIGIT(awk,c) QSE_CCLS_ISXDIGIT((awk)->ccls,c) -#define QSE_AWK_ISALNUM(awk,c) QSE_CCLS_ISALNUM((awk)->ccls,c) -#define QSE_AWK_ISSPACE(awk,c) QSE_CCLS_ISSPACE((awk)->ccls,c) -#define QSE_AWK_ISPRINT(awk,c) QSE_CCLS_ISPRINT((awk)->ccls,c) -#define QSE_AWK_ISGRAPH(awk,c) QSE_CCLS_ISGRAPH((awk)->ccls,c) -#define QSE_AWK_ISCNTRL(awk,c) QSE_CCLS_ISCNTRL((awk)->ccls,c) -#define QSE_AWK_ISPUNCT(awk,c) QSE_CCLS_ISPUNCT((awk)->ccls,c) -#define QSE_AWK_TOUPPER(awk,c) QSE_CCLS_TOUPPER((awk)->ccls,c) -#define QSE_AWK_TOLOWER(awk,c) QSE_CCLS_TOLOWER((awk)->ccls,c) +#define QSE_AWK_ISUPPER(awk,c) awk->prm.isccls(awk,c,QSE_CCLS_UPPER) +#define QSE_AWK_ISLOWER(awk,c) awk->prm.isccls(awk,c,QSE_CCLS_UPPER) +#define QSE_AWK_ISALPHA(awk,c) awk->prm.isccls(awk,c,QSE_CCLS_ALPHA) +#define QSE_AWK_ISDIGIT(awk,c) awk->prm.isccls(awk,c,QSE_CCLS_DIGIT) +#define QSE_AWK_ISXDIGIT(awk,c) awk->prm.isccls(awk,c,QSE_CCLS_XDIGIT) +#define QSE_AWK_ISALNUM(awk,c) awk->prm.isccls(awk,c,QSE_CCLS_ALNUM) +#define QSE_AWK_ISSPACE(awk,c) awk->prm.isccls(awk,c,QSE_CCLS_SPACE) +#define QSE_AWK_ISPRINT(awk,c) awk->prm.isccls(awk,c,QSE_CCLS_PRINT) +#define QSE_AWK_ISGRAPH(awk,c) awk->prm.isccls(awk,c,QSE_CCLS_GRAPH) +#define QSE_AWK_ISCNTRL(awk,c) awk->prm.isccls(awk,c,QSE_CCLS_CNTRL) +#define QSE_AWK_ISPUNCT(awk,c) awk->prm.isccls(awk,c,QSE_CCLS_PUNCT) +#define QSE_AWK_TOUPPER(awk,c) awk->prm.toccls(awk,c,QSE_CCLS_UPPER) +#define QSE_AWK_TOLOWER(awk,c) awk->prm.toccls(awk,c,QSE_CCLS_LOWER) #define QSE_AWK_STRDUP(awk,str) (qse_strdup(str,(awk)->mmgr)) #define QSE_AWK_STRXDUP(awk,str,len) (qse_strxdup(str,len,(awk)->mmgr)) @@ -85,10 +85,17 @@ struct qse_awk_tree_t struct qse_awk_t { + /* memory manager */ qse_mmgr_t* mmgr; - qse_ccls_t* ccls; + + /* primitive functions */ qse_awk_prm_t prm; + /* character classifier composed from primitive functions. + * it is used in calling some functions that require a character + * classifier */ + qse_ccls_t ccls; + /* options */ int option; @@ -97,9 +104,6 @@ struct qse_awk_t /* reverse word table */ qse_map_t* rwtab; - /* regular expression processing routines */ - qse_awk_rexfns_t* rexfns; - /* parse tree */ qse_awk_tree_t tree; diff --git a/qse/lib/awk/misc.c b/qse/lib/awk/misc.c index cf3ce8bd..897e4c55 100644 --- a/qse/lib/awk/misc.c +++ b/qse/lib/awk/misc.c @@ -961,7 +961,7 @@ int qse_awk_matchrex ( int err, x; x = qse_matchrex ( - awk->mmgr, awk->ccls, awk->rex.depth.max.match, + awk->mmgr, &awk->ccls, awk->rex.depth.max.match, code, option, str, len, match_ptr, match_len, &err); if (x < 0) *errnum = QSE_AWK_REXERRTOERR(err); return x; diff --git a/qse/lib/awk/parse.c b/qse/lib/awk/parse.c index 5ea71454..59ec65a6 100644 --- a/qse/lib/awk/parse.c +++ b/qse/lib/awk/parse.c @@ -469,8 +469,6 @@ int qse_awk_parse (qse_awk_t* awk, qse_awk_sio_t* sio) { int n; - QSE_ASSERTX (awk->ccls != QSE_NULL, "Call qse_setccls() first"); - QSE_ASSERTX ( sio != QSE_NULL && sio->in != QSE_NULL, "the source code input stream must be provided at least"); @@ -496,7 +494,7 @@ static int parse (qse_awk_t* awk) QSE_ASSERT (awk->src.ios.in != QSE_NULL); CLRERR (awk); - op = awk->src.ios.in (awk, QSE_AWK_IO_OPEN, QSE_NULL, 0); + op = awk->src.ios.in (awk, QSE_AWK_SIO_OPEN, QSE_NULL, 0); if (op <= -1) { /* cannot open the source file. @@ -567,7 +565,7 @@ static int parse (qse_awk_t* awk) #undef EXIT_PARSE exit_parse: if (n == 0) CLRERR (awk); - if (awk->src.ios.in (awk, QSE_AWK_IO_CLOSE, QSE_NULL, 0) != 0) + if (awk->src.ios.in (awk, QSE_AWK_SIO_CLOSE, QSE_NULL, 0) != 0) { if (n == 0) { @@ -1421,7 +1419,7 @@ struct check_global_t static qse_lda_walk_t check_global (qse_lda_t* lda, qse_size_t index, void* arg) { qse_cstr_t tmp; - qse_awk_t* awk = *(qse_awk_t**)qse_lda_getxtn(lda); + qse_awk_t* awk = *(qse_awk_t**)QSE_XTN(lda); check_global_t* cg = (check_global_t*)arg; tmp.ptr = QSE_LDA_DPTR(lda,index); @@ -5276,7 +5274,7 @@ static int get_char (qse_awk_t* awk) { CLRERR (awk); n = awk->src.ios.in ( - awk, QSE_AWK_IO_READ, + awk, QSE_AWK_SIO_READ, awk->src.shared.buf, QSE_COUNTOF(awk->src.shared.buf) ); if (n <= -1) @@ -5578,7 +5576,7 @@ static int deparse (qse_awk_t* awk) awk->src.shared.buf_pos = 0; CLRERR (awk); - op = awk->src.ios.out (awk, QSE_AWK_IO_OPEN, QSE_NULL, 0); + op = awk->src.ios.out (awk, QSE_AWK_SIO_OPEN, QSE_NULL, 0); if (op <= -1) { if (ISNOERR(awk)) SETERR (awk, QSE_AWK_ESOUTOP); @@ -5783,7 +5781,7 @@ static int deparse (qse_awk_t* awk) exit_deparse: if (n == 0) CLRERR (awk); - if (awk->src.ios.out (awk, QSE_AWK_IO_CLOSE, QSE_NULL, 0) != 0) + if (awk->src.ios.out (awk, QSE_AWK_SIO_CLOSE, QSE_NULL, 0) != 0) { if (n == 0) { @@ -5880,7 +5878,7 @@ static int flush_out (qse_awk_t* awk) CLRERR (awk); n = awk->src.ios.out ( - awk, QSE_AWK_IO_WRITE, + awk, QSE_AWK_SIO_WRITE, &awk->src.shared.buf[awk->src.shared.buf_pos], awk->src.shared.buf_len - awk->src.shared.buf_pos ); diff --git a/qse/lib/awk/rio.c b/qse/lib/awk/rio.c index 669f504b..60c9bf0a 100644 --- a/qse/lib/awk/rio.c +++ b/qse/lib/awk/rio.c @@ -146,7 +146,6 @@ int qse_awk_rtx_readio ( return -1; } - /*p->rtx = run;*/ p->type = (io_type | io_mask); p->mode = io_mode; p->handle = QSE_NULL; @@ -161,7 +160,7 @@ int qse_awk_rtx_readio ( qse_awk_rtx_seterrnum (run, QSE_AWK_ENOERR); /* request to open the stream */ - x = handler (run, QSE_AWK_IO_OPEN, p, QSE_NULL, 0); + x = handler (run, QSE_AWK_RIO_OPEN, p, QSE_NULL, 0); if (x <= -1) { QSE_AWK_FREE (run->awk, p->name); @@ -244,7 +243,7 @@ int qse_awk_rtx_readio ( qse_awk_rtx_seterrnum (run, QSE_AWK_ENOERR); - n = handler (run, QSE_AWK_IO_READ, + n = handler (run, QSE_AWK_RIO_READ, p, p->in.buf, QSE_COUNTOF(p->in.buf)); if (n <= -1) { @@ -503,7 +502,6 @@ int qse_awk_rtx_writeio_str ( return -1; } - /*p->rtx = run;*/ p->type = (io_type | io_mask); p->mode = io_mode; p->handle = QSE_NULL; @@ -513,7 +511,7 @@ int qse_awk_rtx_writeio_str ( p->out.eos = QSE_FALSE; qse_awk_rtx_seterrnum (run, QSE_AWK_ENOERR); - n = handler (run, QSE_AWK_IO_OPEN, p, QSE_NULL, 0); + n = handler (run, QSE_AWK_RIO_OPEN, p, QSE_NULL, 0); if (n <= -1) { QSE_AWK_FREE (run->awk, p->name); @@ -557,7 +555,7 @@ int qse_awk_rtx_writeio_str ( while (len > 0) { qse_awk_rtx_seterrnum (run, QSE_AWK_ENOERR); - n = handler (run, QSE_AWK_IO_WRITE, p, str, len); + n = handler (run, QSE_AWK_RIO_WRITE, p, str, len); if (n <= -1) { if (run->errnum == QSE_AWK_ENOERR) @@ -612,7 +610,7 @@ int qse_awk_rtx_flushio ( (name == QSE_NULL || qse_strcmp(p->name,name) == 0)) { qse_awk_rtx_seterrnum (run, QSE_AWK_ENOERR); - n = handler (run, QSE_AWK_IO_FLUSH, p, QSE_NULL, 0); + n = handler (run, QSE_AWK_RIO_FLUSH, p, QSE_NULL, 0); if (n <= -1) { @@ -682,7 +680,7 @@ int qse_awk_rtx_nextio_read ( } qse_awk_rtx_seterrnum (run, QSE_AWK_ENOERR); - n = handler (run, QSE_AWK_IO_NEXT, p, QSE_NULL, 0); + n = handler (run, QSE_AWK_RIO_NEXT, p, QSE_NULL, 0); if (n <= -1) { if (run->errnum == QSE_AWK_ENOERR) @@ -760,7 +758,7 @@ int qse_awk_rtx_nextio_write ( } qse_awk_rtx_seterrnum (run, QSE_AWK_ENOERR); - n = handler (run, QSE_AWK_IO_NEXT, p, QSE_NULL, 0); + n = handler (run, QSE_AWK_RIO_NEXT, p, QSE_NULL, 0); if (n <= -1) { if (run->errnum == QSE_AWK_ENOERR) @@ -819,7 +817,7 @@ int qse_awk_rtx_closio_read ( handler = run->rio.handler[p->type & MASK_CLEAR]; if (handler != QSE_NULL) { - if (handler (run, QSE_AWK_IO_CLOSE, p, QSE_NULL, 0) <= -1) + if (handler (run, QSE_AWK_RIO_CLOSE, p, QSE_NULL, 0) <= -1) { /* this is not a run-time error.*/ qse_awk_rtx_seterror (run, QSE_AWK_EIOIMPL, 0, QSE_NULL); @@ -879,7 +877,7 @@ int qse_awk_rtx_closio_write ( if (handler != QSE_NULL) { qse_awk_rtx_seterrnum (run, QSE_AWK_ENOERR); - if (handler (run, QSE_AWK_IO_CLOSE, p, QSE_NULL, 0) <= -1) + if (handler (run, QSE_AWK_RIO_CLOSE, p, QSE_NULL, 0) <= -1) { if (run->errnum == QSE_AWK_ENOERR) qse_awk_rtx_seterrnum (run, QSE_AWK_EIOIMPL); @@ -919,7 +917,7 @@ int qse_awk_rtx_closeio (qse_awk_rtx_t* run, const qse_char_t* name) if (handler != QSE_NULL) { qse_awk_rtx_seterrnum (run, QSE_AWK_ENOERR); - if (handler (run, QSE_AWK_IO_CLOSE, p, QSE_NULL, 0) <= -1) + if (handler (run, QSE_AWK_RIO_CLOSE, p, QSE_NULL, 0) <= -1) { /* this is not a run-time error.*/ if (run->errnum == QSE_AWK_ENOERR) @@ -960,7 +958,7 @@ void qse_awk_rtx_cleario (qse_awk_rtx_t* run) if (handler != QSE_NULL) { qse_awk_rtx_seterrnum (run, QSE_AWK_ENOERR); - n = handler (run, QSE_AWK_IO_CLOSE, run->rio.chain, QSE_NULL, 0); + n = handler (run, QSE_AWK_RIO_CLOSE, run->rio.chain, QSE_NULL, 0); if (n <= -1) { if (run->errnum == QSE_AWK_ENOERR) diff --git a/qse/lib/awk/run.c b/qse/lib/awk/run.c index 1ac35a06..9d4a4335 100644 --- a/qse/lib/awk/run.c +++ b/qse/lib/awk/run.c @@ -29,7 +29,6 @@ #define IDXBUFSIZE 64 #define MMGR(run) ((run)->awk->mmgr) -#define CCLS(run) ((run)->awk->ccls) #define STACK_AT(run,n) ((run)->stack[(run)->stack_base+(n)]) #define STACK_NARGS(run) (STACK_AT(run,3)) @@ -617,7 +616,7 @@ int qse_awk_rtx_setofilename ( void* qse_awk_rtx_getxtn (qse_awk_rtx_t* rtx) { - return (void*)(rtx + 1); + return QSE_XTN(rtx); } qse_awk_t* qse_awk_rtx_getawk (qse_awk_rtx_t* rtx) @@ -627,7 +626,7 @@ qse_awk_t* qse_awk_rtx_getawk (qse_awk_rtx_t* rtx) qse_mmgr_t* qse_awk_rtx_getmmgr (qse_awk_rtx_t* rtx) { - return rtx->awk->mmgr; + return MMGR(rtx); } qse_map_t* qse_awk_rtx_getnvmap (qse_awk_rtx_t* rtx) @@ -641,9 +640,10 @@ qse_awk_rtx_t* qse_awk_rtx_open ( { qse_awk_rtx_t* rtx; - QSE_ASSERTX (awk->ccls != QSE_NULL, "Call qse_awk_setccls() first"); QSE_ASSERTX (awk->prm.pow != QSE_NULL, "Call qse_awk_setprm() first"); QSE_ASSERTX (awk->prm.sprintf != QSE_NULL, "Call qse_awk_setprm() first"); + QSE_ASSERTX (awk->prm.isccls != QSE_NULL, "Call qse_awk_setprm() first"); + QSE_ASSERTX (awk->prm.toccls != QSE_NULL, "Call qse_awk_setprm() first"); /* clear the awk error code */ qse_awk_seterror (awk, QSE_AWK_ENOERR, 0, QSE_NULL); @@ -723,13 +723,13 @@ void qse_awk_rtx_setrcb (qse_awk_rtx_t* rtx, qse_awk_rcb_t* rcb) static void free_namedval (qse_map_t* map, void* dptr, qse_size_t dlen) { qse_awk_rtx_refdownval ( - *(qse_awk_rtx_t**)qse_map_getxtn(map), dptr); + *(qse_awk_rtx_t**)QSE_XTN(map), dptr); } static void same_namedval (qse_map_t* map, void* dptr, qse_size_t dlen) { qse_awk_rtx_refdownval_nofree ( - *(qse_awk_rtx_t**)qse_map_getxtn(map), dptr); + *(qse_awk_rtx_t**)QSE_XTN(map), dptr); } static int init_rtx (qse_awk_rtx_t* rtx, qse_awk_t* awk, qse_awk_rio_t* rio) @@ -796,7 +796,7 @@ static int init_rtx (qse_awk_rtx_t* rtx, qse_awk_t* awk, qse_awk_rio_t* rio) qse_awk_seterror (awk, QSE_AWK_ENOMEM, 0, QSE_NULL); return -1; } - *(qse_awk_rtx_t**)qse_map_getxtn(rtx->named) = rtx; + *(qse_awk_rtx_t**)QSE_XTN(rtx->named) = rtx; qse_map_setcopier (rtx->named, QSE_MAP_KEY, QSE_MAP_COPIER_INLINE); qse_map_setfreeer (rtx->named, QSE_MAP_VAL, free_namedval); qse_map_setkeeper (rtx->named, same_namedval); @@ -1430,16 +1430,21 @@ static int run_bpae_loop (qse_awk_rtx_t* rtx) * for BEGIN/pattern action/END block execution.*/ nargs = (qse_size_t)STACK_NARGS(rtx); QSE_ASSERT (nargs == 0); - for (i = 0; i < nargs; i++) qse_awk_rtx_refdownval (rtx, STACK_ARG(rtx,i)); + for (i = 0; i < nargs; i++) + qse_awk_rtx_refdownval (rtx, STACK_ARG(rtx,i)); /* get the return value in the current stack frame */ v = STACK_RETVAL(rtx); - if (ret == 0) + + if (rtx->rcb.on_exit != QSE_NULL) { - if (rtx->rcb.on_exit != QSE_NULL) - rtx->rcb.on_exit (rtx, v, rtx->rcb.data); + /* we call the on_exit handler regardless of ret. + * the return value passed is the global return value + * in the stack. */ + rtx->rcb.on_exit (rtx, v, rtx->rcb.data); } - /* end the life of the gbl return value */ + + /* end the life of the global return value */ qse_awk_rtx_refdownval (rtx, v); return ret; @@ -4042,7 +4047,7 @@ static int __cmp_int_str ( str, len, ((qse_awk_val_str_t*)right)->ptr, ((qse_awk_val_str_t*)right)->len, - CCLS(run)); + &run->awk->ccls); } else { @@ -4114,7 +4119,7 @@ static int __cmp_real_str ( str, len, ((qse_awk_val_str_t*)right)->ptr, ((qse_awk_val_str_t*)right)->len, - CCLS(run)); + &run->awk->ccls); } else { @@ -4158,7 +4163,8 @@ static int __cmp_str_str ( if (run->gbl.ignorecase) { n = qse_strxncasecmp ( - ls->ptr, ls->len, rs->ptr, rs->len, CCLS(run)); + ls->ptr, ls->len, rs->ptr, rs->len, + &run->awk->ccls); } else { diff --git a/qse/lib/awk/std.c b/qse/lib/awk/std.c index e2999b45..3ed1c1b9 100644 --- a/qse/lib/awk/std.c +++ b/qse/lib/awk/std.c @@ -93,6 +93,20 @@ static int custom_awk_sprintf ( return n; } +static qse_bool_t custom_awk_isccls ( + qse_awk_t* awk, qse_cint_t c, qse_ccls_id_t id) +{ + qse_ccls_t* ccls = QSE_CCLS_GETDFL(); + return ccls->is (ccls->data, c, id); +} + +static qse_cint_t custom_awk_toccls ( + qse_awk_t* awk, qse_cint_t c, qse_ccls_id_t id) +{ + qse_ccls_t* ccls = QSE_CCLS_GETDFL(); + return ccls->to (ccls->data, c, id); +} + static int add_functions (qse_awk_t* awk); qse_awk_t* qse_awk_opensimple (void) @@ -101,23 +115,19 @@ qse_awk_t* qse_awk_opensimple (void) qse_awk_prm_t prm; xtn_t* xtn; + prm.pow = custom_awk_pow; + prm.sprintf = custom_awk_sprintf; + prm.isccls = custom_awk_isccls; + prm.toccls = custom_awk_toccls; + /* create an object */ - awk = qse_awk_open ( - QSE_MMGR_GETDFL(), - QSE_SIZEOF(xtn_t), - QSE_CCLS_GETDFL() - ); + awk = qse_awk_open (QSE_MMGR_GETDFL(), QSE_SIZEOF(xtn_t), &prm); if (awk == QSE_NULL) return QSE_NULL; /* initialize extension */ - xtn = (xtn_t*) qse_awk_getxtn (awk); + xtn = (xtn_t*) QSE_XTN (awk); QSE_MEMSET (xtn, 0, QSE_SIZEOF(xtn_t)); - /* set primitive functions */ - prm.pow = custom_awk_pow; - prm.sprintf = custom_awk_sprintf; - qse_awk_setprm (awk, &prm); - /* set default options */ qse_awk_setoption (awk, QSE_AWK_IMPLICIT | QSE_AWK_RIO | QSE_AWK_NEWLINE | @@ -135,11 +145,13 @@ qse_awk_t* qse_awk_opensimple (void) /*** PARSESIMPLE ***/ -static qse_ssize_t sf_in (qse_awk_t* awk, int cmd, qse_char_t* data, qse_size_t size) +static qse_ssize_t sf_in ( + qse_awk_t* awk, qse_awk_sio_cmd_t cmd, + qse_char_t* data, qse_size_t size) { - xtn_t* xtn = qse_awk_getxtn (awk); + xtn_t* xtn = QSE_XTN (awk); - if (cmd == QSE_AWK_IO_OPEN) + if (cmd == QSE_AWK_SIO_OPEN) { if (xtn->s.in.type == QSE_AWK_PARSE_FILES) { @@ -167,7 +179,7 @@ static qse_ssize_t sf_in (qse_awk_t* awk, int cmd, qse_char_t* data, qse_size_t return 1; } - else if (cmd == QSE_AWK_IO_CLOSE) + else if (cmd == QSE_AWK_SIO_CLOSE) { if (xtn->s.in.handle != QSE_NULL && xtn->s.in.handle != qse_sio_in && @@ -179,7 +191,7 @@ static qse_ssize_t sf_in (qse_awk_t* awk, int cmd, qse_char_t* data, qse_size_t return 0; } - else if (cmd == QSE_AWK_IO_READ) + else if (cmd == QSE_AWK_SIO_READ) { qse_ssize_t n = 0; @@ -231,11 +243,13 @@ static qse_ssize_t sf_in (qse_awk_t* awk, int cmd, qse_char_t* data, qse_size_t return -1; } -static qse_ssize_t sf_out (qse_awk_t* awk, int cmd, qse_char_t* data, qse_size_t size) +static qse_ssize_t sf_out ( + qse_awk_t* awk, qse_awk_sio_cmd_t cmd, + qse_char_t* data, qse_size_t size) { - xtn_t* xtn = qse_awk_getxtn (awk); + xtn_t* xtn = QSE_XTN (awk); - if (cmd == QSE_AWK_IO_OPEN) + if (cmd == QSE_AWK_SIO_OPEN) { if (xtn->s.out.file[0] == QSE_T('\0')) { @@ -254,7 +268,7 @@ static qse_ssize_t sf_out (qse_awk_t* awk, int cmd, qse_char_t* data, qse_size_t return 1; } - else if (cmd == QSE_AWK_IO_CLOSE) + else if (cmd == QSE_AWK_SIO_CLOSE) { if (xtn->s.out.handle != QSE_NULL) { @@ -269,7 +283,7 @@ static qse_ssize_t sf_out (qse_awk_t* awk, int cmd, qse_char_t* data, qse_size_t return 0; } - else if (cmd == QSE_AWK_IO_WRITE) + else if (cmd == QSE_AWK_SIO_WRITE) { /* qse_size_t left = size; @@ -302,7 +316,7 @@ int qse_awk_parsesimple ( qse_awk_t* awk, int ist, const void* isp, const qse_char_t* osf) { qse_awk_sio_t sio; - xtn_t* xtn = (xtn_t*) qse_awk_getxtn (awk); + xtn_t* xtn = (xtn_t*) QSE_XTN (awk); if (isp == QSE_NULL) { @@ -340,12 +354,12 @@ int qse_awk_parsesimple ( /*** RUNSIMPLE ***/ static qse_ssize_t awk_rio_pipe ( - qse_awk_rtx_t* rtx, int cmd, qse_awk_riod_t* riod, + qse_awk_rtx_t* rtx, qse_awk_rio_cmd_t cmd, qse_awk_riod_t* riod, qse_char_t* data, qse_size_t size) { switch (cmd) { - case QSE_AWK_IO_OPEN: + case QSE_AWK_RIO_OPEN: { qse_pio_t* handle; int flags; @@ -382,7 +396,7 @@ static qse_ssize_t awk_rio_pipe ( return 1; } - case QSE_AWK_IO_CLOSE: + case QSE_AWK_RIO_CLOSE: { /*dprint (QSE_T("closing %s of type (pipe) %d\n"), riod->name, riod->type);*/ qse_pio_close ((qse_pio_t*)riod->handle); @@ -390,7 +404,7 @@ static qse_ssize_t awk_rio_pipe ( return 0; } - case QSE_AWK_IO_READ: + case QSE_AWK_RIO_READ: { return qse_pio_read ( (qse_pio_t*)riod->handle, @@ -400,7 +414,7 @@ static qse_ssize_t awk_rio_pipe ( ); } - case QSE_AWK_IO_WRITE: + case QSE_AWK_RIO_WRITE: { return qse_pio_write ( (qse_pio_t*)riod->handle, @@ -410,13 +424,13 @@ static qse_ssize_t awk_rio_pipe ( ); } - case QSE_AWK_IO_FLUSH: + case QSE_AWK_RIO_FLUSH: { /*if (riod->mode == QSE_AWK_RIO_PIPE_READ) return -1;*/ return qse_pio_flush ((qse_pio_t*)riod->handle, QSE_PIO_IN); } - case QSE_AWK_IO_NEXT: + case QSE_AWK_RIO_NEXT: { return -1; } @@ -426,12 +440,12 @@ static qse_ssize_t awk_rio_pipe ( } static qse_ssize_t awk_rio_file ( - qse_awk_rtx_t* rtx, int cmd, qse_awk_riod_t* riod, + qse_awk_rtx_t* rtx, qse_awk_rio_cmd_t cmd, qse_awk_riod_t* riod, qse_char_t* data, qse_size_t size) { switch (cmd) { - case QSE_AWK_IO_OPEN: + case QSE_AWK_RIO_OPEN: { qse_fio_t* handle; int flags; @@ -477,7 +491,7 @@ static qse_ssize_t awk_rio_file ( return 1; } - case QSE_AWK_IO_CLOSE: + case QSE_AWK_RIO_CLOSE: { /*dprint (QSE_T("closing %s of type %d (file)\n"), riod->name, riod->type);*/ qse_fio_close ((qse_fio_t*)riod->handle); @@ -485,7 +499,7 @@ static qse_ssize_t awk_rio_file ( return 0; } - case QSE_AWK_IO_READ: + case QSE_AWK_RIO_READ: { return qse_fio_read ( (qse_fio_t*)riod->handle, @@ -494,7 +508,7 @@ static qse_ssize_t awk_rio_file ( ); } - case QSE_AWK_IO_WRITE: + case QSE_AWK_RIO_WRITE: { return qse_fio_write ( (qse_fio_t*)riod->handle, @@ -503,12 +517,12 @@ static qse_ssize_t awk_rio_file ( ); } - case QSE_AWK_IO_FLUSH: + case QSE_AWK_RIO_FLUSH: { return qse_fio_flush ((qse_fio_t*)riod->handle); } - case QSE_AWK_IO_NEXT: + case QSE_AWK_RIO_NEXT: { return -1; } @@ -520,7 +534,7 @@ static qse_ssize_t awk_rio_file ( static int open_rio_console (qse_awk_rtx_t* rtx, qse_awk_riod_t* riod) { - rxtn_t* rxtn = (rxtn_t*) qse_awk_rtx_getxtn (rtx); + rxtn_t* rxtn = (rxtn_t*) QSE_XTN (rtx); /*dprint (QSE_T("opening console[%s] of type %x\n"), riod->name, riod->type);*/ @@ -593,16 +607,16 @@ static int open_rio_console (qse_awk_rtx_t* rtx, qse_awk_riod_t* riod) } static qse_ssize_t awk_rio_console ( - qse_awk_rtx_t* rtx, int cmd, qse_awk_riod_t* riod, + qse_awk_rtx_t* rtx, qse_awk_rio_cmd_t cmd, qse_awk_riod_t* riod, qse_char_t* data, qse_size_t size) { - rxtn_t* rxtn = (rxtn_t*) qse_awk_rtx_getxtn (rtx); + rxtn_t* rxtn = (rxtn_t*) QSE_XTN (rtx); - if (cmd == QSE_AWK_IO_OPEN) + if (cmd == QSE_AWK_RIO_OPEN) { return open_rio_console (rtx, riod); } - else if (cmd == QSE_AWK_IO_CLOSE) + else if (cmd == QSE_AWK_RIO_CLOSE) { /*dprint (QSE_T("closing console of type %x\n"), riod->type);*/ @@ -616,7 +630,7 @@ static qse_ssize_t awk_rio_console ( return 0; } - else if (cmd == QSE_AWK_IO_READ) + else if (cmd == QSE_AWK_RIO_READ) { qse_ssize_t n; @@ -697,7 +711,7 @@ static qse_ssize_t awk_rio_console ( return n; } - else if (cmd == QSE_AWK_IO_WRITE) + else if (cmd == QSE_AWK_RIO_WRITE) { return qse_sio_putsn ( (qse_sio_t*)riod->handle, @@ -705,11 +719,11 @@ static qse_ssize_t awk_rio_console ( size ); } - else if (cmd == QSE_AWK_IO_FLUSH) + else if (cmd == QSE_AWK_RIO_FLUSH) { return qse_sio_flush ((qse_sio_t*)riod->handle); } - else if (cmd == QSE_AWK_IO_NEXT) + else if (cmd == QSE_AWK_RIO_NEXT) { int n; qse_sio_t* fp = (qse_sio_t*)riod->handle; @@ -758,7 +772,7 @@ qse_awk_rtx_t* qse_awk_rtx_opensimple (qse_awk_t* awk, qse_char_t** icf) ); if (rtx == QSE_NULL) return QSE_NULL; - rxtn = (rxtn_t*) qse_awk_rtx_getxtn (rtx); + rxtn = (rxtn_t*) QSE_XTN (rtx); QSE_MEMSET (rxtn, 0, QSE_SIZEOF(rxtn_t)); if (qse_gettime (&now) == -1) rxtn->seed = 0; @@ -1061,7 +1075,7 @@ static int fnc_srand (qse_awk_rtx_t* run, const qse_char_t* fnm, qse_size_t fnl) unsigned int prev; rxtn_t* rxtn; - rxtn = (rxtn_t*)qse_awk_rtx_getxtn (run); + rxtn = (rxtn_t*) QSE_XTN (run); nargs = qse_awk_rtx_getnargs (run); QSE_ASSERT (nargs == 0 || nargs == 1); diff --git a/qse/lib/awk/val.c b/qse/lib/awk/val.c index 79e2782c..fff4da40 100644 --- a/qse/lib/awk/val.c +++ b/qse/lib/awk/val.c @@ -384,68 +384,41 @@ qse_awk_val_t* qse_awk_rtx_makerexval ( qse_awk_rtx_t* run, const qse_char_t* buf, qse_size_t len, void* code) { qse_awk_val_rex_t* val; + qse_size_t totsz; - val = (qse_awk_val_rex_t*) QSE_AWK_ALLOC ( - run->awk, QSE_SIZEOF(qse_awk_val_rex_t) + - (QSE_SIZEOF(*buf)*len+1) + QSE_REX_LEN(code)); - if (val == QSE_NULL) return QSE_NULL; + /* the regular expression value holds: + * header + * a raw string plus with added a terminating '\0' + * a compiled regular expression + * the total size is just large enough for all these. + */ + totsz = QSE_SIZEOF(qse_awk_val_rex_t) + + (QSE_SIZEOF(*buf) * (len + 1)) + + QSE_REX_LEN(code); + + val = (qse_awk_val_rex_t*) QSE_AWK_ALLOC (run->awk, totsz); + if (val == QSE_NULL) + { + qse_awk_rtx_seterrnum (run, QSE_AWK_ENOMEM); + return QSE_NULL; + } val->type = QSE_AWK_VAL_REX; val->ref = 0; val->len = len; - /* - val->ptr = QSE_AWK_STRXDUP (run->awk, buf, len); - if (val->ptr == QSE_NULL) - { - QSE_AWK_FREE (run->awk, val); - qse_awk_rtx_seterrnum (run, QSE_AWK_ENOMEM); - return QSE_NULL; - }*/ + val->ptr = (qse_char_t*)(val + 1); qse_strncpy (val->ptr, buf, len); - /* - val->code = QSE_AWK_ALLOC (run->awk, QSE_REX_LEN(code)); - if (val->code == QSE_NULL) - { - QSE_AWK_FREE (run->awk, val->ptr); - QSE_AWK_FREE (run->awk, val); - qse_awk_rtx_seterrnum (run, QSE_AWK_ENOMEM); - return QSE_NULL; - } - */ val->code = val->ptr + len + 1; QSE_MEMCPY (val->code, code, QSE_REX_LEN(code)); return (qse_awk_val_t*)val; } -/* CHECK */ -/* -static void free_mapval (void* run, void* v) -{ -#ifdef DEBUG_VAL - qse_dprintf (QSE_T("refdown in map free...")); - qse_awk_dprintval (run, v); - qse_dprintf (QSE_T("\n")); -#endif - - qse_awk_rtx_refdownval (run, v); -} - -static void same_mapval (void* run, void* v) -{ -#ifdef DEBUG_VAL - qse_dprintf (QSE_T("refdown nofree in map free...")); - qse_awk_dprintval (run, v); - qse_dprintf (QSE_T("\n")); -#endif - qse_awk_rtx_refdownval_nofree (run, v); -} -*/ static void free_mapval (qse_map_t* map, void* dptr, qse_size_t dlen) { - qse_awk_rtx_t* run = *(qse_awk_rtx_t**)qse_map_getxtn(map); + qse_awk_rtx_t* run = *(qse_awk_rtx_t**)QSE_XTN(map); #ifdef DEBUG_VAL qse_dprintf (QSE_T("refdown in map free...")); @@ -458,7 +431,7 @@ static void free_mapval (qse_map_t* map, void* dptr, qse_size_t dlen) static void same_mapval (qse_map_t* map, void* dptr, qse_size_t dlen) { - qse_awk_rtx_t* run = *(qse_awk_rtx_t**)qse_map_getxtn(map); + qse_awk_rtx_t* run = *(qse_awk_rtx_t**)QSE_XTN(map); #ifdef DEBUG_VAL qse_dprintf (QSE_T("refdown nofree in map free...")); qse_awk_dprintval (run, dptr); @@ -466,7 +439,6 @@ static void same_mapval (qse_map_t* map, void* dptr, qse_size_t dlen) #endif qse_awk_rtx_refdownval_nofree (run, dptr); } -/* END CHECK */ qse_awk_val_t* qse_awk_rtx_makemapval (qse_awk_rtx_t* run) { @@ -516,7 +488,7 @@ qse_awk_val_t* qse_awk_rtx_makemapval (qse_awk_rtx_t* run) qse_awk_rtx_seterrnum (run, QSE_AWK_ENOMEM); return QSE_NULL; } - *(qse_awk_rtx_t**)qse_map_getxtn(val->map) = run; + *(qse_awk_rtx_t**)QSE_XTN(val->map) = run; /* the key is copied inline into a pair and is freed when the pair * is destroyed */ @@ -569,7 +541,7 @@ qse_awk_val_t* qse_awk_rtx_makerefval (qse_awk_rtx_t* run, int id, qse_awk_val_t ((val) >= (qse_awk_val_t*)&awk_int[0] && \ (val) <= (qse_awk_val_t*)&awk_int[QSE_COUNTOF(awk_int)-1])) -qse_bool_t qse_awk_isstaticval (qse_awk_rtx_t* rtx, qse_awk_val_t* val) +qse_bool_t qse_awk_rtx_isstaticval (qse_awk_rtx_t* rtx, qse_awk_val_t* val) { return IS_STATICVAL(val); } @@ -1151,7 +1123,7 @@ static qse_map_walk_t print_pair ( { qse_awk_rtx_t* run = (qse_awk_rtx_t*)arg; - QSE_ASSERT (run == *(qse_awk_rtx_t**)qse_map_getxtn(map)); + QSE_ASSERT (run == *(qse_awk_rtx_t**)QSE_XTN(map)); DPRINTF (DCUSTOM, QSE_T(" %.*s=>"), (int)QSE_MAP_KLEN(pair), QSE_MAP_KPTR(pair)); diff --git a/qse/lib/cmn/chr.c b/qse/lib/cmn/chr.c index 590edca3..48514919 100644 --- a/qse/lib/cmn/chr.c +++ b/qse/lib/cmn/chr.c @@ -34,7 +34,7 @@ static qse_bool_t is_graph (qse_cint_t c) { return isgraph(c); } static qse_bool_t is_cntrl (qse_cint_t c) { return iscntrl(c); } static qse_bool_t is_punct (qse_cint_t c) { return ispunct(c); } -qse_bool_t qse_ccls_is (qse_cint_t c, qse_ccls_type_t type) +qse_bool_t qse_ccls_is (qse_cint_t c, qse_ccls_id_t type) { /* TODO: use GetStringTypeW/A for WIN32 to implement these */ @@ -54,11 +54,11 @@ qse_bool_t qse_ccls_is (qse_cint_t c, qse_ccls_type_t type) }; QSE_ASSERTX (type >= QSE_CCLS_UPPER && type <= QSE_CCLS_PUNCT, - "The character type should be one of qse_ccls_type_t values"); + "The character type should be one of qse_ccls_id_t values"); return f[type] (c); } -qse_cint_t qse_ccls_to (qse_cint_t c, qse_ccls_type_t type) +qse_cint_t qse_ccls_to (qse_cint_t c, qse_ccls_id_t type) { QSE_ASSERTX (type >= QSE_CCLS_UPPER && type <= QSE_CCLS_LOWER, "The character type should be one of QSE_CCLS_UPPER and QSE_CCLS_LOWER"); @@ -72,7 +72,7 @@ qse_cint_t qse_ccls_to (qse_cint_t c, qse_ccls_type_t type) #include -qse_bool_t qse_ccls_is (qse_cint_t c, qse_ccls_type_t type) +qse_bool_t qse_ccls_is (qse_cint_t c, qse_ccls_id_t type) { static const char* name[] = { @@ -105,13 +105,13 @@ qse_bool_t qse_ccls_is (qse_cint_t c, qse_ccls_type_t type) }; QSE_ASSERTX (type >= QSE_CCLS_UPPER && type <= QSE_CCLS_PUNCT, - "The character type should be one of qse_ccls_type_t values"); + "The character type should be one of qse_ccls_id_t values"); if (desc[type] == (wctype_t)0) desc[type] = wctype(name[type]); return iswctype (c, desc[type]); } -qse_cint_t qse_ccls_to (qse_cint_t c, qse_ccls_type_t type) +qse_cint_t qse_ccls_to (qse_cint_t c, qse_ccls_id_t type) { static const char* name[] = { @@ -136,12 +136,12 @@ qse_cint_t qse_ccls_to (qse_cint_t c, qse_ccls_type_t type) #error unsupported character type #endif -static qse_bool_t ccls_is (void* data, qse_cint_t c, qse_ccls_type_t type) +static qse_bool_t ccls_is (void* data, qse_cint_t c, qse_ccls_id_t type) { return qse_ccls_is (c, type); } -static qse_cint_t ccls_to (void* data, qse_cint_t c, qse_ccls_type_t type) +static qse_cint_t ccls_to (void* data, qse_cint_t c, qse_ccls_id_t type) { return qse_ccls_to (c, type); }