From 510bde2abc124e3a06f7f586fd041d440b183c37 Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Wed, 28 Aug 2019 14:01:28 +0000 Subject: [PATCH] qse_awk_addfncwithmbs(), qse_awk_addfncwithwcs(), qse_awk_delfncwithmbs(), qse_awk_delfncwithwcs() qse_awk_getmerrmsg(), qse_awk_getwerrmsg(), qse_awk_rtx_getmerrmsg(), qse_awk_rtx_getwerrmsg() --- qse/cmd/awk/awk.c | 2 +- qse/include/qse/awk/Awk.hpp | 40 ++++++-- qse/include/qse/awk/awk.h | 178 +++++++++++++++++++++++++++++------ qse/lib/awk/Awk.cpp | 112 +++++++++++++++++----- qse/lib/awk/awk-prv.h | 14 ++- qse/lib/awk/err.c | 70 +++++++++++++- qse/lib/awk/fnc.c | 182 ++++++++++++++++++++++++++++++++---- qse/lib/awk/fnc.h | 9 +- qse/lib/awk/misc.c | 66 +++++++++++-- qse/lib/awk/mod-str.c | 4 +- qse/lib/awk/parse.c | 10 +- qse/lib/awk/rec.c | 8 +- qse/lib/awk/run.c | 4 +- qse/lib/awk/val.c | 34 +++---- qse/lib/awkmod/mod-sed.c | 2 +- qse/lib/cmn/mbwc-str.c | 10 +- qse/regress/awk/regress.out | 48 +++++----- 17 files changed, 640 insertions(+), 153 deletions(-) diff --git a/qse/cmd/awk/awk.c b/qse/cmd/awk/awk.c index 99420b3c..9424fd98 100644 --- a/qse/cmd/awk/awk.c +++ b/qse/cmd/awk/awk.c @@ -225,7 +225,7 @@ static qse_htb_walk_t set_global (qse_htb_t* map, qse_htb_pair_t* pair, void* ar qse_awk_rtx_t* rtx = (qse_awk_rtx_t*)arg; struct gvmv_t* gvmv = (struct gvmv_t*)QSE_HTB_VPTR(pair); - v = qse_awk_rtx_makenstrvalwithxstr(rtx, &gvmv->str); + v = qse_awk_rtx_makenstrvalwithcstr(rtx, &gvmv->str); if (v == QSE_NULL) return QSE_HTB_WALK_STOP; qse_awk_rtx_refupval (rtx, v); diff --git a/qse/include/qse/awk/Awk.hpp b/qse/include/qse/awk/Awk.hpp index 26ba68e3..1b9f8a47 100644 --- a/qse/include/qse/awk/Awk.hpp +++ b/qse/include/qse/awk/Awk.hpp @@ -1125,7 +1125,11 @@ public: /// \return integer >= 0 on success, -1 on failure. /// int addGlobal ( - const char_t* name ///< variable name + const qse_mchar_t* name ///< variable name + ); + + int addGlobal ( + const qse_wchar_t* name ///< variable name ); /// @@ -1134,16 +1138,23 @@ public: /// \return 0 on success, -1 on failure. /// int deleteGlobal ( - const char_t* name ///< variable name + const qse_mchar_t* name ///< variable name + ); + + int deleteGlobal ( + const qse_wchar_t* name ///< variable name ); /// - /// The addGlobal() function returns the numeric ID of an intrinsic + /// The findGlobal() function returns the numeric ID of an intrinsic // global variable. /// \return integer >= 0 on success, -1 on failure. /// int findGlobal ( - const char_t* name ///> variable name + const qse_mchar_t* name ///> variable name + ); + int findGlobal ( + const qse_wchar_t* name ///> variable name ); /// @@ -1186,12 +1197,21 @@ public: /// function. /// int addFunction ( - const char_t* name, ///< function name - size_t minArgs, ///< minimum numbers of arguments - size_t maxArgs, ///< maximum numbers of arguments - const char_t* argSpec, ///< argument specification - FunctionHandler handler, ///< function handler - int validOpts = 0 ///< valid if these options are set + const qse_mchar_t* name, ///< function name + size_t minArgs, ///< minimum numbers of arguments + size_t maxArgs, ///< maximum numbers of arguments + const qse_mchar_t* argSpec, ///< argument specification + FunctionHandler handler, ///< function handler + int validOpts = 0 ///< valid if these options are set + ); + + int addFunction ( + const qse_wchar_t* name, ///< function name + size_t minArgs, ///< minimum numbers of arguments + size_t maxArgs, ///< maximum numbers of arguments + const qse_wchar_t* argSpec, ///< argument specification + FunctionHandler handler, ///< function handler + int validOpts = 0 ///< valid if these options are set ); /// diff --git a/qse/include/qse/awk/awk.h b/qse/include/qse/awk/awk.h index 7c18b549..8c369d4b 100644 --- a/qse/include/qse/awk/awk.h +++ b/qse/include/qse/awk/awk.h @@ -815,7 +815,6 @@ typedef struct qse_awk_rio_t qse_awk_rio_t; /* ------------------------------------------------------------------------ */ typedef struct qse_awk_fnc_t qse_awk_fnc_t; -typedef struct qse_awk_fnc_spec_t qse_awk_fnc_spec_t; typedef struct qse_awk_fnc_info_t qse_awk_fnc_info_t; /** @@ -827,15 +826,15 @@ typedef int (*qse_awk_fnc_impl_t) ( ); /** - * The qse_awk_fnc_arg_t type defines a structure to describe arguments + * The qse_awk_fnc_marg_t type defines a structure to describe arguments * to an implicit function. */ -struct qse_awk_fnc_arg_t +struct qse_awk_fnc_marg_t { - /** numbers of argument for a function */ + /** minimum numbers of argument for a function */ qse_size_t min; - /** numbers of argument for a function */ + /** maximum numbers of argument for a function */ qse_size_t max; /** @@ -848,18 +847,30 @@ struct qse_awk_fnc_arg_t * - r: reference * - x: regular expression */ - const qse_char_t* spec; + const qse_mchar_t* spec; }; -typedef struct qse_awk_fnc_arg_t qse_awk_fnc_arg_t; +typedef struct qse_awk_fnc_marg_t qse_awk_fnc_marg_t; /** - * The qse_awk_fnc_spec_t type defines a structure to hold the specification + * The qse_awk_fnc_warg_t type defines a structure to describe arguments + * to an implicit function. + */ +struct qse_awk_fnc_warg_t +{ + qse_size_t min; + qse_size_t max; + const qse_wchar_t* spec; +}; +typedef struct qse_awk_fnc_warg_t qse_awk_fnc_warg_t; + +/** + * The qse_awk_fnc_mspec_t type defines a structure to hold the specification * of an intrinsic function or a module function. */ -struct qse_awk_fnc_spec_t +struct qse_awk_fnc_mspec_t { /** argument descriptor */ - qse_awk_fnc_arg_t arg; + qse_awk_fnc_marg_t arg; /** pointer to the function implementing this function */ qse_awk_fnc_impl_t impl; @@ -874,6 +885,39 @@ struct qse_awk_fnc_spec_t */ int trait; }; +typedef struct qse_awk_fnc_mspec_t qse_awk_fnc_mspec_t; + +/** + * The qse_awk_fnc_wspec_t type defines a structure to hold the specification + * of an intrinsic function or a module function. + */ +struct qse_awk_fnc_wspec_t +{ + /** argument descriptor */ + qse_awk_fnc_warg_t arg; + + /** pointer to the function implementing this function */ + qse_awk_fnc_impl_t impl; + + /** + * when this field is set to a non-zero value bitwise-ORed of + * #qse_awk_trait_t enumerators, the function is available if + * this field bitwise-ANDed with the global trait option produces + * this field itself. + * + * this field doesn't take effect for a module function. + */ + int trait; +}; +typedef struct qse_awk_fnc_wspec_t qse_awk_fnc_wspec_t; + +#if defined(QSE_CHAR_IS_MCHAR) +typedef qse_awk_fnc_marg_t qse_awk_fnc_arg_t; +typedef qse_awk_fnc_mspec_t qse_awk_fnc_spec_t; +#else +typedef qse_awk_fnc_warg_t qse_awk_fnc_arg_t; +typedef qse_awk_fnc_wspec_t qse_awk_fnc_spec_t; +#endif /* ------------------------------------------------------------------------ */ @@ -1368,13 +1412,14 @@ enum qse_awk_errnum_t }; typedef enum qse_awk_errnum_t qse_awk_errnum_t; +#define QSE_AWK_ERRINF_MSG_SIZE 256 /** * The qse_awk_errinf_t type defines a placeholder for error information. */ struct qse_awk_errinf_t { qse_awk_errnum_t num; /**< error number */ - qse_char_t msg[256]; /**< error message */ + qse_char_t msg[QSE_AWK_ERRINF_MSG_SIZE]; /**< error message */ qse_awk_loc_t loc; /**< error location */ }; typedef struct qse_awk_errinf_t qse_awk_errinf_t; @@ -1662,15 +1707,33 @@ QSE_EXPORT const qse_awk_loc_t* qse_awk_geterrloc ( ); /** - * The qse_awk_geterrmsg() function returns the error message describing + * The qse_awk_getmerrmsg() function returns the error message describing * the last error occurred. * * \return error message */ -QSE_EXPORT const qse_char_t* qse_awk_geterrmsg ( +QSE_EXPORT const qse_mchar_t* qse_awk_getmerrmsg ( qse_awk_t* awk /**< awk */ ); +/** + * The qse_awk_getwerrmsg() function returns the error message describing + * the last error occurred. + * + * \return error message + */ +QSE_EXPORT const qse_wchar_t* qse_awk_getwerrmsg ( + qse_awk_t* awk /**< awk */ +); + + +#if defined(QSE_CHAR_IS_MCHAR) +# define qse_awk_geterrmsg qse_awk_getmerrmsg +#else +# define qse_awk_geterrmsg qse_awk_getwerrmsg +#endif + + QSE_EXPORT const qse_char_t* qse_awk_backuperrmsg ( qse_awk_t* awk /**< awk */ ); @@ -1846,23 +1909,49 @@ QSE_EXPORT int qse_awk_findgblwithwcs ( #endif /** - * The qse_awk_addfnc() function adds an intrinsic function. + * The qse_awk_addfncwithmbs() function adds an intrinsic function. */ -QSE_EXPORT qse_awk_fnc_t* qse_awk_addfnc ( - qse_awk_t* awk, - const qse_char_t* name, - const qse_awk_fnc_spec_t* spec +QSE_EXPORT qse_awk_fnc_t* qse_awk_addfncwithmbs ( + qse_awk_t* awk, + const qse_mchar_t* name, + const qse_awk_fnc_mspec_t* spec ); /** - * The qse_awk_delfnc() function deletes an intrinsic function by name. + * The qse_awk_addfncwithwcs() function adds an intrinsic function. + */ +QSE_EXPORT qse_awk_fnc_t* qse_awk_addfncwithwcs ( + qse_awk_t* awk, + const qse_wchar_t* name, + const qse_awk_fnc_wspec_t* spec +); + +/** + * The qse_awk_delfncwithmbs() function deletes an intrinsic function by name. * \return 0 on success, -1 on failure */ -QSE_EXPORT int qse_awk_delfnc ( - qse_awk_t* awk, /**< awk */ - const qse_char_t* name /**< function name */ +QSE_EXPORT int qse_awk_delfncwithmbs ( + qse_awk_t* awk, /**< awk */ + const qse_mchar_t* name /**< function name */ ); +/** + * The qse_awk_delfncwithwcs() function deletes an intrinsic function by name. + * \return 0 on success, -1 on failure + */ +QSE_EXPORT int qse_awk_delfncwithwcs ( + qse_awk_t* awk, /**< awk */ + const qse_wchar_t* name /**< function name */ +); + +#if defined(QSE_CHAR_IS_MCHAR) +# define qse_awk_addfnc qse_awk_addfncwithmbs +# define qse_awk_delfnc qse_awk_delfncwithmbs +#else +# define qse_awk_addfnc qse_awk_addfncwithwcs +# define qse_awk_delfnc qse_awk_delfncwithwcs +#endif + /** * The qse_awk_clrfnc() function deletes all intrinsic functions */ @@ -2007,12 +2096,26 @@ QSE_EXPORT qse_wchar_t* qse_awk_mbstowcsdup ( qse_size_t* wcslen ); +QSE_EXPORT qse_wchar_t* qse_awk_mbsntowcsdup ( + qse_awk_t* awk, + const qse_mchar_t* mbs, + qse_size_t mbslen, + qse_size_t* wcslen +); + QSE_EXPORT qse_mchar_t* qse_awk_wcstombsdup ( qse_awk_t* awk, const qse_wchar_t* wcs, qse_size_t* mbslen ); +qse_mchar_t* qse_awk_wcsntombsdup ( + qse_awk_t* awk, + const qse_wchar_t* wcs, + qse_size_t wcslen, + qse_size_t* mbslen +); + /** * The qse_awk_mbsxtoint() function converts a multi-byte string to an integer. */ @@ -2398,14 +2501,29 @@ QSE_EXPORT const qse_awk_loc_t* qse_awk_rtx_geterrloc ( ); /** - * The qse_awk_rtx_geterrmsg() function gets the string describing the last + * The qse_awk_rtx_getmerrmsg() function gets the string describing the last * error occurred during runtime. * \return error message */ -QSE_EXPORT const qse_char_t* qse_awk_rtx_geterrmsg ( +QSE_EXPORT const qse_mchar_t* qse_awk_rtx_getmerrmsg ( qse_awk_rtx_t* rtx /**< runtime context */ ); +/** + * The qse_awk_rtx_getwerrmsg() function gets the string describing the last + * error occurred during runtime. + * \return error message + */ +QSE_EXPORT const qse_wchar_t* qse_awk_rtx_getwerrmsg ( + qse_awk_rtx_t* rtx /**< runtime context */ +); + +#if defined(QSE_CHAR_IS_MCHAR) +# define qse_awk_rtx_geterrmsg qse_awk_rtx_getmerrmsg +#else +# define qse_awk_rtx_geterrmsg qse_awk_rtx_getwerrmsg +#endif + QSE_EXPORT const qse_char_t* qse_awk_rtx_backuperrmsg ( qse_awk_rtx_t* rtx /**< runtime context */ ); @@ -2555,20 +2673,20 @@ QSE_EXPORT qse_awk_val_t* qse_awk_rtx_makestrvalwithwcs ( ); /** - * The qse_awk_rtx_makestrvalwithxstr() function creates a string value. + * The qse_awk_rtx_makestrvalwithcstr() function creates a string value. * \return value on success, #QSE_NULL on failure */ -QSE_EXPORT qse_awk_val_t* qse_awk_rtx_makestrvalwithxstr ( +QSE_EXPORT qse_awk_val_t* qse_awk_rtx_makestrvalwithcstr ( qse_awk_rtx_t* rtx, const qse_cstr_t* str ); -QSE_EXPORT qse_awk_val_t* qse_awk_rtx_makestrvalwithmxstr ( +QSE_EXPORT qse_awk_val_t* qse_awk_rtx_makestrvalwithmcstr ( qse_awk_rtx_t* rtx, const qse_mcstr_t* mxstr ); -QSE_EXPORT qse_awk_val_t* qse_awk_rtx_makestrvalwithwxstr ( +QSE_EXPORT qse_awk_val_t* qse_awk_rtx_makestrvalwithwcstr ( qse_awk_rtx_t* rtx, const qse_wcstr_t* wxstr ); @@ -2614,7 +2732,7 @@ QSE_EXPORT qse_awk_val_t* qse_awk_rtx_makenstrvalwithstr ( * \b nstr is 1. * \return value on success, #QSE_NULL on failure */ -QSE_EXPORT qse_awk_val_t* qse_awk_rtx_makenstrvalwithxstr ( +QSE_EXPORT qse_awk_val_t* qse_awk_rtx_makenstrvalwithcstr ( qse_awk_rtx_t* rtx, const qse_cstr_t* str ); @@ -2629,7 +2747,7 @@ qse_awk_val_t* qse_awk_rtx_makembsval ( qse_size_t len ); -qse_awk_val_t* qse_awk_rtx_makembsvalwithmxstr ( +qse_awk_val_t* qse_awk_rtx_makembsvalwithmcstr ( qse_awk_rtx_t* rtx, const qse_mcstr_t* mxstr ); diff --git a/qse/lib/awk/Awk.cpp b/qse/lib/awk/Awk.cpp index 85714dd8..4773c52c 100644 --- a/qse/lib/awk/Awk.cpp +++ b/qse/lib/awk/Awk.cpp @@ -615,8 +615,8 @@ int Awk::Value::setStr (Run* r, const char_t* str, size_t len, bool numeric) cstr.ptr = (char_t*)str; cstr.len = len; - tmp = numeric? qse_awk_rtx_makenstrvalwithxstr (r->rtx, &cstr): - qse_awk_rtx_makestrvalwithxstr (r->rtx, &cstr); + tmp = numeric? qse_awk_rtx_makenstrvalwithcstr (r->rtx, &cstr): + qse_awk_rtx_makestrvalwithcstr (r->rtx, &cstr); if (tmp == QSE_NULL) { r->awk->retrieveError (r); @@ -776,8 +776,8 @@ int Awk::Value::setIndexedStr ( cstr.ptr = (char_t*)str; cstr.len = len; - tmp = numeric? qse_awk_rtx_makenstrvalwithxstr (r->rtx, &cstr): - qse_awk_rtx_makestrvalwithxstr (r->rtx, &cstr); + tmp = numeric? qse_awk_rtx_makenstrvalwithcstr (r->rtx, &cstr): + qse_awk_rtx_makestrvalwithcstr (r->rtx, &cstr); if (tmp == QSE_NULL) { r->awk->retrieveError (r); @@ -1641,14 +1641,14 @@ void Awk::xstrs_t::clear (awk_t* awk) int Awk::addArgument (const char_t* arg, size_t len) { QSE_ASSERT (awk != QSE_NULL); - int n = runarg.add (awk, arg, len); + int n = runarg.add(awk, arg, len); if (n <= -1) this->setError (QSE_AWK_ENOMEM); return n; } int Awk::addArgument (const char_t* arg) { - return addArgument (arg, qse_strlen(arg)); + return addArgument(arg, qse_strlen(arg)); } void Awk::clearArguments () @@ -1656,26 +1656,51 @@ void Awk::clearArguments () runarg.clear (awk); } -int Awk::addGlobal (const char_t* name) +int Awk::addGlobal(const qse_mchar_t* name) { QSE_ASSERT (awk != QSE_NULL); - int n = qse_awk_addgbl (awk, name); + int n = qse_awk_addgblwithmbs(awk, name); if (n <= -1) this->retrieveError (); return n; } -int Awk::deleteGlobal (const char_t* name) +int Awk::addGlobal(const qse_wchar_t* name) { QSE_ASSERT (awk != QSE_NULL); - int n = qse_awk_delgbl (awk, name); + int n = qse_awk_addgblwithwcs(awk, name); if (n <= -1) this->retrieveError (); return n; } -int Awk::findGlobal (const char_t* name) +int Awk::deleteGlobal (const qse_mchar_t* name) { QSE_ASSERT (awk != QSE_NULL); - int n = qse_awk_findgbl (awk, name); + int n = qse_awk_delgblwithmbs(awk, name); + if (n <= -1) this->retrieveError (); + return n; +} + +int Awk::deleteGlobal (const qse_wchar_t* name) +{ + QSE_ASSERT (awk != QSE_NULL); + int n = qse_awk_delgblwithwcs(awk, name); + if (n <= -1) this->retrieveError (); + return n; +} + + +int Awk::findGlobal (const qse_mchar_t* name) +{ + QSE_ASSERT (awk != QSE_NULL); + int n = qse_awk_findgblwithmbs(awk, name); + if (n <= -1) this->retrieveError (); + return n; +} + +int Awk::findGlobal (const qse_wchar_t* name) +{ + QSE_ASSERT (awk != QSE_NULL); + int n = qse_awk_findgblwithwcs(awk, name); if (n <= -1) this->retrieveError (); return n; } @@ -1707,12 +1732,12 @@ int Awk::getGlobal (int id, Value& v) } int Awk::addFunction ( - const char_t* name, size_t minArgs, size_t maxArgs, - const char_t* argSpec, FunctionHandler handler, int validOpts) + const qse_mchar_t* name, size_t minArgs, size_t maxArgs, + const qse_mchar_t* argSpec, FunctionHandler handler, int validOpts) { QSE_ASSERT (awk != QSE_NULL); - fnc_spec_t spec; + qse_awk_fnc_mspec_t spec; QSE_MEMSET (&spec, 0, QSE_SIZEOF(spec)); spec.arg.min = minArgs; @@ -1721,7 +1746,7 @@ int Awk::addFunction ( spec.impl = this->functionHandler; spec.trait = validOpts; - qse_awk_fnc_t* fnc = qse_awk_addfnc (awk, name, &spec); + qse_awk_fnc_t* fnc = qse_awk_addfncwithmbs(awk, name, &spec); if (fnc == QSE_NULL) { this->retrieveError (); @@ -1735,17 +1760,62 @@ int Awk::addFunction ( // // the function name exists in the underlying function table. // use the pointer to the name to maintain the hash table. - qse_htb_pair_t* pair = qse_htb_upsert ( - this->functionMap, (char_t*)fnc->name.ptr, fnc->name.len, &handler, QSE_SIZEOF(handler)); + qse_htb_pair_t* pair = qse_htb_upsert(this->functionMap, (char_t*)fnc->name.ptr, fnc->name.len, &handler, QSE_SIZEOF(handler)); #else FunctionMap::Pair* pair; - try { pair = this->functionMap.upsert (Cstr(fnc->name.ptr, fnc->name.len), handler); } + try { pair = this->functionMap.upsert(Cstr(fnc->name.ptr, fnc->name.len), handler); } catch (...) { pair = QSE_NULL; } #endif if (pair == QSE_NULL) { - qse_awk_delfnc (awk, name); + qse_awk_delfncwithmbs (awk, name); + this->setError (QSE_AWK_ENOMEM); + return -1; + } + + return 0; +} + +int Awk::addFunction ( + const qse_wchar_t* name, size_t minArgs, size_t maxArgs, + const qse_wchar_t* argSpec, FunctionHandler handler, int validOpts) +{ + QSE_ASSERT (awk != QSE_NULL); + + qse_awk_fnc_wspec_t spec; + + QSE_MEMSET (&spec, 0, QSE_SIZEOF(spec)); + spec.arg.min = minArgs; + spec.arg.max = maxArgs; + spec.arg.spec = argSpec; + spec.impl = this->functionHandler; + spec.trait = validOpts; + + qse_awk_fnc_t* fnc = qse_awk_addfncwithwcs(awk, name, &spec); + if (fnc == QSE_NULL) + { + this->retrieveError (); + return -1; + } + +#if defined(QSE_AWK_USE_HTB_FOR_FUNCTION_MAP) + // handler is a pointer to a member function. + // sizeof(handler) is likely to be greater than sizeof(void*) + // copy the handler pointer into the table. + // + // the function name exists in the underlying function table. + // use the pointer to the name to maintain the hash table. + qse_htb_pair_t* pair = qse_htb_upsert(this->functionMap, (char_t*)fnc->name.ptr, fnc->name.len, &handler, QSE_SIZEOF(handler)); +#else + FunctionMap::Pair* pair; + try { pair = this->functionMap.upsert(Cstr(fnc->name.ptr, fnc->name.len), handler); } + catch (...) { pair = QSE_NULL; } +#endif + + if (pair == QSE_NULL) + { + qse_awk_delfncwithwcs (awk, name); this->setError (QSE_AWK_ENOMEM); return -1; } @@ -1757,7 +1827,7 @@ int Awk::deleteFunction (const char_t* name) { QSE_ASSERT (awk != QSE_NULL); - int n = qse_awk_delfnc (awk, name); + int n = qse_awk_delfnc(awk, name); if (n == 0) { #if defined(QSE_AWK_USE_HTB_FOR_FUNCTION_MAP) diff --git a/qse/lib/awk/awk-prv.h b/qse/lib/awk/awk-prv.h index 2c2690f7..0b5b09ff 100644 --- a/qse/lib/awk/awk-prv.h +++ b/qse/lib/awk/awk-prv.h @@ -304,7 +304,12 @@ struct qse_awk_t /* housekeeping */ qse_awk_errstr_t errstr; qse_awk_errinf_t errinf; - qse_char_t errmsg_backup[256]; + qse_char_t errmsg_backup[QSE_AWK_ERRINF_MSG_SIZE]; +#if defined(QSE_CHAR_IS_MCHAR) + qse_wchar_t werrmsg[QSE_AWK_ERRINF_MSG_SIZE]; +#else + qse_mchar_t merrmsg[QSE_AWK_ERRINF_MSG_SIZE * 2]; +#endif int stopall; qse_awk_ecb_t* ecb; @@ -441,7 +446,12 @@ struct qse_awk_rtx_t } depth; qse_awk_errinf_t errinf; - qse_char_t errmsg_backup[256]; + qse_char_t errmsg_backup[QSE_AWK_ERRINF_MSG_SIZE]; +#if defined(QSE_CHAR_IS_MCHAR) + qse_wchar_t werrmsg[QSE_AWK_ERRINF_MSG_SIZE]; +#else + qse_mchar_t merrmsg[QSE_AWK_ERRINF_MSG_SIZE * 2]; +#endif qse_awk_rtx_ecb_t* ecb; }; diff --git a/qse/lib/awk/err.c b/qse/lib/awk/err.c index a586f11a..cfb8a93b 100644 --- a/qse/lib/awk/err.c +++ b/qse/lib/awk/err.c @@ -25,6 +25,7 @@ */ #include "awk-prv.h" +#include const qse_char_t* qse_awk_dflerrstr (qse_awk_t* awk, qse_awk_errnum_t errnum) { @@ -193,10 +194,43 @@ const qse_awk_loc_t* qse_awk_geterrloc (qse_awk_t* awk) return &awk->errinf.loc; } -const qse_char_t* qse_awk_geterrmsg (qse_awk_t* awk) +const qse_mchar_t* qse_awk_getmerrmsg (qse_awk_t* awk) { +#if defined(QSE_CHAR_IS_MCHAR) return (awk->errinf.msg[0] == QSE_T('\0'))? qse_awk_geterrstr(awk)(awk,awk->errinf.num): awk->errinf.msg; +#else + const qse_char_t* msg; + qse_size_t wcslen, mbslen; + + msg = (awk->errinf.msg[0] == QSE_T('\0'))? + qse_awk_geterrstr(awk)(awk,awk->errinf.num): awk->errinf.msg; + + mbslen = QSE_COUNTOF(awk->merrmsg); + qse_wcstombswithcmgr(msg, &wcslen, awk->merrmsg, &mbslen, qse_awk_getcmgr(awk)); + + return awk->merrmsg; +#endif +} + +const qse_wchar_t* qse_awk_getwerrmsg (qse_awk_t* awk) +{ +#if defined(QSE_CHAR_IS_MCHAR) + const qse_char_t* msg; + qse_size_t wcslen, mbslen; + + msg = (awk->errinf.msg[0] == QSE_T('\0'))? + qse_awk_geterrstr(awk)(awk,awk->errinf.num): awk->errinf.msg; + + wcslen = QSE_COUNTOF(awk->werrmsg); + qse_mbstowcsallwithcmgr (msg, &mbslen, awk->werrmsg, &wcslen, qse_awk_getcmgr(awk)); + + return awk->werrmsg; +#else + return (awk->errinf.msg[0] == QSE_T('\0'))? + qse_awk_geterrstr(awk)(awk,awk->errinf.num): awk->errinf.msg; +#endif + } void qse_awk_geterrinf (qse_awk_t* awk, qse_awk_errinf_t* errinf) @@ -276,10 +310,42 @@ const qse_awk_loc_t* qse_awk_rtx_geterrloc (qse_awk_rtx_t* rtx) return &rtx->errinf.loc; } -const qse_char_t* qse_awk_rtx_geterrmsg (qse_awk_rtx_t* rtx) +const qse_mchar_t* qse_awk_rtx_getmerrmsg (qse_awk_rtx_t* rtx) { +#if defined(QSE_CHAR_IS_MCHAR) return (rtx->errinf.msg[0] == QSE_T('\0')) ? qse_awk_geterrstr(rtx->awk)(rtx->awk,rtx->errinf.num): rtx->errinf.msg; +#else + const qse_char_t* msg; + qse_size_t wcslen, mbslen; + + msg = (rtx->errinf.msg[0] == QSE_T('\0')) ? + qse_awk_geterrstr(rtx->awk)(rtx->awk,rtx->errinf.num): rtx->errinf.msg; + + mbslen = QSE_COUNTOF(rtx->merrmsg); + qse_wcstombswithcmgr(msg, &wcslen, rtx->merrmsg, &mbslen, qse_awk_rtx_getcmgr(rtx)); + + return rtx->merrmsg; +#endif +} + +const qse_wchar_t* qse_awk_rtx_getwerrmsg (qse_awk_rtx_t* rtx) +{ +#if defined(QSE_CHAR_IS_MCHAR) + const qse_char_t* msg; + qse_size_t wcslen, mbslen; + + msg = (rtx->errinf.msg[0] == QSE_T('\0')) ? + qse_awk_geterrstr(rtx->awk)(rtx->awk,rtx->errinf.num): rtx->errinf.msg; + + wcslen = QSE_COUNTOF(rtx->werrmsg); + qse_mbstowcsallwithcmgr (msg, &mbslen, rtx->werrmsg, &wcslen, qse_awk_rtx_getcmgr(rtx)); + + return rtx->werrmsg; +#else + return (rtx->errinf.msg[0] == QSE_T('\0')) ? + qse_awk_geterrstr(rtx->awk)(rtx->awk,rtx->errinf.num): rtx->errinf.msg; +#endif } void qse_awk_rtx_geterrinf (qse_awk_rtx_t* rtx, qse_awk_errinf_t* errinf) diff --git a/qse/lib/awk/fnc.c b/qse/lib/awk/fnc.c index d1b0f80a..51b38725 100644 --- a/qse/lib/awk/fnc.c +++ b/qse/lib/awk/fnc.c @@ -96,7 +96,7 @@ static qse_awk_fnc_t sysfnctab[] = { {QSE_T("systime"), 7}, 0, { {A_MAX, 0, QSE_T("sys") }, QSE_NULL, 0 }, QSE_NULL} }; -qse_awk_fnc_t* qse_awk_addfnc (qse_awk_t* awk, const qse_char_t* name, const qse_awk_fnc_spec_t* spec) +static qse_awk_fnc_t* add_fnc (qse_awk_t* awk, const qse_char_t* name, const qse_awk_fnc_spec_t* spec) { qse_awk_fnc_t* fnc; qse_size_t fnc_size; @@ -104,7 +104,7 @@ qse_awk_fnc_t* qse_awk_addfnc (qse_awk_t* awk, const qse_char_t* name, const qse qse_cstr_t ncs; ncs.ptr = (qse_char_t*)name; - ncs.len = qse_strlen (name); + ncs.len = qse_strlen(name); if (ncs.len <= 0) { qse_awk_seterrnum (awk, QSE_AWK_EINVAL, QSE_NULL); @@ -115,7 +115,7 @@ qse_awk_fnc_t* qse_awk_addfnc (qse_awk_t* awk, const qse_char_t* name, const qse * such a function registered won't take effect because * the word is treated as a keyword */ - if (qse_awk_findfnc(awk, &ncs) != QSE_NULL) + if (qse_awk_findfncwithcstr(awk, &ncs) != QSE_NULL) { qse_awk_seterrnum (awk, QSE_AWK_EEXIST, &ncs); return QSE_NULL; @@ -130,7 +130,7 @@ qse_awk_fnc_t* qse_awk_addfnc (qse_awk_t* awk, const qse_char_t* name, const qse qse_char_t* tmp; tmp = (qse_char_t*)(fnc + 1); - fnc->name.len = qse_strcpy (tmp, ncs.ptr); + fnc->name.len = qse_strcpy(tmp, ncs.ptr); fnc->name.ptr = tmp; fnc->spec = *spec; @@ -152,18 +152,126 @@ qse_awk_fnc_t* qse_awk_addfnc (qse_awk_t* awk, const qse_char_t* name, const qse return fnc; } -int qse_awk_delfnc (qse_awk_t* awk, const qse_char_t* name) +qse_awk_fnc_t* qse_awk_addfncwithmbs (qse_awk_t* awk, const qse_mchar_t* name, const qse_awk_fnc_mspec_t* spec) { - qse_cstr_t ncs; +#if defined(QSE_CHAR_IS_MCHAR) + return add_fnc(awk, name, spec); +#else + qse_wcstr_t wcs; + qse_awk_fnc_t* fnc; + qse_awk_fnc_spec_t wspec; - ncs.ptr = (qse_char_t*)name; - ncs.len = qse_strlen (name); + QSE_STATIC_ASSERT (QSE_SIZEOF(*spec) == QSE_SIZEOF(wspec)); + QSE_MEMCPY (&wspec, spec, QSE_SIZEOF(wspec)); + if (spec->arg.spec) + { + wcs.ptr = qse_awk_mbstowcsdup(awk, spec->arg.spec, &wcs.len); + if (!wcs.ptr) return QSE_NULL; + wspec.arg.spec = wcs.ptr; + } + + wcs.ptr = qse_awk_mbstowcsdup(awk, name, &wcs.len); + if (!wcs.ptr) + { + if (wspec.arg.spec) qse_awk_freemem (awk, (qse_wchar_t*)wspec.arg.spec); + return QSE_NULL; + } + + fnc = add_fnc(awk, wcs.ptr, &wspec); + qse_awk_freemem (awk, wcs.ptr); + if (wspec.arg.spec) qse_awk_freemem (awk, (qse_wchar_t*)wspec.arg.spec); + return fnc; +#endif +} + +qse_awk_fnc_t* qse_awk_addfncwithwcs (qse_awk_t* awk, const qse_wchar_t* name, const qse_awk_fnc_wspec_t* spec) +{ +#if defined(QSE_CHAR_IS_MCHAR) + qse_mcstr_t mbs; + qse_awk_fnc_t* fnc; + qse_awk_fnc_spec_t mspec; + + QSE_STATIC_ASSERT (QSE_SIZEOF(*spec) == QSE_SIZEOF(mspec)); + + QSE_MEMCPY (&mspec, spec, QSE_SIZEOF(mspec)); + if (spec->arg.spec) + { + mbs.ptr = qse_awk_wcstombsdup(awk, spec->arg.spec, &mbs.len); + if (!mbs.ptr) return QSE_NULL; + mspec.arg.spec = mbs.ptr; + } + + mbs.ptr = qse_awk_wcstombsdup(awk, name, &mbs.len); + if (!mbs.ptr) + { + if (mspec.arg.spec) qse_awk_freemem (awk, (qse_mchar_t*)mspec.arg.spec); + return QSE_NULL; + } + + fnc = add_fnc(awk, mbs.ptr, &mspec); + qse_awk_freemem (awk, mbs.ptr); + if (mspec.arg.spec) qse_awk_freemem (awk, (qse_mchar_t*)mspec.arg.spec); + return fnc; +#else + return add_fnc(awk, name, spec); +#endif +} + +int qse_awk_delfncwithmbs (qse_awk_t* awk, const qse_mchar_t* name) +{ + qse_mcstr_t ncs; + qse_wcstr_t wcs; + + ncs.ptr = (qse_mchar_t*)name; + ncs.len = qse_mbslen(name); + +#if defined(QSE_CHAR_IS_MCHAR) if (qse_htb_delete(awk->fnc.user, ncs.ptr, ncs.len) <= -1) { qse_awk_seterrnum (awk, QSE_AWK_ENOENT, &ncs); return -1; } +#else + wcs.ptr = qse_awk_mbstowcsdup(awk, ncs.ptr, &wcs.len); + if (!wcs.ptr) return -1; + if (qse_htb_delete(awk->fnc.user, wcs.ptr, wcs.len) <= -1) + { + qse_awk_seterrnum (awk, QSE_AWK_ENOENT, &wcs); + qse_awk_freemem (awk, wcs.ptr); + return -1; + } + qse_awk_freemem (awk, wcs.ptr); +#endif + + return 0; +} + +int qse_awk_delfncwithwcs (qse_awk_t* awk, const qse_wchar_t* name) +{ + qse_wcstr_t ncs; + qse_mcstr_t mbs; + + ncs.ptr = (qse_wchar_t*)name; + ncs.len = qse_wcslen(name); + +#if defined(QSE_CHAR_IS_MCHAR) + mbs.ptr = qse_awk_wcstombsdup(awk, ncs.ptr, &mbs.len); + if (!mbs.ptr) return -1; + if (qse_htb_delete(awk->fnc.user, mbs.ptr, mbs.len) <= -1) + { + qse_awk_seterrnum (awk, QSE_AWK_ENOENT, &mbs); + qse_awk_freemem (awk, mbs.ptr); + return -1; + } + qse_awk_freemem (awk, mbs.ptr); +#else + if (qse_htb_delete(awk->fnc.user, ncs.ptr, ncs.len) <= -1) + { + qse_awk_seterrnum (awk, QSE_AWK_ENOENT, &ncs); + return -1; + } +#endif return 0; } @@ -173,7 +281,7 @@ void qse_awk_clrfnc (qse_awk_t* awk) qse_htb_clear (awk->fnc.user); } -qse_awk_fnc_t* qse_awk_findfnc (qse_awk_t* awk, const qse_cstr_t* name) +static qse_awk_fnc_t* find_fnc (qse_awk_t* awk, const qse_cstr_t* name) { qse_htb_pair_t* pair; int i; @@ -192,7 +300,7 @@ qse_awk_fnc_t* qse_awk_findfnc (qse_awk_t* awk, const qse_cstr_t* name) name->ptr, name->len) == 0) return &sysfnctab[i]; } - pair = qse_htb_search (awk->fnc.user, name->ptr, name->len); + pair = qse_htb_search(awk->fnc.user, name->ptr, name->len); if (pair) { qse_awk_fnc_t* fnc; @@ -200,9 +308,43 @@ qse_awk_fnc_t* qse_awk_findfnc (qse_awk_t* awk, const qse_cstr_t* name) if ((awk->opt.trait & fnc->spec.trait) == fnc->spec.trait) return fnc; } + qse_awk_seterrnum (awk, QSE_AWK_ENOENT, name); return QSE_NULL; } +qse_awk_fnc_t* qse_awk_findfncwithmcstr (qse_awk_t* awk, const qse_mcstr_t* name) +{ +#if defined(QSE_CHAR_IS_MCHAR) + return find_fnc(awk, name); +#else + qse_wcstr_t wcs; + qse_awk_fnc_t* fnc; + + wcs.ptr = qse_awk_mbsntowcsdup(awk, name->ptr, name->len, &wcs.len); + if (!wcs.ptr) return QSE_NULL; + fnc = find_fnc(awk, &wcs); + qse_awk_freemem (awk, wcs.ptr); + return fnc; +#endif +} + +qse_awk_fnc_t* qse_awk_findfncwithwcstr (qse_awk_t* awk, const qse_wcstr_t* name) +{ +#if defined(QSE_CHAR_IS_MCHAR) + qse_mcstr_t mbs; + qse_awk_fnc_t* fnc; + + mbs.ptr = qse_awk_wcsntombsdup(awk, name->ptr, name->len, &mbs.len); + if (!mbs.ptr) return QSE_NULL; + fnc = find_fnc(awk, &mbs); + qse_awk_freemem (awk, mbs.ptr); + return fnc; +#else + return find_fnc(awk, name); +#endif +} + + static int fnc_close (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) { qse_size_t nargs; @@ -817,8 +959,8 @@ int qse_awk_fnc_split (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) /* create the field string - however, the split function must * create a numeric string if the string is a number */ - /*t2 = qse_awk_rtx_makestrvalwithxstr (rtx, &tok);*/ - t2 = qse_awk_rtx_makenstrvalwithxstr (rtx, &tok); + /*t2 = qse_awk_rtx_makestrvalwithcstr (rtx, &tok);*/ + t2 = qse_awk_rtx_makenstrvalwithcstr (rtx, &tok); if (t2 == QSE_NULL) goto oops; /* put it into the map */ @@ -887,7 +1029,7 @@ int qse_awk_fnc_tolower (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) qse_mcstr_t str; str.ptr = qse_awk_rtx_getvalmbs(rtx, a0, &str.len); if (!str.ptr) return -1; - r = qse_awk_rtx_makembsvalwithmxstr(rtx, &str); + r = qse_awk_rtx_makembsvalwithmcstr(rtx, &str); qse_awk_rtx_freevalmbs (rtx, a0, str.ptr); if (!r) return -1; str.ptr = ((qse_awk_val_mbs_t*)r)->val.ptr; @@ -899,7 +1041,7 @@ int qse_awk_fnc_tolower (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) qse_cstr_t str; str.ptr = qse_awk_rtx_getvalstr(rtx, a0, &str.len); if (!str.ptr) return -1; - r = qse_awk_rtx_makestrvalwithxstr(rtx, &str); + r = qse_awk_rtx_makestrvalwithcstr(rtx, &str); qse_awk_rtx_freevalstr (rtx, a0, str.ptr); if (!r) return -1; str.ptr = ((qse_awk_val_str_t*)r)->val.ptr; @@ -925,7 +1067,7 @@ int qse_awk_fnc_toupper (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) qse_mcstr_t str; str.ptr = qse_awk_rtx_getvalmbs(rtx, a0, &str.len); if (!str.ptr) return -1; - r = qse_awk_rtx_makembsvalwithmxstr(rtx, &str); + r = qse_awk_rtx_makembsvalwithmcstr(rtx, &str); qse_awk_rtx_freevalmbs (rtx, a0, str.ptr); if (!r) return -1; str.ptr = ((qse_awk_val_mbs_t*)r)->val.ptr; @@ -937,7 +1079,7 @@ int qse_awk_fnc_toupper (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) qse_cstr_t str; str.ptr = qse_awk_rtx_getvalstr(rtx, a0, &str.len); if (!str.ptr) return -1; - r = qse_awk_rtx_makestrvalwithxstr(rtx, &str); + r = qse_awk_rtx_makestrvalwithcstr(rtx, &str); qse_awk_rtx_freevalstr (rtx, a0, str.ptr); if (!r) return -1; str.ptr = ((qse_awk_val_str_t*)r)->val.ptr; @@ -1164,7 +1306,7 @@ static int __substitute (qse_awk_rtx_t* rtx, qse_awk_int_t max_count) { int n; - v = qse_awk_rtx_makestrvalwithxstr(rtx, QSE_STR_XSTR(&new)); + v = qse_awk_rtx_makestrvalwithcstr(rtx, QSE_STR_XSTR(&new)); if (v == QSE_NULL) goto oops; qse_awk_rtx_refupval (rtx, v); n = qse_awk_rtx_setrefval(rtx, (qse_awk_val_ref_t*)a2, v); @@ -1398,7 +1540,7 @@ int qse_awk_fnc_sprintf (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) qse_awk_rtx_freevalmbs (rtx, a0, cs0.ptr); if (!x.ptr) goto oops_mbs; - a0 = qse_awk_rtx_makembsvalwithmxstr(rtx, &x); + a0 = qse_awk_rtx_makembsvalwithmcstr(rtx, &x); if (a0 == QSE_NULL) goto oops_mbs; qse_mbs_fini (&fbu); @@ -1439,7 +1581,7 @@ int qse_awk_fnc_sprintf (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) qse_awk_rtx_freevalstr (rtx, a0, cs0.ptr); if (!x.ptr) goto oops; - a0 = qse_awk_rtx_makestrvalwithxstr(rtx, &x); + a0 = qse_awk_rtx_makestrvalwithcstr(rtx, &x); if (a0 == QSE_NULL) goto oops; qse_str_fini (&fbu); @@ -1625,7 +1767,7 @@ static QSE_INLINE int __fnc_asort (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* do { const qse_cstr_t* key = QSE_AWK_VAL_MAP_ITR_KEY(&itr); - va[i] = qse_awk_rtx_makestrvalwithxstr(rtx, key); + va[i] = qse_awk_rtx_makestrvalwithcstr(rtx, key); if (!va[i]) { while (i > 0) diff --git a/qse/lib/awk/fnc.h b/qse/lib/awk/fnc.h index 03a04b4c..769be9a8 100644 --- a/qse/lib/awk/fnc.h +++ b/qse/lib/awk/fnc.h @@ -48,7 +48,14 @@ struct qse_awk_fnc_t extern "C" { #endif -qse_awk_fnc_t* qse_awk_findfnc (qse_awk_t* awk, const qse_cstr_t* name); +qse_awk_fnc_t* qse_awk_findfncwithmcstr (qse_awk_t* awk, const qse_mcstr_t* name); +qse_awk_fnc_t* qse_awk_findfncwithwcstr (qse_awk_t* awk, const qse_wcstr_t* name); + +#if defined(QSE_CHAR_IS_MCHAR) +# define qse_awk_findfncwithcstr qse_awk_findfncwithmcstr +#else +# define qse_awk_findfncwithcstr qse_awk_findfncwithwcstr +#endif /* EXPORT is required for linking on windows as they are referenced by mod-str.c */ QSE_EXPORT int qse_awk_fnc_gsub (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi); diff --git a/qse/lib/awk/misc.c b/qse/lib/awk/misc.c index 88e88834..c23d0ed3 100644 --- a/qse/lib/awk/misc.c +++ b/qse/lib/awk/misc.c @@ -88,17 +88,18 @@ qse_wchar_t* qse_awk_mbstowcsdup (qse_awk_t* awk, const qse_mchar_t* mbs, qse_si /* if i use qse_mbstowcsdupwithcmgr(), i cannot pinpoint the exact failure cause. * let's do it differently. */ - if (qse_mbstowcswithcmgr(mbs, &mbslen, QSE_NULL, &wcslen, awk->_cmgr) <= -1) + if (qse_mbstowcswithcmgr(mbs, &mbslen, QSE_NULL, &wcslen, qse_awk_getcmgr(awk)) <= -1) { qse_awk_seterrnum (awk, QSE_AWK_EINVAL, QSE_NULL); return QSE_NULL; } - wcs = qse_awk_allocmem(awk, QSE_SIZEOF(*wcs) * (wcslen + 1)); + wcslen = wcslen + 1; /* for terminating null */ + + wcs = qse_awk_allocmem(awk, QSE_SIZEOF(*wcs) * wcslen); if (!wcs) return QSE_NULL; - wcslen = wcslen + 1; - qse_mbstowcswithcmgr (mbs, &mbslen, wcs, &wcslen, awk->_cmgr); + qse_mbstowcswithcmgr (mbs, &mbslen, wcs, &wcslen, qse_awk_getcmgr(awk)); if (_wcslen) *_wcslen = wcslen; return wcs; } @@ -108,7 +109,56 @@ qse_mchar_t* qse_awk_wcstombsdup (qse_awk_t* awk, const qse_wchar_t* wcs, qse_si qse_size_t mbslen, wcslen; qse_mchar_t* mbs; - if (qse_wcstombswithcmgr(wcs, &wcslen, QSE_NULL, &mbslen, awk->_cmgr) <= -1) + if (qse_wcstombswithcmgr(wcs, &wcslen, QSE_NULL, &mbslen, qse_awk_getcmgr(awk)) <= -1) + { + qse_awk_seterrnum (awk, QSE_AWK_EINVAL, QSE_NULL); + return QSE_NULL; + } + + mbslen = mbslen + 1; /* for terminating null */ + + mbs = qse_awk_allocmem(awk, QSE_SIZEOF(*mbs) * mbslen); + if (!mbs) return QSE_NULL; + + qse_wcstombswithcmgr (wcs, &wcslen, mbs, &mbslen, qse_awk_getcmgr(awk)); + if (_mbslen) *_mbslen = mbslen; + return mbs; +} + + +qse_wchar_t* qse_awk_mbsntowcsdup (qse_awk_t* awk, const qse_mchar_t* mbs, qse_size_t _mbslen, qse_size_t* _wcslen) +{ + qse_size_t mbslen, wcslen; + qse_wchar_t* wcs; + + /* if i use qse_mbstowcsdupwithcmgr(), i cannot pinpoint the exact failure cause. + * let's do it differently. */ + mbslen = _mbslen; + if (qse_mbsntowcsnwithcmgr(mbs, &mbslen, QSE_NULL, &wcslen, qse_awk_getcmgr(awk)) <= -1) + { + qse_awk_seterrnum (awk, QSE_AWK_EINVAL, QSE_NULL); + return QSE_NULL; + } + + wcs = qse_awk_allocmem(awk, QSE_SIZEOF(*wcs) * (wcslen + 1)); + if (!wcs) return QSE_NULL; + + mbslen= _mbslen; + qse_mbsntowcsnwithcmgr (mbs, &mbslen, wcs, &wcslen, qse_awk_getcmgr(awk)); + wcs[wcslen] = QSE_WT('\0'); + + if (_wcslen) *_wcslen = wcslen; + return wcs; +} + + +qse_mchar_t* qse_awk_wcsntombsdup (qse_awk_t* awk, const qse_wchar_t* wcs, qse_size_t _wcslen, qse_size_t* _mbslen) +{ + qse_size_t mbslen, wcslen; + qse_mchar_t* mbs; + + wcslen = _wcslen; + if (qse_wcsntombsnwithcmgr(wcs, &wcslen, QSE_NULL, &mbslen, qse_awk_getcmgr(awk)) <= -1) { qse_awk_seterrnum (awk, QSE_AWK_EINVAL, QSE_NULL); return QSE_NULL; @@ -117,8 +167,10 @@ qse_mchar_t* qse_awk_wcstombsdup (qse_awk_t* awk, const qse_wchar_t* wcs, qse_si mbs = qse_awk_allocmem(awk, QSE_SIZEOF(*mbs) * (mbslen + 1)); if (!mbs) return QSE_NULL; - mbslen = mbslen + 1; - qse_wcstombswithcmgr (wcs, &wcslen, mbs, &mbslen, awk->_cmgr); + wcslen = _wcslen; + qse_wcsntombsnwithcmgr (wcs, &wcslen, mbs, &mbslen, qse_awk_getcmgr(awk)); + mbs[mbslen] = QSE_MT('\0'); + if (_mbslen) *_mbslen = mbslen; return mbs; } diff --git a/qse/lib/awk/mod-str.c b/qse/lib/awk/mod-str.c index 58375551..cfd6d998 100644 --- a/qse/lib/awk/mod-str.c +++ b/qse/lib/awk/mod-str.c @@ -401,7 +401,7 @@ static int fnc_frommbs (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) qse_cstr_t str; str.ptr = qse_awk_rtx_getvalstrwithcmgr(rtx, a0, &str.len, cmgr); if (!str.ptr) return -1; - r = qse_awk_rtx_makestrvalwithxstr(rtx, &str); + r = qse_awk_rtx_makestrvalwithcstr(rtx, &str); qse_awk_rtx_freevalstr (rtx, a0, str.ptr); if (!r) return -1; break; @@ -457,7 +457,7 @@ static int fnc_tombs (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) qse_mcstr_t str; str.ptr = qse_awk_rtx_getvalmbswithcmgr(rtx, a0, &str.len, cmgr); if (!str.ptr) return -1; - r = qse_awk_rtx_makembsvalwithmxstr(rtx, &str); + r = qse_awk_rtx_makembsvalwithmcstr(rtx, &str); qse_awk_rtx_freevalmbs (rtx, a0, str.ptr); if (!r) return -1; break; diff --git a/qse/lib/awk/parse.c b/qse/lib/awk/parse.c index 2b7c58e2..eb49d69d 100644 --- a/qse/lib/awk/parse.c +++ b/qse/lib/awk/parse.c @@ -1227,7 +1227,7 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk) /* note that i'm assigning to rederr in the 'if' conditions below. * i'm not checking equality */ /* check if it is a builtin function */ - if ((qse_awk_findfnc (awk, &name) != QSE_NULL && (rederr = QSE_AWK_EFNCRED)) || + if ((qse_awk_findfncwithcstr(awk, &name) != QSE_NULL && (rederr = QSE_AWK_EFNCRED)) || /* check if it has already been defined as a function */ (qse_htb_search (awk->tree.funs, name.ptr, name.len) != QSE_NULL && (rederr = QSE_AWK_EFUNRED)) || /* check if it conflicts with a named variable */ @@ -1830,7 +1830,7 @@ static int add_global (qse_awk_t* awk, const qse_cstr_t* name, qse_awk_loc_t* xl } /* check if it conflicts with a builtin function name */ - if (qse_awk_findfnc(awk, name) != QSE_NULL) + if (qse_awk_findfncwithcstr(awk, name) != QSE_NULL) { SETERR_ARG_LOC (awk, QSE_AWK_EFNCRED, name->ptr, name->len, xloc); return -1; @@ -2225,7 +2225,7 @@ static qse_awk_t* collect_locals (qse_awk_t* awk, qse_size_t nlcls, int istop) /* check if it conflicts with a builtin function name * function f() { local length; } */ - if (qse_awk_findfnc (awk, &lcl) != QSE_NULL) + if (qse_awk_findfncwithcstr(awk, &lcl) != QSE_NULL) { SETERR_ARG_LOC (awk, QSE_AWK_EFNCRED, lcl.ptr, lcl.len, &awk->tok.loc); return QSE_NULL; @@ -4500,7 +4500,7 @@ static QSE_INLINE int isfunname (qse_awk_t* awk, const qse_cstr_t* name, qse_awk static QSE_INLINE int isfnname (qse_awk_t* awk, const qse_cstr_t* name) { - if (qse_awk_findfnc(awk, name) != QSE_NULL) + if (qse_awk_findfncwithcstr(awk, name) != QSE_NULL) { /* implicit function */ return FNTYPE_FNC; @@ -5223,7 +5223,7 @@ static qse_awk_nde_t* parse_primary_ident_noseg (qse_awk_t* awk, const qse_awk_l qse_awk_nde_t* nde = QSE_NULL; /* check if name is an intrinsic function name */ - fnc = qse_awk_findfnc(awk, name); + fnc = qse_awk_findfncwithcstr(awk, name); if (fnc) { if (MATCH(awk,TOK_LPAREN) || fnc->dfl0) diff --git a/qse/lib/awk/rec.c b/qse/lib/awk/rec.c index 49f0a32a..e9d9fc85 100644 --- a/qse/lib/awk/rec.c +++ b/qse/lib/awk/rec.c @@ -54,7 +54,7 @@ int qse_awk_rtx_setrec ( } } - v = qse_awk_rtx_makenstrvalwithxstr (run, str); + v = qse_awk_rtx_makenstrvalwithcstr (run, str); if (v == QSE_NULL) { @@ -83,7 +83,7 @@ int qse_awk_rtx_setrec ( } /* recompose $0 */ - v = qse_awk_rtx_makestrvalwithxstr (run, QSE_STR_XSTR(&run->inrec.line)); + v = qse_awk_rtx_makestrvalwithcstr (run, QSE_STR_XSTR(&run->inrec.line)); if (v == QSE_NULL) { qse_awk_rtx_clrrec (run, 0); @@ -321,7 +321,7 @@ static int split_record (qse_awk_rtx_t* rtx) rtx->inrec.flds[rtx->inrec.nflds].ptr = tok.ptr; rtx->inrec.flds[rtx->inrec.nflds].len = tok.len; - rtx->inrec.flds[rtx->inrec.nflds].val = qse_awk_rtx_makenstrvalwithxstr (rtx, &tok); + rtx->inrec.flds[rtx->inrec.nflds].val = qse_awk_rtx_makenstrvalwithcstr (rtx, &tok); if (rtx->inrec.flds[rtx->inrec.nflds].val == QSE_NULL) { @@ -446,7 +446,7 @@ static int recomp_record_fields (qse_awk_rtx_t* run, qse_size_t lv, const qse_cs return -1; } - tmp = qse_awk_rtx_makestrvalwithxstr (run, str); + tmp = qse_awk_rtx_makestrvalwithcstr (run, str); if (tmp == QSE_NULL) return -1; if (i < nflds) diff --git a/qse/lib/awk/run.c b/qse/lib/awk/run.c index 89fc0207..2e693518 100644 --- a/qse/lib/awk/run.c +++ b/qse/lib/awk/run.c @@ -6754,7 +6754,7 @@ read_console_again: { qse_awk_val_t* v; - v = qse_awk_rtx_makestrvalwithxstr(rtx, QSE_STR_XSTR(buf)); + v = qse_awk_rtx_makestrvalwithcstr(rtx, QSE_STR_XSTR(buf)); if (v == QSE_NULL) { ADJERR_LOC (rtx, &nde->loc); @@ -6933,7 +6933,7 @@ static int shorten_record (qse_awk_rtx_t* rtx, qse_size_t nflds) if (ofs_free) qse_awk_rtx_freemem (rtx, ofs_free); if (nflds > 1) qse_awk_rtx_refdownval (rtx, v); - v = (qse_awk_val_t*)qse_awk_rtx_makestrvalwithxstr(rtx, QSE_STR_XSTR(&tmp)); + v = (qse_awk_val_t*)qse_awk_rtx_makestrvalwithcstr(rtx, QSE_STR_XSTR(&tmp)); if (!v) { qse_str_fini (&tmp); diff --git a/qse/lib/awk/val.c b/qse/lib/awk/val.c index debffe80..cf34219d 100644 --- a/qse/lib/awk/val.c +++ b/qse/lib/awk/val.c @@ -165,7 +165,7 @@ qse_awk_val_t* qse_awk_rtx_makefltval (qse_awk_rtx_t* rtx, qse_awk_flt_t v) return (qse_awk_val_t*)val; } -qse_awk_val_t* qse_awk_rtx_makestrvalwithxstr (qse_awk_rtx_t* rtx, const qse_cstr_t* str) +qse_awk_val_t* qse_awk_rtx_makestrvalwithcstr (qse_awk_rtx_t* rtx, const qse_cstr_t* str) { qse_awk_val_str_t* val = QSE_NULL; qse_size_t rlen = str->len; @@ -224,7 +224,7 @@ qse_awk_val_t* qse_awk_rtx_makestrvalwithmbs (qse_awk_rtx_t* rtx, const qse_mcha return QSE_NULL; } - v = qse_awk_rtx_makestrvalwithxstr (rtx, &tmp); + v = qse_awk_rtx_makestrvalwithcstr (rtx, &tmp); qse_awk_rtx_freemem (rtx, tmp.ptr); return v; #endif @@ -243,7 +243,7 @@ qse_awk_val_t* qse_awk_rtx_makestrvalwithwcs (qse_awk_rtx_t* rtx, const qse_wcha return QSE_NULL; } - v = qse_awk_rtx_makestrvalwithxstr (rtx, &tmp); + v = qse_awk_rtx_makestrvalwithcstr (rtx, &tmp); qse_awk_rtx_freemem (rtx, tmp.ptr); return v; #else @@ -256,10 +256,10 @@ qse_awk_val_t* qse_awk_rtx_makestrvalwithstr (qse_awk_rtx_t* rtx, const qse_char return qse_awk_rtx_makestrval(rtx, str, qse_strlen(str)); } -qse_awk_val_t* qse_awk_rtx_makestrvalwithmxstr (qse_awk_rtx_t* rtx, const qse_mcstr_t* mxstr) +qse_awk_val_t* qse_awk_rtx_makestrvalwithmcstr (qse_awk_rtx_t* rtx, const qse_mcstr_t* mxstr) { #if defined(QSE_CHAR_IS_MCHAR) - return qse_awk_rtx_makestrvalwithxstr(rtx, mxstr); + return qse_awk_rtx_makestrvalwithcstr(rtx, mxstr); #else qse_awk_val_t* v; qse_wcstr_t tmp; @@ -273,13 +273,13 @@ qse_awk_val_t* qse_awk_rtx_makestrvalwithmxstr (qse_awk_rtx_t* rtx, const qse_mc return QSE_NULL; } - v = qse_awk_rtx_makestrvalwithxstr(rtx, &tmp); + v = qse_awk_rtx_makestrvalwithcstr(rtx, &tmp); qse_awk_rtx_freemem (rtx, tmp.ptr); return v; #endif } -qse_awk_val_t* qse_awk_rtx_makestrvalwithwxstr (qse_awk_rtx_t* rtx, const qse_wcstr_t* wxstr) +qse_awk_val_t* qse_awk_rtx_makestrvalwithwcstr (qse_awk_rtx_t* rtx, const qse_wcstr_t* wxstr) { #if defined(QSE_CHAR_IS_MCHAR) qse_awk_val_t* v; @@ -294,11 +294,11 @@ qse_awk_val_t* qse_awk_rtx_makestrvalwithwxstr (qse_awk_rtx_t* rtx, const qse_wc return QSE_NULL; } - v = qse_awk_rtx_makestrvalwithxstr(rtx, &tmp); + v = qse_awk_rtx_makestrvalwithcstr(rtx, &tmp); qse_awk_rtx_freemem (rtx, tmp.ptr); return v; #else - return qse_awk_rtx_makestrvalwithxstr(rtx, wxstr); + return qse_awk_rtx_makestrvalwithcstr(rtx, wxstr); #endif } @@ -307,7 +307,7 @@ qse_awk_val_t* qse_awk_rtx_makestrval (qse_awk_rtx_t* rtx, const qse_char_t* str qse_cstr_t xstr; xstr.ptr = (qse_char_t*)str; xstr.len = len; - return qse_awk_rtx_makestrvalwithxstr(rtx, &xstr); + return qse_awk_rtx_makestrvalwithcstr(rtx, &xstr); } qse_awk_val_t* qse_awk_rtx_makestrval2 (qse_awk_rtx_t* rtx, const qse_char_t* str1, qse_size_t len1, const qse_char_t* str2, qse_size_t len2) @@ -357,10 +357,10 @@ qse_awk_val_t* qse_awk_rtx_makenstrvalwithstr (qse_awk_rtx_t* rtx, const qse_cha qse_cstr_t xstr; xstr.ptr = (qse_char_t*)str; xstr.len = qse_strlen(str); - return qse_awk_rtx_makenstrvalwithxstr (rtx, &xstr); + return qse_awk_rtx_makenstrvalwithcstr (rtx, &xstr); } -qse_awk_val_t* qse_awk_rtx_makenstrvalwithxstr (qse_awk_rtx_t* rtx, const qse_cstr_t* str) +qse_awk_val_t* qse_awk_rtx_makenstrvalwithcstr (qse_awk_rtx_t* rtx, const qse_cstr_t* str) { int x; qse_awk_val_t* v; @@ -368,7 +368,7 @@ qse_awk_val_t* qse_awk_rtx_makenstrvalwithxstr (qse_awk_rtx_t* rtx, const qse_cs qse_awk_flt_t r; x = qse_awk_rtx_strtonum(rtx, QSE_AWK_RTX_STRTONUM_MAKE_OPTION(1, 0), str->ptr, str->len, &l, &r); - v = qse_awk_rtx_makestrvalwithxstr(rtx, str); + v = qse_awk_rtx_makestrvalwithcstr(rtx, str); if (v == QSE_NULL) return QSE_NULL; @@ -408,7 +408,7 @@ qse_awk_val_t* qse_awk_rtx_makembsval (qse_awk_rtx_t* rtx, const qse_mchar_t* pt return (qse_awk_val_t*)val; } -qse_awk_val_t* qse_awk_rtx_makembsvalwithmxstr (qse_awk_rtx_t* rtx, const qse_mcstr_t* mxstr) +qse_awk_val_t* qse_awk_rtx_makembsvalwithmcstr (qse_awk_rtx_t* rtx, const qse_mcstr_t* mxstr) { return qse_awk_rtx_makembsval(rtx, mxstr->ptr, mxstr->len); } @@ -566,17 +566,17 @@ qse_awk_val_t* qse_awk_rtx_makemapvalwithdata (qse_awk_rtx_t* rtx, qse_awk_val_m case QSE_AWK_VAL_MAP_DATA_XSTR: case QSE_AWK_VAL_MAP_DATA_CSTR: - tmp = qse_awk_rtx_makestrvalwithxstr(rtx, (qse_cstr_t*)p->vptr); + tmp = qse_awk_rtx_makestrvalwithcstr(rtx, (qse_cstr_t*)p->vptr); break; case QSE_AWK_VAL_MAP_DATA_MXSTR: case QSE_AWK_VAL_MAP_DATA_MCSTR: - tmp = qse_awk_rtx_makestrvalwithmxstr(rtx, (qse_mcstr_t*)p->vptr); + tmp = qse_awk_rtx_makestrvalwithmcstr(rtx, (qse_mcstr_t*)p->vptr); break; case QSE_AWK_VAL_MAP_DATA_WXSTR: case QSE_AWK_VAL_MAP_DATA_WCSTR: - tmp = qse_awk_rtx_makestrvalwithwxstr(rtx, (qse_wcstr_t*)p->vptr); + tmp = qse_awk_rtx_makestrvalwithwcstr(rtx, (qse_wcstr_t*)p->vptr); break; default: diff --git a/qse/lib/awkmod/mod-sed.c b/qse/lib/awkmod/mod-sed.c index b032fda9..8a20a108 100644 --- a/qse/lib/awkmod/mod-sed.c +++ b/qse/lib/awkmod/mod-sed.c @@ -182,7 +182,7 @@ static int fnc_str_to_str (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) goto oops; } - tmp = qse_awk_rtx_makestrvalwithxstr (rtx, &outstr); + tmp = qse_awk_rtx_makestrvalwithcstr (rtx, &outstr); qse_sed_freemem (sed, outstr.ptr); if (!tmp) diff --git a/qse/lib/cmn/mbwc-str.c b/qse/lib/cmn/mbwc-str.c index b710d997..c15c6622 100644 --- a/qse/lib/cmn/mbwc-str.c +++ b/qse/lib/cmn/mbwc-str.c @@ -518,7 +518,7 @@ qse_mchar_t* qse_wcstombsdupwithcmgr ( ml++; /* for the terminating null character */ - mbs = QSE_MMGR_ALLOC (mmgr, ml * QSE_SIZEOF(*mbs)); + mbs = QSE_MMGR_ALLOC(mmgr, ml * QSE_SIZEOF(*mbs)); if (mbs == QSE_NULL) return QSE_NULL; qse_wcstombswithcmgr (wcs, &wl, mbs, &ml, cmgr); @@ -531,15 +531,17 @@ qse_mchar_t* qse_wcsntombsdupwithcmgr ( const qse_wchar_t* wcs, qse_size_t wcslen, qse_size_t* mbslen, qse_mmgr_t* mmgr, qse_cmgr_t* cmgr) { - qse_size_t ml; + qse_size_t wl, ml; qse_mchar_t* mbs; - if (qse_wcsntombsnwithcmgr (wcs, &wcslen, QSE_NULL, &ml, cmgr) <= -1) return QSE_NULL; + wl = wcslen; + if (qse_wcsntombsnwithcmgr(wcs, &wl, QSE_NULL, &ml, cmgr) <= -1) return QSE_NULL; mbs = QSE_MMGR_ALLOC (mmgr, (ml + 1) * QSE_SIZEOF(*mbs)); if (mbs == QSE_NULL) return QSE_NULL; - qse_wcsntombsnwithcmgr (wcs, &wcslen, mbs, &ml, cmgr); + wl = wcslen; + qse_wcsntombsnwithcmgr (wcs, &wl, mbs, &ml, cmgr); mbs[ml] = QSE_MT('\0'); if (mbslen) *mbslen = ml; diff --git a/qse/regress/awk/regress.out b/qse/regress/awk/regress.out index eed580a6..6cd3f716 100644 --- a/qse/regress/awk/regress.out +++ b/qse/regress/awk/regress.out @@ -937,7 +937,7 @@ my hello my hello my hello my hello -ERROR: CODE 17 LINE 6 COLUMN 1 FILE /home/hyung-hwan/workspace/qse/bld/x86_64-linux-wchar-debug-shared/../../regress/awk/lang-002.awk - block nested too deeply +ERROR: CODE 17 LINE 6 COLUMN 1 FILE lang-002.awk - block nested too deeply -------------------------------------------------------------------------------- [CMD] qseawk --newline=on -d- -f lang-003.awk &1 -------------------------------------------------------------------------------- @@ -956,7 +956,7 @@ BEGIN { -------------------------------------------------------------------------------- [CMD] qseawk --newline=on -d- -f lang-004.awk &1 -------------------------------------------------------------------------------- -ERROR: CODE 44 LINE 3 COLUMN 9 FILE /home/hyung-hwan/workspace/qse/bld/x86_64-linux-wchar-debug-shared/../../regress/awk/lang-004.awk - function 'a' redefined +ERROR: CODE 44 LINE 3 COLUMN 9 FILE lang-004.awk - function 'a' redefined -------------------------------------------------------------------------------- [CMD] qseawk --implicit=off --newline=on -d- -f lang-005.awk &1 -------------------------------------------------------------------------------- @@ -984,7 +984,7 @@ BEGIN { -------------------------------------------------------------------------------- [CMD] qseawk --implicit=off --newline=on -d- -f lang-006.awk &1 -------------------------------------------------------------------------------- -ERROR: CODE 45 LINE 5 COLUMN 10 FILE /home/hyung-hwan/workspace/qse/bld/x86_64-linux-wchar-debug-shared/../../regress/awk/lang-006.awk - global variable 'a' redefined +ERROR: CODE 45 LINE 5 COLUMN 10 FILE lang-006.awk - global variable 'a' redefined -------------------------------------------------------------------------------- [CMD] qseawk --implicit=on --newline=on -d- -f lang-007.awk &1 -------------------------------------------------------------------------------- @@ -1352,7 +1352,7 @@ BEGIN { printf ("%s\n",10.34); } -ERROR: CODE 110 LINE 3 COLUMN 2 FILE /home/hyung-hwan/workspace/qse/bld/x86_64-linux-wchar-debug-shared/../../regress/awk/lang-013.awk - recursion detected in format conversion +ERROR: CODE 110 LINE 3 COLUMN 2 FILE lang-013.awk - recursion detected in format conversion -------------------------------------------------------------------------------- [CMD] qseawk --newline=on -d- -f lang-014.awk &1 -------------------------------------------------------------------------------- @@ -1367,7 +1367,7 @@ BEGIN { -------------------------------------------------------------------------------- [CMD] qseawk --newline=on -d- -f lang-015.awk &1 -------------------------------------------------------------------------------- -ERROR: CODE 17 LINE 3 COLUMN 50 FILE /home/hyung-hwan/workspace/qse/bld/x86_64-linux-wchar-debug-shared/../../regress/awk/lang-015.awk - block nested too deeply +ERROR: CODE 17 LINE 3 COLUMN 50 FILE lang-015.awk - block nested too deeply -------------------------------------------------------------------------------- [CMD] qseawk --newline=on -d- -f lang-016.awk &1 -------------------------------------------------------------------------------- @@ -1481,27 +1481,27 @@ END { -------------------------------------------------------------------------------- [CMD] qseawk --newline=on -d- -f lang-018.awk &1 -------------------------------------------------------------------------------- -ERROR: CODE 49 LINE 1 COLUMN 9 FILE /home/hyung-hwan/workspace/qse/bld/x86_64-linux-wchar-debug-shared/../../regress/awk/lang-018.awk - duplicate global variable 'ARGV' +ERROR: CODE 49 LINE 1 COLUMN 9 FILE lang-018.awk - duplicate global variable 'ARGV' -------------------------------------------------------------------------------- [CMD] qseawk --newline=on -d- -f lang-019.awk &1 -------------------------------------------------------------------------------- -ERROR: CODE 51 LINE 1 COLUMN 15 FILE /home/hyung-hwan/workspace/qse/bld/x86_64-linux-wchar-debug-shared/../../regress/awk/lang-019.awk - '+' not a valid parameter name +ERROR: CODE 51 LINE 1 COLUMN 15 FILE lang-019.awk - '+' not a valid parameter name -------------------------------------------------------------------------------- [CMD] qseawk --newline=on -d- -f lang-020.awk &1 -------------------------------------------------------------------------------- -ERROR: CODE 52 LINE 1 COLUMN 9 FILE /home/hyung-hwan/workspace/qse/bld/x86_64-linux-wchar-debug-shared/../../regress/awk/lang-020.awk - '+' not a valid variable name +ERROR: CODE 52 LINE 1 COLUMN 9 FILE lang-020.awk - '+' not a valid variable name -------------------------------------------------------------------------------- [CMD] qseawk --newline=on -d- -f lang-021.awk &1 -------------------------------------------------------------------------------- -ERROR: CODE 52 LINE 3 COLUMN 9 FILE /home/hyung-hwan/workspace/qse/bld/x86_64-linux-wchar-debug-shared/../../regress/awk/lang-021.awk - '+' not a valid variable name +ERROR: CODE 52 LINE 3 COLUMN 9 FILE lang-021.awk - '+' not a valid variable name -------------------------------------------------------------------------------- [CMD] qseawk --newline=on -d- -f lang-022.awk &1 -------------------------------------------------------------------------------- -ERROR: CODE 25 LINE 2 COLUMN 9 FILE /home/hyung-hwan/workspace/qse/bld/x86_64-linux-wchar-debug-shared/../../regress/awk/lang-022.awk - left parenthesis expected in place of '=' +ERROR: CODE 25 LINE 2 COLUMN 9 FILE lang-022.awk - left parenthesis expected in place of '=' -------------------------------------------------------------------------------- [CMD] qseawk --newline=on -d- -f lang-023.awk &1 -------------------------------------------------------------------------------- -ERROR: CODE 30 LINE 5 COLUMN 20 FILE /home/hyung-hwan/workspace/qse/bld/x86_64-linux-wchar-debug-shared/../../regress/awk/lang-023.awk - colon expected in place of ';' +ERROR: CODE 30 LINE 5 COLUMN 20 FILE lang-023.awk - colon expected in place of ';' -------------------------------------------------------------------------------- [CMD] qseawk --newline=on -d- -f lang-024.awk &1 -------------------------------------------------------------------------------- @@ -1533,7 +1533,7 @@ BEGIN { delete iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiix; } -ERROR: CODE 81 LINE 3 COLUMN 9 FILE /home/hyung-hwan/workspace/qse/bld/x86_64-linux-wchar-debug-shared/../../regress/awk/lang-025.awk - 'iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiix' not deletable +ERROR: CODE 81 LINE 3 COLUMN 9 FILE lang-025.awk - 'iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiix' not deletable -------------------------------------------------------------------------------- [CMD] qseawk --newline=on -d- -f lang-026.awk &1 -------------------------------------------------------------------------------- @@ -1549,15 +1549,15 @@ abc -------------------------------------------------------------------------------- [CMD] qseawk --newline=on -d- -f lang-027.awk &1 -------------------------------------------------------------------------------- -ERROR: CODE 19 LINE 2 COLUMN 1 FILE /home/hyung-hwan/workspace/qse/bld/x86_64-linux-wchar-debug-shared/../../regress/awk/lang-027.awk - invalid character '' +ERROR: CODE 19 LINE 2 COLUMN 1 FILE lang-027.awk - invalid character '' -------------------------------------------------------------------------------- [CMD] qseawk --newline=on -d- -f lang-028.awk &1 -------------------------------------------------------------------------------- -ERROR: CODE 43 LINE 2 COLUMN 10 FILE /home/hyung-hwan/workspace/qse/bld/x86_64-linux-wchar-debug-shared/../../regress/awk/lang-028.awk - intrinsic function 'substr' redefined +ERROR: CODE 43 LINE 2 COLUMN 10 FILE lang-028.awk - intrinsic function 'substr' redefined -------------------------------------------------------------------------------- [CMD] qseawk --newline=on -d- -f lang-029.awk &1 -------------------------------------------------------------------------------- -ERROR: CODE 44 LINE 9 COLUMN 10 FILE /home/hyung-hwan/workspace/qse/bld/x86_64-linux-wchar-debug-shared/../../regress/awk/lang-029.awk - function 'abc' redefined +ERROR: CODE 44 LINE 9 COLUMN 10 FILE lang-029.awk - function 'abc' redefined -------------------------------------------------------------------------------- [CMD] qseawk --newline=on -d- -f lang-030.awk &1 -------------------------------------------------------------------------------- @@ -1667,7 +1667,7 @@ BEGIN { --------------------- 9210 -------------------------------------------------------------------------------- -[CMD] qseawk --newline=on -d- -vdatadir=/home/hyung-hwan/workspace/qse/bld/x86_64-linux-wchar-debug-shared/../../regress/awk -vdatafile=passwd.dat -f lang-033.awk &1 +[CMD] qseawk --newline=on -d- -vdatadir=awk -vdatafile=passwd.dat -f lang-033.awk &1 -------------------------------------------------------------------------------- BEGIN { while (((((("cat " datadir) "/") datafile) | getline x) > 0)) @@ -1734,7 +1734,7 @@ xx: 13 xx: 14 xx: 15 -------------------------------------------------------------------------------- -[CMD] qseawk --newline=on -d- -vdatadir=/home/hyung-hwan/workspace/qse/bld/x86_64-linux-wchar-debug-shared/../../regress/awk -vdatafile=lang-035.dat1 -vgroupname=lang-035 -f lang-035.awk lang-035.dat2 &1 +[CMD] qseawk --newline=on -d- -vdatadir=awk -vdatafile=lang-035.dat1 -vgroupname=lang-035 -f lang-035.awk lang-035.dat2 &1 -------------------------------------------------------------------------------- BEGIN { max_cid_vars = 100; @@ -2344,7 +2344,7 @@ nan 8103.08 3 -------------------------------------------------------------------------------- -[CMD] qseawk --newline=on -d- -vdatadir=/home/hyung-hwan/workspace/qse/bld/x86_64-linux-wchar-debug-shared/../../regress/awk -vdatafile=lang-046.dat1 -f lang-046.awk lang-046.dat2 &1 +[CMD] qseawk --newline=on -d- -vdatadir=awk -vdatafile=lang-046.dat1 -f lang-046.awk lang-046.dat2 &1 -------------------------------------------------------------------------------- 1 @@ -2456,7 +2456,7 @@ BEGIN { -------------------------------------------------------------------------------- [CMD] qseawk --newline=on -d- -f lang-049.awk &1 -------------------------------------------------------------------------------- -ERROR: CODE 62 LINE 2 COLUMN 9 FILE /home/hyung-hwan/workspace/qse/bld/x86_64-linux-wchar-debug-shared/../../regress/awk/lang-049.awk - no argument provided +ERROR: CODE 62 LINE 2 COLUMN 9 FILE lang-049.awk - no argument provided -------------------------------------------------------------------------------- [CMD] qseawk --newline=on --flexmap=off -d- -f lang-050.awk &1 -------------------------------------------------------------------------------- @@ -2467,7 +2467,7 @@ BEGIN { print i,a[i]; } -ERROR: CODE 91 LINE 6 COLUMN 2 FILE /home/hyung-hwan/workspace/qse/bld/x86_64-linux-wchar-debug-shared/../../regress/awk/lang-050.awk - cannot change a scalar to a map +ERROR: CODE 91 LINE 6 COLUMN 2 FILE lang-050.awk - cannot change a scalar to a map -------------------------------------------------------------------------------- [CMD] qseawk --newline=on --flexmap=on -d- -f lang-050.awk &1 -------------------------------------------------------------------------------- @@ -2488,7 +2488,7 @@ BEGIN { print i,ARGC[i]; } -ERROR: CODE 94 LINE 7 COLUMN 2 FILE /home/hyung-hwan/workspace/qse/bld/x86_64-linux-wchar-debug-shared/../../regress/awk/lang-051.awk - cannot change a scalar 'ARGC' to a map +ERROR: CODE 94 LINE 7 COLUMN 2 FILE lang-051.awk - cannot change a scalar 'ARGC' to a map -------------------------------------------------------------------------------- [CMD] qseawk --newline=on --flexmap=on -d- -f lang-051.awk &1 -------------------------------------------------------------------------------- @@ -2544,7 +2544,7 @@ BEGIN { print i,a[i]; } -ERROR: CODE 92 LINE 10 COLUMN 2 FILE /home/hyung-hwan/workspace/qse/bld/x86_64-linux-wchar-debug-shared/../../regress/awk/lang-053.awk - cannot change a map 'a' to another map +ERROR: CODE 92 LINE 10 COLUMN 2 FILE lang-053.awk - cannot change a map 'a' to another map -------------------------------------------------------------------------------- [CMD] qseawk --newline=on --flexmap=on -d- -f lang-053.awk &1 -------------------------------------------------------------------------------- @@ -2568,7 +2568,7 @@ BEGIN { print ARGV; } -ERROR: CODE 93 LINE 4 COLUMN 8 FILE /home/hyung-hwan/workspace/qse/bld/x86_64-linux-wchar-debug-shared/../../regress/awk/lang-054.awk - cannot change a map 'ARGV' to a scalar +ERROR: CODE 93 LINE 4 COLUMN 8 FILE lang-054.awk - cannot change a map 'ARGV' to a scalar -------------------------------------------------------------------------------- [CMD] qseawk --newline=on --flexmap=on -d- -f lang-054.awk &1 -------------------------------------------------------------------------------- @@ -2666,7 +2666,7 @@ Result Ra Rb Connect Error 1.E12 99X -------------------------------------------------------------------------------- -[CMD] qseawk -vQSEAWK="/home/hyung-hwan/workspace/qse/bld/x86_64-linux-wchar-debug-shared/cmd/awk/.libs/qseawk" -vSCRIPT_PATH="/home/hyung-hwan/workspace/qse/bld/x86_64-linux-wchar-debug-shared/../../regress/awk" -f quicksort2.awk quicksort2.dat &1 +[CMD] qseawk -vQSEAWK="/home/hyung-hwan/workspace/qse/bld/x86_64-linux-wchar-debug-shared/cmd/awk/.libs/qseawk" -vSCRIPT_PATH="awk" -f quicksort2.awk quicksort2.dat &1 -------------------------------------------------------------------------------- 0.0000000000 0.11111111111111111111111111111