From 7423092c395c9c82ee90bd84dd80629f8f2d0f02 Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Tue, 1 Jul 2014 15:27:27 +0000 Subject: [PATCH] removed most math functions from the main engine. migrated them to the math module --- qse/include/qse/awk/Awk.hpp | 18 -- qse/include/qse/awk/StdAwk.hpp | 9 - qse/include/qse/awk/awk.h | 19 ++- qse/lib/awk/Awk.cpp | 63 ------- qse/lib/awk/StdAwk.cpp | 146 ---------------- qse/lib/awk/awk.c | 24 +-- qse/lib/awk/fnc.c | 118 ++----------- qse/lib/awk/fnc.h | 19 +-- qse/lib/awk/mod-math.c | 303 ++++++++++++++++++++++++++++++--- qse/lib/awk/parse.c | 51 ++++-- qse/lib/awk/std.c | 153 ----------------- 11 files changed, 341 insertions(+), 582 deletions(-) diff --git a/qse/include/qse/awk/Awk.hpp b/qse/include/qse/awk/Awk.hpp index 12df3d1b..0216f113 100644 --- a/qse/include/qse/awk/Awk.hpp +++ b/qse/include/qse/awk/Awk.hpp @@ -1288,15 +1288,6 @@ protected: // primitive handlers virtual flt_t pow (flt_t x, flt_t y) = 0; virtual flt_t mod (flt_t x, flt_t y) = 0; - virtual flt_t sin (flt_t x) = 0; - virtual flt_t cos (flt_t x) = 0; - virtual flt_t tan (flt_t x) = 0; - virtual flt_t atan (flt_t x) = 0; - virtual flt_t atan2 (flt_t x, flt_t y) = 0; - virtual flt_t log (flt_t x) = 0; - virtual flt_t log10 (flt_t x) = 0; - virtual flt_t exp (flt_t x) = 0; - virtual flt_t sqrt (flt_t x) = 0; virtual void* modopen (const mod_spec_t* spec) = 0; virtual void modclose (void* handle) = 0; @@ -1325,15 +1316,6 @@ protected: static flt_t pow (awk_t* awk, flt_t x, flt_t y); static flt_t mod (awk_t* awk, flt_t x, flt_t y); - static flt_t sin (awk_t* awk, flt_t x); - static flt_t cos (awk_t* awk, flt_t x); - static flt_t tan (awk_t* awk, flt_t x); - static flt_t atan (awk_t* awk, flt_t x); - static flt_t atan2 (awk_t* awk, flt_t x, flt_t y); - static flt_t log (awk_t* awk, flt_t x); - static flt_t log10 (awk_t* awk, flt_t x); - static flt_t exp (awk_t* awk, flt_t x); - static flt_t sqrt (awk_t* awk, flt_t x); static void* modopen (awk_t* awk, const mod_spec_t* spec); static void modclose (awk_t* awk, void* handle); diff --git a/qse/include/qse/awk/StdAwk.hpp b/qse/include/qse/awk/StdAwk.hpp index 0f580db5..9f32ab95 100644 --- a/qse/include/qse/awk/StdAwk.hpp +++ b/qse/include/qse/awk/StdAwk.hpp @@ -158,15 +158,6 @@ protected: flt_t pow (flt_t x, flt_t y); flt_t mod (flt_t x, flt_t y); - flt_t sin (flt_t x); - flt_t cos (flt_t x); - flt_t tan (flt_t x); - flt_t atan (flt_t x); - flt_t atan2 (flt_t x, flt_t y); - flt_t log (flt_t x); - flt_t log10 (flt_t x); - flt_t exp (flt_t x); - flt_t sqrt (flt_t x); void* modopen (const mod_spec_t* spec); void modclose (void* handle); diff --git a/qse/include/qse/awk/awk.h b/qse/include/qse/awk/awk.h index 9f38f22f..4037b8ce 100644 --- a/qse/include/qse/awk/awk.h +++ b/qse/include/qse/awk/awk.h @@ -669,15 +669,6 @@ struct qse_awk_prm_t { qse_awk_math2_t pow; /**< floating-point power function */ qse_awk_math2_t mod; /**< floating-point remainder function */ - qse_awk_math1_t sin; - qse_awk_math1_t cos; - qse_awk_math1_t tan; - qse_awk_math1_t atan; - qse_awk_math2_t atan2; - qse_awk_math1_t log; - qse_awk_math1_t log10; - qse_awk_math1_t exp; - qse_awk_math1_t sqrt; } math; qse_awk_modopen_t modopen; @@ -786,6 +777,16 @@ struct qse_awk_fnc_spec_t qse_size_t min; /**< min. numbers of argument for a function */ qse_size_t max; /**< max. numbers of argument for a function */ const qse_char_t* spec; + /**< argument specifier + * if min is greater than max, spec points to an external module + * name where the function is found. otherwise, spec can be QSE_NULL + * to indicate all arguments are passed by value or point to a + * argument specification string composed of 'max' characters. + * Each character can be one of: + * - v: value + * - r: reference + * - x:regular expression + */ } arg; /** pointer to the function implementing this function */ diff --git a/qse/lib/awk/Awk.cpp b/qse/lib/awk/Awk.cpp index 2a462bff..cb1b334c 100644 --- a/qse/lib/awk/Awk.cpp +++ b/qse/lib/awk/Awk.cpp @@ -1118,15 +1118,6 @@ int Awk::open () QSE_MEMSET (&prm, 0, QSE_SIZEOF(prm)); prm.math.pow = pow; prm.math.mod = mod; - prm.math.sin = sin; - prm.math.cos = cos; - prm.math.tan = tan; - prm.math.atan = atan; - prm.math.atan2 = atan2; - prm.math.log = log; - prm.math.log10 = log10; - prm.math.exp = exp; - prm.math.sqrt = sqrt; prm.modopen = modopen; prm.modclose = modclose; prm.modsym = modsym; @@ -2011,60 +2002,6 @@ Awk::flt_t Awk::mod (awk_t* awk, flt_t x, flt_t y) return xtn->awk->mod (x, y); } -Awk::flt_t Awk::sin (awk_t* awk, flt_t x) -{ - xtn_t* xtn = (xtn_t*) QSE_XTN (awk); - return xtn->awk->sin (x); -} - -Awk::flt_t Awk::cos (awk_t* awk, flt_t x) -{ - xtn_t* xtn = (xtn_t*) QSE_XTN (awk); - return xtn->awk->cos (x); -} - -Awk::flt_t Awk::tan (awk_t* awk, flt_t x) -{ - xtn_t* xtn = (xtn_t*) QSE_XTN (awk); - return xtn->awk->tan (x); -} - -Awk::flt_t Awk::atan (awk_t* awk, flt_t x) -{ - xtn_t* xtn = (xtn_t*) QSE_XTN (awk); - return xtn->awk->atan (x); -} - -Awk::flt_t Awk::atan2 (awk_t* awk, flt_t x, flt_t y) -{ - xtn_t* xtn = (xtn_t*) QSE_XTN (awk); - return xtn->awk->atan2 (x, y); -} - -Awk::flt_t Awk::log (awk_t* awk, flt_t x) -{ - xtn_t* xtn = (xtn_t*) QSE_XTN (awk); - return xtn->awk->log (x); -} - -Awk::flt_t Awk::log10 (awk_t* awk, flt_t x) -{ - xtn_t* xtn = (xtn_t*) QSE_XTN (awk); - return xtn->awk->log10 (x); -} - -Awk::flt_t Awk::exp (awk_t* awk, flt_t x) -{ - xtn_t* xtn = (xtn_t*) QSE_XTN (awk); - return xtn->awk->exp (x); -} - -Awk::flt_t Awk::sqrt (awk_t* awk, flt_t x) -{ - xtn_t* xtn = (xtn_t*) QSE_XTN (awk); - return xtn->awk->sqrt (x); -} - void* Awk::modopen (awk_t* awk, const mod_spec_t* spec) { xtn_t* xtn = (xtn_t*) QSE_XTN (awk); diff --git a/qse/lib/awk/StdAwk.cpp b/qse/lib/awk/StdAwk.cpp index ee2c90b5..74aab436 100644 --- a/qse/lib/awk/StdAwk.cpp +++ b/qse/lib/awk/StdAwk.cpp @@ -64,15 +64,6 @@ extern "C" { // some gcc distros don't have extern "C" declared in the header fi # if defined(_WIN32) || defined(__OS2__) || defined(__DOS__) # define HAVE_POW # define HAVE_FMOD -# define HAVE_SIN -# define HAVE_COS -# define HAVE_TAN -# define HAVE_ATAN -# define HAVE_ATAN2 -# define HAVE_LOG -# define HAVE_LOG10 -# define HAVE_EXP -# define HAVE_SQRT # endif #endif @@ -1206,143 +1197,6 @@ StdAwk::flt_t StdAwk::mod (flt_t x, flt_t y) #endif } -StdAwk::flt_t StdAwk::sin (flt_t x) -{ -#if defined(QSE_USE_AWK_FLTMAX) && defined(HAVE_SINQ) - return ::sinq (x); -#elif defined(HAVE_SINL) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) - return ::sinl (x); -#elif defined(HAVE_SIN) - return ::sin (x); -#elif defined(HAVE_SINF) - return ::sinf (x); -#else - #error ### no sin function available ### -#endif -} - -StdAwk::flt_t StdAwk::cos (flt_t x) -{ -#if defined(QSE_USE_AWK_FLTMAX) && defined(HAVE_COSQ) - return ::cosq (x); -#elif defined(HAVE_COSL) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) - return ::cosl (x); -#elif defined(HAVE_COS) - return ::cos (x); -#elif defined(HAVE_COSF) - return ::cosf (x); -#else - #error ### no cos function available ### -#endif -} - -StdAwk::flt_t StdAwk::tan (flt_t x) -{ -#if defined(QSE_USE_AWK_FLTMAX) && defined(HAVE_TANQ) - return ::tanq (x); -#elif defined(HAVE_TANL) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) - return ::tanl (x); -#elif defined(HAVE_TAN) - return ::tan (x); -#elif defined(HAVE_TANF) - return ::tanf (x); -#else - #error ### no tan function available ### -#endif -} - -StdAwk::flt_t StdAwk::atan (flt_t x) -{ -#if defined(QSE_USE_AWK_FLTMAX) && defined(HAVE_ATANQ) - return ::atanq (x); -#elif defined(HAVE_ATANL) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) - return ::atanl (x); -#elif defined(HAVE_ATAN) - return ::atan (x); -#elif defined(HAVE_ATANF) - return ::atanf (x); -#else - #error ### no atan function available ### -#endif -} - -StdAwk::flt_t StdAwk::atan2 (flt_t x, flt_t y) -{ -#if defined(QSE_USE_AWK_FLTMAX) && defined(HAVE_ATAN2Q) - return ::atan2q (x, y); -#elif defined(HAVE_ATAN2L) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) - return ::atan2l (x, y); -#elif defined(HAVE_ATAN2) - return ::atan2 (x, y); -#elif defined(HAVE_ATAN2F) - return ::atan2f (x, y); -#else - #error ### no atan2 function available ### -#endif -} - -StdAwk::flt_t StdAwk::log (flt_t x) -{ - /* natural logarithm */ -#if defined(QSE_USE_AWK_FLTMAX) && defined(HAVE_LOGQ) - return ::logq (x); -#elif defined(HAVE_LOGL) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) - return ::logl (x); -#elif defined(HAVE_LOG) - return ::log (x); -#elif defined(HAVE_LOGF) - return ::logf (x); -#else - #error ### no log function available ### -#endif -} - -StdAwk::flt_t StdAwk::log10 (flt_t x) -{ - /* common logarithm */ -#if defined(QSE_USE_AWK_FLTMAX) && defined(HAVE_LOG10Q) - return ::log10q (x); -#elif defined(HAVE_LOG10L) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) - return ::log10l (x); -#elif defined(HAVE_LOG10) - return ::log10 (x); -#elif defined(HAVE_LOG10F) - return ::log10f (x); -#else - #error ### no log10 function available ### -#endif -} - -StdAwk::flt_t StdAwk::exp (flt_t x) -{ -#if defined(QSE_USE_AWK_FLTMAX) && defined(HAVE_EXPQ) - return ::expq (x); -#elif defined(HAVE_EXPL) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) - return ::expl (x); -#elif defined(HAVE_EXP) - return ::exp (x); -#elif defined(HAVE_EXPF) - return ::expf (x); -#else - #error ### no exp function available ### -#endif -} - -StdAwk::flt_t StdAwk::sqrt (flt_t x) -{ -#if defined(QSE_USE_AWK_FLTMAX) && defined(HAVE_SQRTQ) - return ::sqrtq (x); -#elif defined(HAVE_SQRTL) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) - return ::sqrtl (x); -#elif defined(HAVE_SQRT) - return ::sqrt (x); -#elif defined(HAVE_SQRTF) - return ::sqrtf (x); -#else - #error ### no sqrt function available ### -#endif -} - void* StdAwk::modopen (const mod_spec_t* spec) { #if defined(QSE_ENABLE_STATIC_MODULE) diff --git a/qse/lib/awk/awk.c b/qse/lib/awk/awk.c index 4633d664..5168e788 100644 --- a/qse/lib/awk/awk.c +++ b/qse/lib/awk/awk.c @@ -119,26 +119,10 @@ qse_awk_t* qse_awk_open (qse_mmgr_t* mmgr, qse_size_t xtnsize, qse_awk_prm_t* pr /* progagate the primitive functions */ QSE_ASSERT (prm != QSE_NULL); QSE_ASSERT (prm->math.pow != QSE_NULL); - QSE_ASSERT (prm->math.sin != QSE_NULL); - QSE_ASSERT (prm->math.cos != QSE_NULL); - QSE_ASSERT (prm->math.tan != QSE_NULL); - QSE_ASSERT (prm->math.atan != QSE_NULL); - QSE_ASSERT (prm->math.atan2 != QSE_NULL); - QSE_ASSERT (prm->math.log != QSE_NULL); - QSE_ASSERT (prm->math.log10 != QSE_NULL); - QSE_ASSERT (prm->math.exp != QSE_NULL); - QSE_ASSERT (prm->math.sqrt != QSE_NULL); - if (prm == QSE_NULL || - prm->math.pow == QSE_NULL || - prm->math.sin == QSE_NULL || - prm->math.cos == QSE_NULL || - prm->math.tan == QSE_NULL || - prm->math.atan == QSE_NULL || - prm->math.atan2 == QSE_NULL || - prm->math.log == QSE_NULL || - prm->math.log10 == QSE_NULL || - prm->math.exp == QSE_NULL || - prm->math.sqrt == QSE_NULL) + QSE_ASSERT (prm->math.mod != QSE_NULL); + if (prm == QSE_NULL || + prm->math.pow == QSE_NULL || + prm->math.mod == QSE_NULL) { QSE_AWK_FREE (awk, awk); return QSE_NULL; diff --git a/qse/lib/awk/fnc.c b/qse/lib/awk/fnc.c index fcc55dab..9ca7df51 100644 --- a/qse/lib/awk/fnc.c +++ b/qse/lib/awk/fnc.c @@ -38,6 +38,9 @@ static int fnc_int (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi); * If the first character of the specifer is 'R', all * parameters are passed by reference regarless of the remaining * chracters. + * + * NOTE: If min is greater than max, the specifier indicate the + * name of the module where the function is located. */ static qse_awk_fnc_t sysfnctab[] = { @@ -61,15 +64,15 @@ static qse_awk_fnc_t sysfnctab[] = { {QSE_T("sprintf"), 7}, 0, { {1, A_MAX, QSE_NULL}, qse_awk_fnc_sprintf, 0 }, QSE_NULL}, /* math functions */ - { {QSE_T("sin"), 3}, 0, { {1, 1, QSE_NULL}, qse_awk_fnc_sin, 0 }, QSE_NULL}, - { {QSE_T("cos"), 3}, 0, { {1, 1, QSE_NULL}, qse_awk_fnc_cos, 0 }, QSE_NULL}, - { {QSE_T("tan"), 3}, 0, { {1, 1, QSE_NULL}, qse_awk_fnc_tan, 0 }, QSE_NULL}, - { {QSE_T("atan"), 4}, 0, { {1, 1, QSE_NULL}, qse_awk_fnc_atan, 0 }, QSE_NULL}, - { {QSE_T("atan2"), 5}, 0, { {2, 2, QSE_NULL}, qse_awk_fnc_atan2, 0 }, QSE_NULL}, - { {QSE_T("log"), 3}, 0, { {1, 1, QSE_NULL}, qse_awk_fnc_log, 0 }, QSE_NULL}, - { {QSE_T("log10"), 5}, 0, { {1, 1, QSE_NULL}, qse_awk_fnc_log10, 0 }, QSE_NULL}, - { {QSE_T("exp"), 3}, 0, { {1, 1, QSE_NULL}, qse_awk_fnc_exp, 0 }, QSE_NULL}, - { {QSE_T("sqrt"), 4}, 0, { {1, 1, QSE_NULL}, qse_awk_fnc_sqrt, 0 }, QSE_NULL} + { {QSE_T("sin"), 3}, 0, { {A_MAX, 0, QSE_T("math") }, QSE_NULL, 0 }, QSE_NULL}, + { {QSE_T("cos"), 3}, 0, { {A_MAX, 0, QSE_T("math") }, QSE_NULL, 0 }, QSE_NULL}, + { {QSE_T("tan"), 3}, 0, { {A_MAX, 0, QSE_T("math") }, QSE_NULL, 0 }, QSE_NULL}, + { {QSE_T("atan"), 4}, 0, { {A_MAX, 0, QSE_T("math") }, QSE_NULL, 0 }, QSE_NULL}, + { {QSE_T("atan2"), 5}, 0, { {A_MAX, 0, QSE_T("math") }, QSE_NULL, 0 }, QSE_NULL}, + { {QSE_T("log"), 3}, 0, { {A_MAX, 0, QSE_T("math") }, QSE_NULL, 0 }, QSE_NULL}, + { {QSE_T("log10"), 5}, 0, { {A_MAX, 0, QSE_T("math") }, QSE_NULL, 0 }, QSE_NULL}, + { {QSE_T("exp"), 3}, 0, { {A_MAX, 0, QSE_T("math") }, QSE_NULL, 0 }, QSE_NULL}, + { {QSE_T("sqrt"), 4}, 0, { {A_MAX, 0, QSE_T("math") }, 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) @@ -1269,103 +1272,6 @@ oops: return -1; } -int qse_awk_fnc_math_1 ( - qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi, qse_awk_math1_t f) -{ - qse_size_t nargs; - qse_awk_val_t* a0; - qse_awk_flt_t rv; - qse_awk_val_t* r; - int n; - - nargs = qse_awk_rtx_getnargs (rtx); - QSE_ASSERT (nargs == 1); - - a0 = qse_awk_rtx_getarg (rtx, 0); - - n = qse_awk_rtx_valtoflt (rtx, a0, &rv); - if (n <= -1) return -1; - - r = qse_awk_rtx_makefltval (rtx, f (rtx->awk, rv)); - if (r == QSE_NULL) return -1; - - qse_awk_rtx_setretval (rtx, r); - return 0; -} - -int qse_awk_fnc_math_2 ( - qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi, qse_awk_math2_t f) -{ - qse_size_t nargs; - qse_awk_val_t* a0, * a1; - qse_awk_flt_t rv0, rv1; - qse_awk_val_t* r; - int n; - - nargs = qse_awk_rtx_getnargs (rtx); - QSE_ASSERT (nargs == 2); - - a0 = qse_awk_rtx_getarg (rtx, 0); - a1 = qse_awk_rtx_getarg (rtx, 1); - - n = qse_awk_rtx_valtoflt (rtx, a0, &rv0); - if (n <= -1) return -1; - - n = qse_awk_rtx_valtoflt (rtx, a1, &rv1); - if (n <= -1) return -1; - - r = qse_awk_rtx_makefltval (rtx, f (rtx->awk, rv0, rv1)); - if (r == QSE_NULL) return -1; - - qse_awk_rtx_setretval (rtx, r); - return 0; -} - -int qse_awk_fnc_sin (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) -{ - return qse_awk_fnc_math_1 (rtx, fi, rtx->awk->prm.math.sin); -} - -int qse_awk_fnc_cos (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) -{ - return qse_awk_fnc_math_1 (rtx, fi, rtx->awk->prm.math.cos); -} - -int qse_awk_fnc_tan (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) -{ - return qse_awk_fnc_math_1 (rtx, fi, rtx->awk->prm.math.tan); -} - -int qse_awk_fnc_atan (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) -{ - return qse_awk_fnc_math_1 (rtx, fi, rtx->awk->prm.math.atan); -} - -int qse_awk_fnc_atan2 (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) -{ - return qse_awk_fnc_math_2 (rtx, fi, rtx->awk->prm.math.atan2); -} - -int qse_awk_fnc_log (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) -{ - return qse_awk_fnc_math_1 (rtx, fi, rtx->awk->prm.math.log); -} - -int qse_awk_fnc_log10 (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) -{ - return qse_awk_fnc_math_1 (rtx, fi, rtx->awk->prm.math.log10); -} - -int qse_awk_fnc_exp (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) -{ - return qse_awk_fnc_math_1 (rtx, fi, rtx->awk->prm.math.exp); -} - -int qse_awk_fnc_sqrt (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) -{ - return qse_awk_fnc_math_1 (rtx, fi, rtx->awk->prm.math.sqrt); -} - static int fnc_int (qse_awk_rtx_t* run, const qse_awk_fnc_info_t* fi) { qse_size_t nargs; diff --git a/qse/lib/awk/fnc.h b/qse/lib/awk/fnc.h index 1f60b459..4e875e4c 100644 --- a/qse/lib/awk/fnc.h +++ b/qse/lib/awk/fnc.h @@ -33,7 +33,9 @@ struct qse_awk_fnc_t * this ia mainly for the weird length() function */ qse_awk_fnc_spec_t spec; - qse_awk_mod_t* mod; /* if it's associated to a module */ + const qse_char_t* owner; /* set this to a module name if a built-in function is located in a module */ + + qse_awk_mod_t* mod; /* set by the engine to a valid pointer if it's associated to a module */ }; #ifdef __cplusplus @@ -54,21 +56,6 @@ int qse_awk_fnc_tolower (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi); int qse_awk_fnc_toupper (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi); int qse_awk_fnc_sprintf (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi); -int qse_awk_fnc_sin (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi); -int qse_awk_fnc_cos (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi); -int qse_awk_fnc_tan (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi); -int qse_awk_fnc_atan (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi); -int qse_awk_fnc_atan2 (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi); -int qse_awk_fnc_log (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi); -int qse_awk_fnc_log10 (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi); -int qse_awk_fnc_exp (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi); -int qse_awk_fnc_sqrt (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi); - - -int qse_awk_fnc_math_1 (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi, qse_awk_math1_t f); -int qse_awk_fnc_math_2 (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi, qse_awk_math2_t f); - - #ifdef __cplusplus } #endif diff --git a/qse/lib/awk/mod-math.c b/qse/lib/awk/mod-math.c index 9cc62034..a2b5b9fb 100644 --- a/qse/lib/awk/mod-math.c +++ b/qse/lib/awk/mod-math.c @@ -40,9 +40,72 @@ # define HAVE_TANH # define HAVE_ASIN # define HAVE_ACOS + +# define HAVE_SIN +# define HAVE_COS +# define HAVE_TAN +# define HAVE_ATAN +# define HAVE_ATAN2 +# define HAVE_LOG +# define HAVE_LOG10 +# define HAVE_EXP +# define HAVE_SQRT # endif #endif +static int fnc_math_1 ( + qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi, qse_awk_math1_t f) +{ + qse_size_t nargs; + qse_awk_val_t* a0; + qse_awk_flt_t rv; + qse_awk_val_t* r; + int n; + + nargs = qse_awk_rtx_getnargs (rtx); + QSE_ASSERT (nargs == 1); + + a0 = qse_awk_rtx_getarg (rtx, 0); + + n = qse_awk_rtx_valtoflt (rtx, a0, &rv); + if (n <= -1) return -1; + + r = qse_awk_rtx_makefltval (rtx, f (qse_awk_rtx_getawk(rtx), rv)); + if (r == QSE_NULL) return -1; + + qse_awk_rtx_setretval (rtx, r); + return 0; +} + +static int fnc_math_2 ( + qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi, qse_awk_math2_t f) +{ + qse_size_t nargs; + qse_awk_val_t* a0, * a1; + qse_awk_flt_t rv0, rv1; + qse_awk_val_t* r; + int n; + + nargs = qse_awk_rtx_getnargs (rtx); + QSE_ASSERT (nargs == 2); + + a0 = qse_awk_rtx_getarg (rtx, 0); + a1 = qse_awk_rtx_getarg (rtx, 1); + + n = qse_awk_rtx_valtoflt (rtx, a0, &rv0); + if (n <= -1) return -1; + + n = qse_awk_rtx_valtoflt (rtx, a1, &rv1); + if (n <= -1) return -1; + + r = qse_awk_rtx_makefltval (rtx, f (qse_awk_rtx_getawk(rtx), rv0, rv1)); + if (r == QSE_NULL) return -1; + + qse_awk_rtx_setretval (rtx, r); + return 0; +} + + static qse_awk_flt_t math_ceil (qse_awk_t* awk, qse_awk_flt_t x) { #if defined(QSE_USE_AWK_FLTMAX) && defined(HAVE_CEILQ) @@ -163,48 +226,236 @@ static qse_awk_flt_t math_acos (qse_awk_t* awk, qse_awk_flt_t x) #endif } +/* ----------------------------------------------------------------------- */ + + +static qse_awk_flt_t math_sin (qse_awk_t* awk, qse_awk_flt_t x) +{ +#if defined(QSE_USE_AWK_FLTMAX) && defined(HAVE_SINQ) + return sinq (x); +#elif defined(HAVE_SINL) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) + return sinl (x); +#elif defined(HAVE_SIN) + return sin (x); +#elif defined(HAVE_SINF) + return sinf (x); +#else + #error ### no sin function available ### +#endif +} + +static qse_awk_flt_t math_cos (qse_awk_t* awk, qse_awk_flt_t x) +{ +#if defined(QSE_USE_AWK_FLTMAX) && defined(HAVE_COSQ) + return cosq (x); +#elif defined(HAVE_COSL) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) + return cosl (x); +#elif defined(HAVE_COS) + return cos (x); +#elif defined(HAVE_COSF) + return cosf (x); +#else + #error ### no cos function available ### +#endif +} + +static qse_awk_flt_t math_tan (qse_awk_t* awk, qse_awk_flt_t x) +{ +#if defined(QSE_USE_AWK_FLTMAX) && defined(HAVE_TANQ) + return tanq (x); +#elif defined(HAVE_TANL) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) + return tanl (x); +#elif defined(HAVE_TAN) + return tan (x); +#elif defined(HAVE_TANF) + return tanf (x); +#else + #error ### no tan function available ### +#endif +} + +static qse_awk_flt_t math_atan (qse_awk_t* awk, qse_awk_flt_t x) +{ +#if defined(QSE_USE_AWK_FLTMAX) && defined(HAVE_ATANQ) + return atanq (x); +#elif defined(HAVE_ATANL) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) + return atanl (x); +#elif defined(HAVE_ATAN) + return atan (x); +#elif defined(HAVE_ATANF) + return atanf (x); +#else + #error ### no atan function available ### +#endif +} + +static qse_awk_flt_t math_atan2 (qse_awk_t* awk, qse_awk_flt_t x, qse_awk_flt_t y) +{ +#if defined(QSE_USE_AWK_FLTMAX) && defined(HAVE_ATAN2Q) + return atan2q (x, y); +#elif defined(HAVE_ATAN2L) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) + return atan2l (x, y); +#elif defined(HAVE_ATAN2) + return atan2 (x, y); +#elif defined(HAVE_ATAN2F) + return atan2f (x, y); +#else + #error ### no atan2 function available ### +#endif +} + +static qse_awk_flt_t math_log (qse_awk_t* awk, qse_awk_flt_t x) +{ +#if defined(QSE_USE_AWK_FLTMAX) && defined(HAVE_LOGQ) + return logq (x); +#elif defined(HAVE_LOGL) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) + return logl (x); +#elif defined(HAVE_LOG) + return log (x); +#elif defined(HAVE_LOGF) + return logf (x); +#else + #error ### no log function available ### +#endif +} + +static qse_awk_flt_t math_log10 (qse_awk_t* awk, qse_awk_flt_t x) +{ +#if defined(QSE_USE_AWK_FLTMAX) && defined(HAVE_LOG10Q) + return log10q (x); +#elif defined(HAVE_LOG10L) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) + return log10l (x); +#elif defined(HAVE_LOG10) + return log10 (x); +#elif defined(HAVE_LOG10F) + return log10f (x); +#else + #error ### no log10 function available ### +#endif +} + +static qse_awk_flt_t math_exp (qse_awk_t* awk, qse_awk_flt_t x) +{ +#if defined(QSE_USE_AWK_FLTMAX) && defined(HAVE_EXPQ) + return expq (x); +#elif defined(HAVE_EXPL) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) + return expl (x); +#elif defined(HAVE_EXP) + return exp (x); +#elif defined(HAVE_EXPF) + return expf (x); +#else + #error ### no exp function available ### +#endif +} + +static qse_awk_flt_t math_sqrt (qse_awk_t* awk, qse_awk_flt_t x) +{ +#if defined(QSE_USE_AWK_FLTMAX) && defined(HAVE_SQRTQ) + return sqrtq (x); +#elif defined(HAVE_SQRTL) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) + return sqrtl (x); +#elif defined(HAVE_SQRT) + return sqrt (x); +#elif defined(HAVE_SQRTF) + return sqrtf (x); +#else + #error ### no sqrt function available ### +#endif +} + +/* ----------------------------------------------------------------------- */ + static int fnc_ceil (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) { - return qse_awk_fnc_math_1 (rtx, fi, math_ceil); + return fnc_math_1 (rtx, fi, math_ceil); } static int fnc_floor (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) { - return qse_awk_fnc_math_1 (rtx, fi, math_floor); + return fnc_math_1 (rtx, fi, math_floor); } static int fnc_round (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) { - return qse_awk_fnc_math_1 (rtx, fi, math_round); + return fnc_math_1 (rtx, fi, math_round); } static int fnc_sinh (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) { - return qse_awk_fnc_math_1 (rtx, fi, math_sinh); + return fnc_math_1 (rtx, fi, math_sinh); } static int fnc_cosh (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) { - return qse_awk_fnc_math_1 (rtx, fi, math_cosh); + return fnc_math_1 (rtx, fi, math_cosh); } static int fnc_tanh (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) { - return qse_awk_fnc_math_1 (rtx, fi, math_tanh); + return fnc_math_1 (rtx, fi, math_tanh); } static int fnc_asin (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) { - return qse_awk_fnc_math_1 (rtx, fi, math_asin); + return fnc_math_1 (rtx, fi, math_asin); } static int fnc_acos (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) { - return qse_awk_fnc_math_1 (rtx, fi, math_acos); + return fnc_math_1 (rtx, fi, math_acos); } -/* ---------------------------------------------------------------- */ +/* ----------------------------------------------------------------------- */ + +static int fnc_sin (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) +{ + return fnc_math_1 (rtx, fi, math_sin); +} + +static int fnc_cos (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) +{ + return fnc_math_1 (rtx, fi, math_cos); +} + +static int fnc_tan (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) +{ + return fnc_math_1 (rtx, fi, math_tan); +} + +static int fnc_atan (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) +{ + return fnc_math_1 (rtx, fi, math_atan); +} + +static int fnc_atan2 (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) +{ + return fnc_math_2 (rtx, fi, math_atan2); +} + +static int fnc_log (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) +{ + return fnc_math_1 (rtx, fi, math_log); +} + +static int fnc_log10 (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) +{ + return fnc_math_1 (rtx, fi, math_log10); +} + +static int fnc_exp (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) +{ + return fnc_math_1 (rtx, fi, math_exp); +} + +static int fnc_sqrt (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) +{ + return fnc_math_1 (rtx, fi, math_sqrt); +} + + +/* ----------------------------------------------------------------------- */ typedef struct fnctab_t fnctab_t; struct fnctab_t @@ -216,23 +467,23 @@ struct fnctab_t static fnctab_t fnctab[] = { /* keep this table sorted for binary search in query(). */ - { QSE_T("acos"), { { 1, 1, QSE_NULL }, fnc_acos, 0 } }, - { QSE_T("asin"), { { 1, 1, QSE_NULL }, fnc_asin, 0 } }, - { QSE_T("atan"), { { 1, 1, QSE_NULL }, qse_awk_fnc_atan, 0 } }, - { QSE_T("atan2"), { { 2, 2, QSE_NULL }, qse_awk_fnc_atan2, 0 } }, - { QSE_T("ceil"), { { 1, 1, QSE_NULL }, fnc_ceil, 0 } }, - { QSE_T("cos"), { { 1, 1, QSE_NULL }, qse_awk_fnc_cos, 0 } }, - { QSE_T("cosh"), { { 1, 1, QSE_NULL }, fnc_cosh, 0 } }, - { QSE_T("exp"), { { 1, 1, QSE_NULL }, qse_awk_fnc_exp, 0 } }, - { QSE_T("floor"), { { 1, 1, QSE_NULL }, fnc_floor, 0 } }, - { QSE_T("log"), { { 1, 1, QSE_NULL }, qse_awk_fnc_log, 0 } }, - { QSE_T("log10"), { { 1, 1, QSE_NULL }, qse_awk_fnc_log10, 0 } }, - { QSE_T("round"), { { 1, 1, QSE_NULL }, fnc_round, 0 } }, - { QSE_T("sin"), { { 1, 1, QSE_NULL }, qse_awk_fnc_sin, 0 } }, - { QSE_T("sinh"), { { 1, 1, QSE_NULL }, fnc_sinh, 0 } }, - { QSE_T("sqrt"), { { 1, 1, QSE_NULL }, qse_awk_fnc_sqrt, 0 } }, - { QSE_T("tan"), { { 1, 1, QSE_NULL }, qse_awk_fnc_tan, 0 } }, - { QSE_T("tanh"), { { 1, 1, QSE_NULL }, fnc_tanh, 0 } } + { QSE_T("acos"), { { 1, 1, QSE_NULL }, fnc_acos, 0 } }, + { QSE_T("asin"), { { 1, 1, QSE_NULL }, fnc_asin, 0 } }, + { QSE_T("atan"), { { 1, 1, QSE_NULL }, fnc_atan, 0 } }, + { QSE_T("atan2"), { { 2, 2, QSE_NULL }, fnc_atan2, 0 } }, + { QSE_T("ceil"), { { 1, 1, QSE_NULL }, fnc_ceil, 0 } }, + { QSE_T("cos"), { { 1, 1, QSE_NULL }, fnc_cos, 0 } }, + { QSE_T("cosh"), { { 1, 1, QSE_NULL }, fnc_cosh, 0 } }, + { QSE_T("exp"), { { 1, 1, QSE_NULL }, fnc_exp, 0 } }, + { QSE_T("floor"), { { 1, 1, QSE_NULL }, fnc_floor, 0 } }, + { QSE_T("log"), { { 1, 1, QSE_NULL }, fnc_log, 0 } }, + { QSE_T("log10"), { { 1, 1, QSE_NULL }, fnc_log10, 0 } }, + { QSE_T("round"), { { 1, 1, QSE_NULL }, fnc_round, 0 } }, + { QSE_T("sin"), { { 1, 1, QSE_NULL }, fnc_sin, 0 } }, + { QSE_T("sinh"), { { 1, 1, QSE_NULL }, fnc_sinh, 0 } }, + { QSE_T("sqrt"), { { 1, 1, QSE_NULL }, fnc_sqrt, 0 } }, + { QSE_T("tan"), { { 1, 1, QSE_NULL }, fnc_tan, 0 } }, + { QSE_T("tanh"), { { 1, 1, QSE_NULL }, fnc_tanh, 0 } } }; static int query (qse_awk_mod_t* mod, qse_awk_t* awk, const qse_char_t* name, qse_awk_mod_sym_t* sym) diff --git a/qse/lib/awk/parse.c b/qse/lib/awk/parse.c index 0741590f..ee6dd732 100644 --- a/qse/lib/awk/parse.c +++ b/qse/lib/awk/parse.c @@ -242,6 +242,10 @@ static qse_awk_nde_t* parse_fncall ( qse_awk_t* awk, const qse_xstr_t* name, qse_awk_fnc_t* fnc, const qse_awk_loc_t* xloc, int noarg); +static qse_awk_nde_t* parse_primary_ident_segs ( + qse_awk_t* awk, const qse_awk_loc_t* xloc, const qse_xstr_t* full, + const qse_xstr_t segs[], int nsegs); + static int get_token (qse_awk_t* awk); static int preget_token (qse_awk_t* awk); static int get_rexstr (qse_awk_t* awk, qse_awk_tok_t* tok); @@ -3090,6 +3094,7 @@ static qse_awk_nde_t* parse_expr_basic ( nde = parse_logical_or (awk, xloc); if (nde == QSE_NULL) return QSE_NULL; + if (MATCH(awk,TOK_QUEST)) if (MATCH(awk,TOK_QUEST)) { qse_awk_loc_t eloc; @@ -4859,24 +4864,36 @@ static qse_awk_nde_t* parse_primary_ident_noseg ( fnc = qse_awk_findfnc (awk, (const qse_cstr_t*)name); if (fnc) { - if (MATCH(awk,TOK_LPAREN)) + if (MATCH(awk,TOK_LPAREN) || fnc->dfl0) { - nde = parse_fncall (awk, name, fnc, xloc, 0); + if (fnc->spec.arg.min > fnc->spec.arg.max) + { + /* this intrinsic function is located in the specificed module. + * convert the function call to a module call. i do this to + * exclude some instrinsic functions from the main engine. + * e.g) sin -> math::sin + * cos -> math::cos + */ + qse_xstr_t segs[2]; + + QSE_ASSERT (fnc->spec.arg.spec != QSE_NULL); + + segs[0].ptr = (qse_char_t*)fnc->spec.arg.spec; + segs[0].len = qse_strlen(fnc->spec.arg.spec); + segs[1] = *name; + + return parse_primary_ident_segs (awk, xloc, name, segs, 2); + } + + /* fnc->dfl0 means that the function can be called without (). + * i.e. length */ + nde = parse_fncall (awk, name, fnc, xloc, (fnc->dfl0? 1: 0)); } else { - if (fnc->dfl0) - { - /* handles a function that assumes () - * when () is missing. i.e. length */ - nde = parse_fncall (awk, name, fnc, xloc, 1); - } - else - { - /* an intrinsic function should be in the form - * of the function call */ - SETERR_TOK (awk, QSE_AWK_ELPAREN); - } + /* an intrinsic function should be in the form + * of the function call */ + SETERR_TOK (awk, QSE_AWK_ELPAREN); } } /* now we know that name is a normal identifier. */ @@ -5016,6 +5033,8 @@ static qse_awk_nde_t* parse_primary_ident_segs ( qse_awk_t* awk, const qse_awk_loc_t* xloc, const qse_xstr_t* full, const qse_xstr_t segs[], int nsegs) { + /* parse xxx::yyy */ + qse_awk_nde_t* nde = QSE_NULL; qse_awk_mod_t* mod; qse_awk_mod_sym_t sym; @@ -5251,12 +5270,12 @@ static qse_awk_nde_t* parse_hashidx ( switch (fnname) { case FNTYPE_FNC: - SETERR_ARG_LOC ( + SETERR_ARG_LOC ( awk, QSE_AWK_EFNCRED, name->ptr, name->len, xloc); goto exit_func; case FNTYPE_FUN: - SETERR_ARG_LOC ( + SETERR_ARG_LOC ( awk, QSE_AWK_EFUNRED, name->ptr, name->len, xloc); goto exit_func; } diff --git a/qse/lib/awk/std.c b/qse/lib/awk/std.c index b6d4d3c2..e7b2ea6e 100644 --- a/qse/lib/awk/std.c +++ b/qse/lib/awk/std.c @@ -63,15 +63,6 @@ # if defined(_WIN32) || defined(__OS2__) || defined(__DOS__) # define HAVE_POW # define HAVE_FMOD -# define HAVE_SIN -# define HAVE_COS -# define HAVE_TAN -# define HAVE_ATAN -# define HAVE_ATAN2 -# define HAVE_LOG -# define HAVE_LOG10 -# define HAVE_EXP -# define HAVE_SQRT # endif #endif @@ -188,141 +179,6 @@ static qse_awk_flt_t custom_awk_mod (qse_awk_t* awk, qse_awk_flt_t x, qse_awk_fl #endif } -static qse_awk_flt_t custom_awk_sin (qse_awk_t* awk, qse_awk_flt_t x) -{ -#if defined(QSE_USE_AWK_FLTMAX) && defined(HAVE_SINQ) - return sinq (x); -#elif defined(HAVE_SINL) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) - return sinl (x); -#elif defined(HAVE_SIN) - return sin (x); -#elif defined(HAVE_SINF) - return sinf (x); -#else - #error ### no sin function available ### -#endif -} - -static qse_awk_flt_t custom_awk_cos (qse_awk_t* awk, qse_awk_flt_t x) -{ -#if defined(QSE_USE_AWK_FLTMAX) && defined(HAVE_COSQ) - return cosq (x); -#elif defined(HAVE_COSL) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) - return cosl (x); -#elif defined(HAVE_COS) - return cos (x); -#elif defined(HAVE_COSF) - return cosf (x); -#else - #error ### no cos function available ### -#endif -} - -static qse_awk_flt_t custom_awk_tan (qse_awk_t* awk, qse_awk_flt_t x) -{ -#if defined(QSE_USE_AWK_FLTMAX) && defined(HAVE_TANQ) - return tanq (x); -#elif defined(HAVE_TANL) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) - return tanl (x); -#elif defined(HAVE_TAN) - return tan (x); -#elif defined(HAVE_TANF) - return tanf (x); -#else - #error ### no tan function available ### -#endif -} - -static qse_awk_flt_t custom_awk_atan (qse_awk_t* awk, qse_awk_flt_t x) -{ -#if defined(QSE_USE_AWK_FLTMAX) && defined(HAVE_ATANQ) - return atanq (x); -#elif defined(HAVE_ATANL) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) - return atanl (x); -#elif defined(HAVE_ATAN) - return atan (x); -#elif defined(HAVE_ATANF) - return atanf (x); -#else - #error ### no atan function available ### -#endif -} - -static qse_awk_flt_t custom_awk_atan2 (qse_awk_t* awk, qse_awk_flt_t x, qse_awk_flt_t y) -{ -#if defined(QSE_USE_AWK_FLTMAX) && defined(HAVE_ATAN2Q) - return atan2q (x, y); -#elif defined(HAVE_ATAN2L) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) - return atan2l (x, y); -#elif defined(HAVE_ATAN2) - return atan2 (x, y); -#elif defined(HAVE_ATAN2F) - return atan2f (x, y); -#else - #error ### no atan2 function available ### -#endif -} - -static qse_awk_flt_t custom_awk_log (qse_awk_t* awk, qse_awk_flt_t x) -{ -#if defined(QSE_USE_AWK_FLTMAX) && defined(HAVE_LOGQ) - return logq (x); -#elif defined(HAVE_LOGL) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) - return logl (x); -#elif defined(HAVE_LOG) - return log (x); -#elif defined(HAVE_LOGF) - return logf (x); -#else - #error ### no log function available ### -#endif -} - -static qse_awk_flt_t custom_awk_log10 (qse_awk_t* awk, qse_awk_flt_t x) -{ -#if defined(QSE_USE_AWK_FLTMAX) && defined(HAVE_LOG10Q) - return log10q (x); -#elif defined(HAVE_LOG10L) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) - return log10l (x); -#elif defined(HAVE_LOG10) - return log10 (x); -#elif defined(HAVE_LOG10F) - return log10f (x); -#else - #error ### no log10 function available ### -#endif -} - -static qse_awk_flt_t custom_awk_exp (qse_awk_t* awk, qse_awk_flt_t x) -{ -#if defined(QSE_USE_AWK_FLTMAX) && defined(HAVE_EXPQ) - return expq (x); -#elif defined(HAVE_EXPL) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) - return expl (x); -#elif defined(HAVE_EXP) - return exp (x); -#elif defined(HAVE_EXPF) - return expf (x); -#else - #error ### no exp function available ### -#endif -} - -static qse_awk_flt_t custom_awk_sqrt (qse_awk_t* awk, qse_awk_flt_t x) -{ -#if defined(QSE_USE_AWK_FLTMAX) && defined(HAVE_SQRTQ) - return sqrtq (x); -#elif defined(HAVE_SQRTL) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) - return sqrtl (x); -#elif defined(HAVE_SQRT) - return sqrt (x); -#elif defined(HAVE_SQRTF) - return sqrtf (x); -#else - #error ### no sqrt function available ### -#endif -} - static void* custom_awk_modopen (qse_awk_t* awk, const qse_awk_mod_spec_t* spec) { #if defined(QSE_ENABLE_STATIC_MODULE) @@ -553,15 +409,6 @@ qse_awk_t* qse_awk_openstdwithmmgr (qse_mmgr_t* mmgr, qse_size_t xtnsize) prm.math.pow = custom_awk_pow; prm.math.mod = custom_awk_mod; - prm.math.sin = custom_awk_sin; - prm.math.cos = custom_awk_cos; - prm.math.tan = custom_awk_tan; - prm.math.atan = custom_awk_atan; - prm.math.atan2 = custom_awk_atan2; - prm.math.log = custom_awk_log; - prm.math.log10 = custom_awk_log10; - prm.math.exp = custom_awk_exp; - prm.math.sqrt = custom_awk_sqrt; prm.modopen = custom_awk_modopen; prm.modclose = custom_awk_modclose;