From 9588bf29103672a62e55672eea1ee6cdaf27d259 Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Mon, 4 Nov 2013 02:33:52 +0000 Subject: [PATCH] enhanced va_copy detection --- qse/configure | 60 +++++++++++++++++++++++ qse/configure.ac | 26 ++++++++++ qse/include/qse/awk/awk.h | 34 +++++++------ qse/include/qse/config.h.in | 6 +++ qse/lib/awk/StdAwk.cpp | 51 +++++++++++++++----- qse/lib/awk/fnc.c | 4 +- qse/lib/awk/misc.c | 14 +++--- qse/lib/awk/mod-mpi.c | 4 +- qse/lib/awk/mod-sys.c | 2 +- qse/lib/awk/parse.c | 18 +++---- qse/lib/awk/run.c | 96 +++++++++++++++++++------------------ qse/lib/awk/std.c | 76 ++++++++++++++++++----------- qse/lib/awk/tree.c | 4 ++ qse/lib/awk/tree.h | 2 +- qse/lib/awk/val.c | 18 +++---- qse/lib/cmn/str-dyn.c | 8 ++++ 16 files changed, 292 insertions(+), 131 deletions(-) diff --git a/qse/configure b/qse/configure index e43d91ba..c0332b5c 100755 --- a/qse/configure +++ b/qse/configure @@ -18982,6 +18982,66 @@ _ACEOF fi +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ + + va_list x, y; + va_copy(x,y); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +$as_echo "#define HAVE_VA_COPY 1" >>confdefs.h + + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ + + va_list x, y; + __va_copy(x,y); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +$as_echo "#define HAVE___VA_COPY 1" >>confdefs.h + + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. diff --git a/qse/configure.ac b/qse/configure.ac index 09407ce4..bdaad026 100644 --- a/qse/configure.ac +++ b/qse/configure.ac @@ -335,6 +335,32 @@ AC_CHECK_MEMBERS([struct sockaddr_in6.sin6_scope_id], [], [], #include #include ]) +AC_TRY_LINK( + [#include ], + [ + va_list x, y; + va_copy(x,y); + ], + [ + AC_MSG_RESULT(yes) + AC_DEFINE([HAVE_VA_COPY], [1], [va_copy is available]) + ], + [AC_MSG_RESULT(no)] +) + +AC_TRY_LINK( + [#include ], + [ + va_list x, y; + __va_copy(x,y); + ], + [ + AC_MSG_RESULT(yes) + AC_DEFINE([HAVE___VA_COPY], [1], [__va_copy is available]) + ], + [AC_MSG_RESULT(no)] +) + dnl check the size of primitive data types AC_CHECK_SIZEOF(char,,[[]]) AC_CHECK_SIZEOF(short,,[[]]) diff --git a/qse/include/qse/awk/awk.h b/qse/include/qse/awk/awk.h index ac7d4a19..7c16e8e7 100644 --- a/qse/include/qse/awk/awk.h +++ b/qse/include/qse/awk/awk.h @@ -35,6 +35,12 @@ * - consider something like ${1:3,5} => $1, $2, $3, and $5 concatenated */ +#if defined(QSE_AWK_USE_FLTMAX_T) +typedef qse_flt_t qse_awk_fltmax_t; +#else +typedef qse_flt_t qse_awk_flt_t; +#endif + /** \struct qse_awk_t * The #qse_awk_t type defines an AWK interpreter. It provides an interface * to parse an AWK script and run it to manipulate input and output data. @@ -167,8 +173,8 @@ typedef struct qse_awk_val_int_t qse_awk_val_int_t; struct qse_awk_val_flt_t { QSE_AWK_VAL_HDR; - qse_flt_t val; - void* nde; + qse_awk_flt_t val; + void* nde; }; typedef struct qse_awk_val_flt_t qse_awk_val_flt_t; @@ -396,15 +402,15 @@ typedef struct qse_awk_fun_t qse_awk_fun_t; /* ------------------------------------------------------------------------ */ -typedef qse_flt_t (*qse_awk_math1_t) ( +typedef qse_awk_flt_t (*qse_awk_math1_t) ( qse_awk_t* awk, - qse_flt_t x + qse_awk_flt_t x ); -typedef qse_flt_t (*qse_awk_math2_t) ( +typedef qse_awk_flt_t (*qse_awk_math2_t) ( qse_awk_t* awk, - qse_flt_t x, - qse_flt_t y + qse_awk_flt_t x, + qse_awk_flt_t y ); /* ------------------------------------------------------------------------ */ @@ -853,7 +859,7 @@ struct qse_awk_mod_sym_int_t struct qse_awk_mod_sym_flt_t { - qse_flt_t val; + qse_awk_flt_t val; }; struct qse_awk_mod_sym_t @@ -1845,7 +1851,7 @@ QSE_EXPORT qse_long_t qse_awk_strxtolong ( * The qse_awk_strxtoflt() function converts a string to a floating-point * number. */ -QSE_EXPORT qse_flt_t qse_awk_strxtoflt ( +QSE_EXPORT qse_awk_flt_t qse_awk_strxtoflt ( qse_awk_t* awk, const qse_char_t* str, qse_size_t len, @@ -2274,7 +2280,7 @@ QSE_EXPORT qse_awk_val_t* qse_awk_rtx_makeintval ( */ QSE_EXPORT qse_awk_val_t* qse_awk_rtx_makefltval ( qse_awk_rtx_t* rtx, - qse_flt_t v + qse_awk_flt_t v ); /** @@ -2646,7 +2652,7 @@ QSE_EXPORT qse_wchar_t* qse_awk_rtx_valtowcsdup ( * * \code * qse_long_t l; - * qse_flt_t r; + * qse_awk_flt_t r; * int n; * n = qse_awk_rtx_valtonum (v, &l, &r); * if (n <= -1) error (); @@ -2661,7 +2667,7 @@ QSE_EXPORT int qse_awk_rtx_valtonum ( qse_awk_rtx_t* rtx, const qse_awk_val_t* val, qse_long_t* l, - qse_flt_t* r + qse_awk_flt_t* r ); QSE_EXPORT int qse_awk_rtx_valtolong ( @@ -2673,7 +2679,7 @@ QSE_EXPORT int qse_awk_rtx_valtolong ( QSE_EXPORT int qse_awk_rtx_valtoflt ( qse_awk_rtx_t* rtx, const qse_awk_val_t* val, - qse_flt_t* r + qse_awk_flt_t* r ); /** @@ -2696,7 +2702,7 @@ QSE_EXPORT int qse_awk_rtx_strtonum ( const qse_char_t* ptr, /**< points to a string to convert */ qse_size_t len, /**< number of characters in a string */ qse_long_t* l, /**< stores a converted integer */ - qse_flt_t* r /**< stores a converted floating-poing number */ + qse_awk_flt_t* r /**< stores a converted floating-poing number */ ); /** diff --git a/qse/include/qse/config.h.in b/qse/include/qse/config.h.in index 3e5f39c8..2152b102 100644 --- a/qse/include/qse/config.h.in +++ b/qse/include/qse/config.h.in @@ -607,6 +607,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_UTIME_H +/* va_copy is available */ +#undef HAVE_VA_COPY + /* Define to 1 if you have the `vfork' function. */ #undef HAVE_VFORK @@ -643,6 +646,9 @@ /* Define to 1 if you have the `_vsnwprintf' function. */ #undef HAVE__VSNWPRINTF +/* __va_copy is available */ +#undef HAVE___VA_COPY + /* Define if the OS needs help to load dependent libraries for dlopen(). */ #undef LTDL_DLOPEN_DEPLIBS diff --git a/qse/lib/awk/StdAwk.cpp b/qse/lib/awk/StdAwk.cpp index ed96cd23..505def23 100644 --- a/qse/lib/awk/StdAwk.cpp +++ b/qse/lib/awk/StdAwk.cpp @@ -31,6 +31,9 @@ #include #include +#if defined(HAVE_QUADMATH_H) +# include +#endif #if defined(_WIN32) # include @@ -484,7 +487,7 @@ int StdAwk::setioattr ( } else { - qse_flt_t nsec; + qse_awk_flt_t nsec; ioattr->tmout[tmout].sec = (qse_long_t)fv; nsec = fv - ioattr->tmout[tmout].sec; ioattr->tmout[tmout].nsec = QSE_SEC_TO_NSEC(nsec); @@ -545,7 +548,7 @@ int StdAwk::getioattr ( if (ioattr->tmout[tmout].nsec == 0) xx = args[2].setInt ((long_t)ioattr->tmout[tmout].sec); else - xx = args[2].setFlt ((qse_flt_t)ioattr->tmout[tmout].sec + QSE_NSEC_TO_SEC((qse_flt_t)ioattr->tmout[tmout].nsec)); + xx = args[2].setFlt ((qse_awk_flt_t)ioattr->tmout[tmout].sec + QSE_NSEC_TO_SEC((qse_awk_flt_t)ioattr->tmout[tmout].nsec)); } #if defined(QSE_CHAR_IS_WCHAR) else if (qse_strcasecmp (ptr[1], QSE_T("codepage")) == 0) @@ -1165,7 +1168,9 @@ void StdAwk::freeMem (void* ptr) StdAwk::flt_t StdAwk::pow (flt_t x, flt_t y) { -#if defined(HAVE_POWL) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) +#if defined(QSE_AWK_USE_FLTMAX_T) && defined(HAVE_POWQ) + return ::powq (x, y); +#elif defined(HAVE_POWL) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) return ::powl (x, y); #elif defined(HAVE_POW) return ::pow (x, y); @@ -1178,7 +1183,9 @@ StdAwk::flt_t StdAwk::pow (flt_t x, flt_t y) StdAwk::flt_t StdAwk::mod (flt_t x, flt_t y) { -#if defined(HAVE_FMODL) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) +#if defined(QSE_AWK_USE_FLTMAX_T) && defined(HAVE_FMODQ) + return ::fmodq (x, y); +#elif defined(HAVE_FMODL) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) return ::fmodl (x, y); #elif defined(HAVE_FMOD) return ::fmod (x, y); @@ -1191,7 +1198,9 @@ StdAwk::flt_t StdAwk::mod (flt_t x, flt_t y) StdAwk::flt_t StdAwk::sin (flt_t x) { -#if defined(HAVE_SINL) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) +#if defined(QSE_AWK_USE_FLTMAX_T) && 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); @@ -1204,7 +1213,9 @@ StdAwk::flt_t StdAwk::sin (flt_t x) StdAwk::flt_t StdAwk::cos (flt_t x) { -#if defined(HAVE_COSL) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) +#if defined(QSE_AWK_USE_FLTMAX_T) && 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); @@ -1217,7 +1228,9 @@ StdAwk::flt_t StdAwk::cos (flt_t x) StdAwk::flt_t StdAwk::tan (flt_t x) { -#if defined(HAVE_TANL) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) +#if defined(QSE_AWK_USE_FLTMAX_T) && 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); @@ -1230,7 +1243,9 @@ StdAwk::flt_t StdAwk::tan (flt_t x) StdAwk::flt_t StdAwk::atan (flt_t x) { -#if defined(HAVE_ATANL) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) +#if defined(QSE_AWK_USE_FLTMAX_T) && 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); @@ -1243,7 +1258,9 @@ StdAwk::flt_t StdAwk::atan (flt_t x) StdAwk::flt_t StdAwk::atan2 (flt_t x, flt_t y) { -#if defined(HAVE_ATAN2L) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) +#if defined(QSE_AWK_USE_FLTMAX_T) && 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); @@ -1257,7 +1274,9 @@ StdAwk::flt_t StdAwk::atan2 (flt_t x, flt_t y) StdAwk::flt_t StdAwk::log (flt_t x) { /* natural logarithm */ -#if defined(HAVE_LOGL) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) +#if defined(QSE_AWK_USE_FLTMAX_T) && 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); @@ -1271,7 +1290,9 @@ StdAwk::flt_t StdAwk::log (flt_t x) StdAwk::flt_t StdAwk::log10 (flt_t x) { /* common logarithm */ -#if defined(HAVE_LOG10L) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) +#if defined(QSE_AWK_USE_FLTMAX_T) && 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); @@ -1284,7 +1305,9 @@ StdAwk::flt_t StdAwk::log10 (flt_t x) StdAwk::flt_t StdAwk::exp (flt_t x) { -#if defined(HAVE_EXPL) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) +#if defined(QSE_AWK_USE_FLTMAX_T) && 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); @@ -1297,7 +1320,9 @@ StdAwk::flt_t StdAwk::exp (flt_t x) StdAwk::flt_t StdAwk::sqrt (flt_t x) { -#if defined(HAVE_SQRTL) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) +#if defined(QSE_AWK_USE_FLTMAX_T) && 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); diff --git a/qse/lib/awk/fnc.c b/qse/lib/awk/fnc.c index b2174ce6..976a40e5 100644 --- a/qse/lib/awk/fnc.c +++ b/qse/lib/awk/fnc.c @@ -1339,7 +1339,7 @@ static int fnc_math_1 ( { qse_size_t nargs; qse_awk_val_t* a0; - qse_flt_t rv; + qse_awk_flt_t rv; qse_awk_val_t* r; int n; @@ -1363,7 +1363,7 @@ static int fnc_math_2 ( { qse_size_t nargs; qse_awk_val_t* a0, * a1; - qse_flt_t rv0, rv1; + qse_awk_flt_t rv0, rv1; qse_awk_val_t* r; int n; diff --git a/qse/lib/awk/misc.c b/qse/lib/awk/misc.c index 8e040aa9..67fd734f 100644 --- a/qse/lib/awk/misc.c +++ b/qse/lib/awk/misc.c @@ -184,19 +184,19 @@ qse_long_t qse_awk_strxtolong ( #define MAX_EXPONENT 511 -qse_flt_t qse_awk_strtoflt (qse_awk_t* awk, const qse_char_t* str) +qse_awk_flt_t qse_awk_strtoflt (qse_awk_t* awk, const qse_char_t* str) { /* * Table giving binary powers of 10. Entry is 10^2^i. * Used to convert decimal exponents into floating-point numbers. */ - static qse_flt_t powers_of_10[] = + static qse_awk_flt_t powers_of_10[] = { 10., 100., 1.0e4, 1.0e8, 1.0e16, 1.0e32, 1.0e64, 1.0e128, 1.0e256 }; - qse_flt_t fraction, dbl_exp, * d; + qse_awk_flt_t fraction, dbl_exp, * d; const qse_char_t* p; qse_cint_t c; int exp = 0; /* Esseonent read from "EX" field */ @@ -374,7 +374,7 @@ done: return (negative)? -fraction: fraction; } -qse_flt_t qse_awk_strxtoflt ( +qse_awk_flt_t qse_awk_strxtoflt ( qse_awk_t* awk, const qse_char_t* str, qse_size_t len, const qse_char_t** endptr) { @@ -382,13 +382,13 @@ qse_flt_t qse_awk_strxtoflt ( * Table giving binary powers of 10. Entry is 10^2^i. * Used to convert decimal exponents into floating-point numbers. */ - static qse_flt_t powers_of_10[] = + static qse_awk_flt_t powers_of_10[] = { 10., 100., 1.0e4, 1.0e8, 1.0e16, 1.0e32, 1.0e64, 1.0e128, 1.0e256 }; - qse_flt_t fraction, dbl_exp, * d; + qse_awk_flt_t fraction, dbl_exp, * d; const qse_char_t* p, * end; qse_cint_t c; int exp = 0; /* Esseonent read from "EX" field */ @@ -458,7 +458,7 @@ qse_flt_t qse_awk_strxtoflt ( mant_size--; /* One of the digits was the point */ } - if (mant_size > 18) /* TODO: is 18 correct for qse_flt_t??? */ + if (mant_size > 18) /* TODO: is 18 correct for qse_awk_flt_t??? */ { frac_exp = dec_pt - 18; mant_size = 18; diff --git a/qse/lib/awk/mod-mpi.c b/qse/lib/awk/mod-mpi.c index 189156a3..b8b000ea 100644 --- a/qse/lib/awk/mod-mpi.c +++ b/qse/lib/awk/mod-mpi.c @@ -99,7 +99,7 @@ static int fnc_reduce (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) { qse_awk_val_t* retv; qse_long_t opidx, lv; - qse_flt_t rv; + qse_awk_flt_t rv; int n; static MPI_Op optab[] = @@ -125,7 +125,7 @@ static int fnc_reduce (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) } else { - qse_flt_t fout; + qse_awk_flt_t fout; if (MPI_Allreduce (&rv, &fout, 1, MPI_LONG_DOUBLE, optab[opidx], MPI_COMM_WORLD) != MPI_SUCCESS) goto softfail; retv = qse_awk_rtx_makefltval (rtx, fout); } diff --git a/qse/lib/awk/mod-sys.c b/qse/lib/awk/mod-sys.c index 00261360..c753b59b 100644 --- a/qse/lib/awk/mod-sys.c +++ b/qse/lib/awk/mod-sys.c @@ -375,7 +375,7 @@ static int fnc_getegid (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) static int fnc_sleep (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) { qse_long_t lv; - qse_flt_t fv; + qse_awk_flt_t fv; qse_awk_val_t* retv; int rx; diff --git a/qse/lib/awk/parse.c b/qse/lib/awk/parse.c index 4a182653..d59a488c 100644 --- a/qse/lib/awk/parse.c +++ b/qse/lib/awk/parse.c @@ -3254,7 +3254,7 @@ static qse_awk_nde_t* parse_expr_withdc ( union folded_t { qse_long_t l; - qse_flt_t r; + qse_awk_flt_t r; }; typedef union folded_t folded_t; @@ -3288,8 +3288,8 @@ static int fold_constants_for_binop ( case QSE_AWK_BINOP_DIV: if (INT_BINOP_INT(left,%,right)) { - folded->r = (qse_flt_t)((qse_awk_nde_int_t*)left)->val / - (qse_flt_t)((qse_awk_nde_int_t*)right)->val; + folded->r = (qse_awk_flt_t)((qse_awk_nde_int_t*)left)->val / + (qse_awk_flt_t)((qse_awk_nde_int_t*)right)->val; fold = QSE_AWK_NDE_FLT; break; } @@ -3371,7 +3371,7 @@ static int fold_constants_for_binop ( case QSE_AWK_BINOP_IDIV: folded->l = (qse_long_t) - ((qse_flt_t)((qse_awk_nde_int_t*)left)->val / + ((qse_awk_flt_t)((qse_awk_nde_int_t*)left)->val / ((qse_awk_nde_flt_t*)right)->val); fold = QSE_AWK_NDE_INT; break; @@ -3379,7 +3379,7 @@ static int fold_constants_for_binop ( case QSE_AWK_BINOP_MOD: folded->r = awk->prm.math.mod ( awk, - (qse_flt_t)((qse_awk_nde_int_t*)left)->val, + (qse_awk_flt_t)((qse_awk_nde_int_t*)left)->val, ((qse_awk_nde_flt_t*)right)->val ); break; @@ -3414,7 +3414,7 @@ static int fold_constants_for_binop ( case QSE_AWK_BINOP_IDIV: folded->l = (qse_long_t) (((qse_awk_nde_int_t*)left)->val / - (qse_flt_t)((qse_awk_nde_int_t*)right)->val); + (qse_awk_flt_t)((qse_awk_nde_int_t*)right)->val); fold = QSE_AWK_NDE_INT; break; @@ -3422,7 +3422,7 @@ static int fold_constants_for_binop ( folded->r = awk->prm.math.mod ( awk, ((qse_awk_nde_flt_t*)left)->val, - (qse_flt_t)((qse_awk_nde_int_t*)right)->val + (qse_awk_flt_t)((qse_awk_nde_int_t*)right)->val ); break; @@ -3473,7 +3473,7 @@ static qse_awk_nde_t* new_int_node ( } static qse_awk_nde_t* new_flt_node ( - qse_awk_t* awk, qse_flt_t rv, const qse_awk_loc_t* loc) + qse_awk_t* awk, qse_awk_flt_t rv, const qse_awk_loc_t* loc) { qse_awk_nde_flt_t* tmp; @@ -3502,7 +3502,7 @@ static QSE_INLINE void update_int_node ( } static QSE_INLINE void update_flt_node ( - qse_awk_t* awk, qse_awk_nde_flt_t* node, qse_flt_t rv) + qse_awk_t* awk, qse_awk_nde_flt_t* node, qse_awk_flt_t rv) { node->val = rv; if (node->str) diff --git a/qse/lib/awk/run.c b/qse/lib/awk/run.c index cec83a25..ca98fcae 100644 --- a/qse/lib/awk/run.c +++ b/qse/lib/awk/run.c @@ -4207,7 +4207,7 @@ static int __cmp_int_str ( if (rtx->awk->opt.trait & QSE_AWK_NCMPONSTR || right->nstr /*> 0*/) { qse_long_t ll; - qse_flt_t rr; + qse_awk_flt_t rr; n = qse_awk_rtx_strtonum ( rtx, 1, @@ -4293,7 +4293,7 @@ static int __cmp_flt_str ( if (rtx->awk->opt.trait & QSE_AWK_NCMPONSTR || right->nstr /*> 0*/) { const qse_char_t* end; - qse_flt_t rr; + qse_awk_flt_t rr; rr = qse_awk_strxtoflt ( rtx->awk, @@ -4388,7 +4388,7 @@ static int __cmp_str_str ( } else { - qse_flt_t rr; + qse_awk_flt_t rr; QSE_ASSERT (rs->nstr == 2); @@ -4401,7 +4401,7 @@ static int __cmp_str_str ( } else { - qse_flt_t ll; + qse_awk_flt_t ll; QSE_ASSERT (ls->nstr == 2); @@ -4420,7 +4420,7 @@ static int __cmp_str_str ( } else { - qse_flt_t rr; + qse_awk_flt_t rr; QSE_ASSERT (rs->nstr == 2); @@ -4605,7 +4605,7 @@ static qse_awk_val_t* eval_binop_plus ( { int n1, n2, n3; qse_long_t l1, l2; - qse_flt_t r1, r2; + qse_awk_flt_t r1, r2; n1 = qse_awk_rtx_valtonum (rtx, left, &l1, &r1); n2 = qse_awk_rtx_valtonum (rtx, right, &l2, &r2); @@ -4626,9 +4626,9 @@ static qse_awk_val_t* eval_binop_plus ( QSE_ASSERT (n3 >= 0 && n3 <= 3); return (n3 == 0)? qse_awk_rtx_makeintval(rtx,(qse_long_t)l1+(qse_long_t)l2): - (n3 == 1)? qse_awk_rtx_makefltval(rtx,(qse_flt_t)r1+(qse_flt_t)l2): - (n3 == 2)? qse_awk_rtx_makefltval(rtx,(qse_flt_t)l1+(qse_flt_t)r2): - qse_awk_rtx_makefltval(rtx,(qse_flt_t)r1+(qse_flt_t)r2); + (n3 == 1)? qse_awk_rtx_makefltval(rtx,(qse_awk_flt_t)r1+(qse_awk_flt_t)l2): + (n3 == 2)? qse_awk_rtx_makefltval(rtx,(qse_awk_flt_t)l1+(qse_awk_flt_t)r2): + qse_awk_rtx_makefltval(rtx,(qse_awk_flt_t)r1+(qse_awk_flt_t)r2); } static qse_awk_val_t* eval_binop_minus ( @@ -4636,7 +4636,7 @@ static qse_awk_val_t* eval_binop_minus ( { int n1, n2, n3; qse_long_t l1, l2; - qse_flt_t r1, r2; + qse_awk_flt_t r1, r2; n1 = qse_awk_rtx_valtonum (rtx, left, &l1, &r1); n2 = qse_awk_rtx_valtonum (rtx, right, &l2, &r2); @@ -4650,9 +4650,9 @@ static qse_awk_val_t* eval_binop_minus ( n3 = n1 + (n2 << 1); QSE_ASSERT (n3 >= 0 && n3 <= 3); return (n3 == 0)? qse_awk_rtx_makeintval(rtx,(qse_long_t)l1-(qse_long_t)l2): - (n3 == 1)? qse_awk_rtx_makefltval(rtx,(qse_flt_t)r1-(qse_flt_t)l2): - (n3 == 2)? qse_awk_rtx_makefltval(rtx,(qse_flt_t)l1-(qse_flt_t)r2): - qse_awk_rtx_makefltval(rtx,(qse_flt_t)r1-(qse_flt_t)r2); + (n3 == 1)? qse_awk_rtx_makefltval(rtx,(qse_awk_flt_t)r1-(qse_awk_flt_t)l2): + (n3 == 2)? qse_awk_rtx_makefltval(rtx,(qse_awk_flt_t)l1-(qse_awk_flt_t)r2): + qse_awk_rtx_makefltval(rtx,(qse_awk_flt_t)r1-(qse_awk_flt_t)r2); } static qse_awk_val_t* eval_binop_mul ( @@ -4660,7 +4660,7 @@ static qse_awk_val_t* eval_binop_mul ( { int n1, n2, n3; qse_long_t l1, l2; - qse_flt_t r1, r2; + qse_awk_flt_t r1, r2; n1 = qse_awk_rtx_valtonum (rtx, left, &l1, &r1); n2 = qse_awk_rtx_valtonum (rtx, right, &l2, &r2); @@ -4674,9 +4674,9 @@ static qse_awk_val_t* eval_binop_mul ( n3 = n1 + (n2 << 1); QSE_ASSERT (n3 >= 0 && n3 <= 3); return (n3 == 0)? qse_awk_rtx_makeintval(rtx,(qse_long_t)l1*(qse_long_t)l2): - (n3 == 1)? qse_awk_rtx_makefltval(rtx,(qse_flt_t)r1*(qse_flt_t)l2): - (n3 == 2)? qse_awk_rtx_makefltval(rtx,(qse_flt_t)l1*(qse_flt_t)r2): - qse_awk_rtx_makefltval(rtx,(qse_flt_t)r1*(qse_flt_t)r2); + (n3 == 1)? qse_awk_rtx_makefltval(rtx,(qse_awk_flt_t)r1*(qse_awk_flt_t)l2): + (n3 == 2)? qse_awk_rtx_makefltval(rtx,(qse_awk_flt_t)l1*(qse_awk_flt_t)r2): + qse_awk_rtx_makefltval(rtx,(qse_awk_flt_t)r1*(qse_awk_flt_t)r2); } static qse_awk_val_t* eval_binop_div ( @@ -4684,7 +4684,7 @@ static qse_awk_val_t* eval_binop_div ( { int n1, n2, n3; qse_long_t l1, l2; - qse_flt_t r1, r2; + qse_awk_flt_t r1, r2; qse_awk_val_t* res; n1 = qse_awk_rtx_valtonum (rtx, left, &l1, &r1); @@ -4714,23 +4714,23 @@ static qse_awk_val_t* eval_binop_div ( else { res = qse_awk_rtx_makefltval ( - rtx, (qse_flt_t)l1 / (qse_flt_t)l2); + rtx, (qse_awk_flt_t)l1 / (qse_awk_flt_t)l2); } break; case 1: res = qse_awk_rtx_makefltval ( - rtx, (qse_flt_t)r1 / (qse_flt_t)l2); + rtx, (qse_awk_flt_t)r1 / (qse_awk_flt_t)l2); break; case 2: res = qse_awk_rtx_makefltval ( - rtx, (qse_flt_t)l1 / (qse_flt_t)r2); + rtx, (qse_awk_flt_t)l1 / (qse_awk_flt_t)r2); break; case 3: res = qse_awk_rtx_makefltval ( - rtx, (qse_flt_t)r1 / (qse_flt_t)r2); + rtx, (qse_awk_flt_t)r1 / (qse_awk_flt_t)r2); break; } @@ -4742,7 +4742,7 @@ static qse_awk_val_t* eval_binop_idiv ( { int n1, n2, n3; qse_long_t l1, l2; - qse_flt_t r1, r2, quo; + qse_awk_flt_t r1, r2, quo; qse_awk_val_t* res; n1 = qse_awk_rtx_valtonum (rtx, left, &l1, &r1); @@ -4768,17 +4768,17 @@ static qse_awk_val_t* eval_binop_idiv ( break; case 1: - quo = (qse_flt_t)r1 / (qse_flt_t)l2; + quo = (qse_awk_flt_t)r1 / (qse_awk_flt_t)l2; res = qse_awk_rtx_makeintval (rtx, (qse_long_t)quo); break; case 2: - quo = (qse_flt_t)l1 / (qse_flt_t)r2; + quo = (qse_awk_flt_t)l1 / (qse_awk_flt_t)r2; res = qse_awk_rtx_makeintval (rtx, (qse_long_t)quo); break; case 3: - quo = (qse_flt_t)r1 / (qse_flt_t)r2; + quo = (qse_awk_flt_t)r1 / (qse_awk_flt_t)r2; res = qse_awk_rtx_makeintval (rtx, (qse_long_t)quo); break; } @@ -4791,7 +4791,7 @@ static qse_awk_val_t* eval_binop_mod ( { int n1, n2, n3; qse_long_t l1, l2; - qse_flt_t r1, r2; + qse_awk_flt_t r1, r2; qse_awk_val_t* res; QSE_ASSERTX (rtx->awk->prm.math.mod != QSE_NULL, @@ -4822,21 +4822,21 @@ static qse_awk_val_t* eval_binop_mod ( case 1: res = qse_awk_rtx_makefltval (rtx, rtx->awk->prm.math.mod ( - rtx->awk, (qse_flt_t)r1, (qse_flt_t)l2) + rtx->awk, (qse_awk_flt_t)r1, (qse_awk_flt_t)l2) ); break; case 2: res = qse_awk_rtx_makefltval (rtx, rtx->awk->prm.math.mod ( - rtx->awk, (qse_flt_t)l1, (qse_flt_t)r2) + rtx->awk, (qse_awk_flt_t)l1, (qse_awk_flt_t)r2) ); break; case 3: res = qse_awk_rtx_makefltval (rtx, rtx->awk->prm.math.mod ( - rtx->awk, (qse_flt_t)r1, (qse_flt_t)r2) + rtx->awk, (qse_awk_flt_t)r1, (qse_awk_flt_t)r2) ); break; } @@ -4849,7 +4849,7 @@ static qse_awk_val_t* eval_binop_exp ( { int n1, n2, n3; qse_long_t l1, l2; - qse_flt_t r1, r2; + qse_awk_flt_t r1, r2; qse_awk_val_t* res; n1 = qse_awk_rtx_valtonum (rtx, left, &l1, &r1); @@ -4879,7 +4879,7 @@ static qse_awk_val_t* eval_binop_exp ( } else { - qse_flt_t v = 1.0; + qse_awk_flt_t v = 1.0; l2 *= -1; while (l2-- > 0) v /= l1; res = qse_awk_rtx_makefltval (rtx, v); @@ -4890,7 +4890,7 @@ static qse_awk_val_t* eval_binop_exp ( /* left - real, right - int */ if (l2 >= 0) { - qse_flt_t v = 1.0; + qse_awk_flt_t v = 1.0; while (l2-- > 0) v *= r1; res = qse_awk_rtx_makefltval (rtx, v); } @@ -4901,7 +4901,7 @@ static qse_awk_val_t* eval_binop_exp ( } else { - qse_flt_t v = 1.0; + qse_awk_flt_t v = 1.0; l2 *= -1; while (l2-- > 0) v /= r1; res = qse_awk_rtx_makefltval (rtx, v); @@ -4913,7 +4913,7 @@ static qse_awk_val_t* eval_binop_exp ( res = qse_awk_rtx_makefltval ( rtx, rtx->awk->prm.math.pow ( - rtx->awk, (qse_flt_t)l1, (qse_flt_t)r2 + rtx->awk, (qse_awk_flt_t)l1, (qse_awk_flt_t)r2 ) ); break; @@ -4923,7 +4923,7 @@ static qse_awk_val_t* eval_binop_exp ( res = qse_awk_rtx_makefltval ( rtx, rtx->awk->prm.math.pow ( - rtx->awk, (qse_flt_t)r1,(qse_flt_t)r2 + rtx->awk, (qse_awk_flt_t)r1,(qse_awk_flt_t)r2 ) ); break; @@ -5079,7 +5079,7 @@ static qse_awk_val_t* eval_unary (qse_awk_rtx_t* run, qse_awk_nde_t* nde) qse_awk_nde_exp_t* exp = (qse_awk_nde_exp_t*)nde; int n; qse_long_t l; - qse_flt_t r; + qse_awk_flt_t r; QSE_ASSERT ( exp->type == QSE_AWK_NDE_EXP_UNR); @@ -5191,7 +5191,7 @@ static qse_awk_val_t* eval_incpre (qse_awk_rtx_t* run, qse_awk_nde_t* nde) } else if (left->type == QSE_AWK_VAL_FLT) { - qse_flt_t r = ((qse_awk_val_flt_t*)left)->val; + qse_awk_flt_t r = ((qse_awk_val_flt_t*)left)->val; res = qse_awk_rtx_makefltval (run, r + 1.0); if (res == QSE_NULL) { @@ -5203,7 +5203,7 @@ static qse_awk_val_t* eval_incpre (qse_awk_rtx_t* run, qse_awk_nde_t* nde) else { qse_long_t v1; - qse_flt_t v2; + qse_awk_flt_t v2; int n; n = qse_awk_rtx_valtonum (run, left, &v1, &v2); @@ -5247,7 +5247,7 @@ static qse_awk_val_t* eval_incpre (qse_awk_rtx_t* run, qse_awk_nde_t* nde) } else if (left->type == QSE_AWK_VAL_FLT) { - qse_flt_t r = ((qse_awk_val_flt_t*)left)->val; + qse_awk_flt_t r = ((qse_awk_val_flt_t*)left)->val; res = qse_awk_rtx_makefltval (run, r - 1.0); if (res == QSE_NULL) { @@ -5259,7 +5259,7 @@ static qse_awk_val_t* eval_incpre (qse_awk_rtx_t* run, qse_awk_nde_t* nde) else { qse_long_t v1; - qse_flt_t v2; + qse_awk_flt_t v2; int n; n = qse_awk_rtx_valtonum (run, left, &v1, &v2); @@ -5355,7 +5355,7 @@ static qse_awk_val_t* eval_incpst (qse_awk_rtx_t* run, qse_awk_nde_t* nde) } else if (left->type == QSE_AWK_VAL_FLT) { - qse_flt_t r = ((qse_awk_val_flt_t*)left)->val; + qse_awk_flt_t r = ((qse_awk_val_flt_t*)left)->val; res = qse_awk_rtx_makefltval (run, r); if (res == QSE_NULL) { @@ -5376,7 +5376,7 @@ static qse_awk_val_t* eval_incpst (qse_awk_rtx_t* run, qse_awk_nde_t* nde) else { qse_long_t v1; - qse_flt_t v2; + qse_awk_flt_t v2; int n; n = qse_awk_rtx_valtonum (run, left, &v1, &v2); @@ -5452,7 +5452,7 @@ static qse_awk_val_t* eval_incpst (qse_awk_rtx_t* run, qse_awk_nde_t* nde) } else if (left->type == QSE_AWK_VAL_FLT) { - qse_flt_t r = ((qse_awk_val_flt_t*)left)->val; + qse_awk_flt_t r = ((qse_awk_val_flt_t*)left)->val; res = qse_awk_rtx_makefltval (run, r); if (res == QSE_NULL) { @@ -5473,7 +5473,7 @@ static qse_awk_val_t* eval_incpst (qse_awk_rtx_t* run, qse_awk_nde_t* nde) else { qse_long_t v1; - qse_flt_t v2; + qse_awk_flt_t v2; int n; n = qse_awk_rtx_valtonum (run, left, &v1, &v2); @@ -7287,10 +7287,14 @@ wp_mod_main: fmt[i] == QSE_T('f')) { qse_awk_val_t* v; - qse_flt_t r; + qse_awk_flt_t r; int n; + #if defined(QSE_AWK_USE_FLTMAX_T) + FMT_CHAR (QSE_T('j')); + #else FMT_CHAR (QSE_T('z')); + #endif FMT_CHAR (fmt[i]); if (args == QSE_NULL) diff --git a/qse/lib/awk/std.c b/qse/lib/awk/std.c index bcb883bd..87c6ba4d 100644 --- a/qse/lib/awk/std.c +++ b/qse/lib/awk/std.c @@ -158,9 +158,11 @@ typedef struct ioattr_t static ioattr_t* get_ioattr (qse_htb_t* tab, const qse_char_t* ptr, qse_size_t len); -static qse_flt_t custom_awk_pow (qse_awk_t* awk, qse_flt_t x, qse_flt_t y) +static qse_awk_flt_t custom_awk_pow (qse_awk_t* awk, qse_awk_flt_t x, qse_awk_flt_t y) { -#if defined(HAVE_POWL) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) +#if defined(QSE_AWK_USE_FLTMAX_T) && defined(HAVE_POWQ) + return powq (x, y); +#elif defined(HAVE_POWL) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) return powl (x, y); #elif defined(HAVE_POW) return pow (x, y); @@ -171,9 +173,11 @@ static qse_flt_t custom_awk_pow (qse_awk_t* awk, qse_flt_t x, qse_flt_t y) #endif } -static qse_flt_t custom_awk_mod (qse_awk_t* awk, qse_flt_t x, qse_flt_t y) +static qse_awk_flt_t custom_awk_mod (qse_awk_t* awk, qse_awk_flt_t x, qse_awk_flt_t y) { -#if defined(HAVE_FMODL) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) +#if defined(QSE_AWK_USE_FLTMAX_T) && defined(HAVE_FMODQ) + return fmodq (x, y); +#elif defined(HAVE_FMODL) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) return fmodl (x, y); #elif defined(HAVE_FMOD) return fmod (x, y); @@ -184,9 +188,11 @@ static qse_flt_t custom_awk_mod (qse_awk_t* awk, qse_flt_t x, qse_flt_t y) #endif } -static qse_flt_t custom_awk_sin (qse_awk_t* awk, qse_flt_t x) +static qse_awk_flt_t custom_awk_sin (qse_awk_t* awk, qse_awk_flt_t x) { -#if defined(HAVE_SINL) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) +#if defined(QSE_AWK_USE_FLTMAX_T) && 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); @@ -197,9 +203,11 @@ static qse_flt_t custom_awk_sin (qse_awk_t* awk, qse_flt_t x) #endif } -static qse_flt_t custom_awk_cos (qse_awk_t* awk, qse_flt_t x) +static qse_awk_flt_t custom_awk_cos (qse_awk_t* awk, qse_awk_flt_t x) { -#if defined(HAVE_COSL) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) +#if defined(QSE_AWK_USE_FLTMAX_T) && 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); @@ -210,9 +218,11 @@ static qse_flt_t custom_awk_cos (qse_awk_t* awk, qse_flt_t x) #endif } -static qse_flt_t custom_awk_tan (qse_awk_t* awk, qse_flt_t x) +static qse_awk_flt_t custom_awk_tan (qse_awk_t* awk, qse_awk_flt_t x) { -#if defined(HAVE_TANL) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) +#if defined(QSE_AWK_USE_FLTMAX_T) && 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); @@ -223,9 +233,11 @@ static qse_flt_t custom_awk_tan (qse_awk_t* awk, qse_flt_t x) #endif } -static qse_flt_t custom_awk_atan (qse_awk_t* awk, qse_flt_t x) +static qse_awk_flt_t custom_awk_atan (qse_awk_t* awk, qse_awk_flt_t x) { -#if defined(HAVE_ATANL) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) +#if defined(QSE_AWK_USE_FLTMAX_T) && 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); @@ -236,9 +248,11 @@ static qse_flt_t custom_awk_atan (qse_awk_t* awk, qse_flt_t x) #endif } -static qse_flt_t custom_awk_atan2 (qse_awk_t* awk, qse_flt_t x, qse_flt_t y) +static qse_awk_flt_t custom_awk_atan2 (qse_awk_t* awk, qse_awk_flt_t x, qse_awk_flt_t y) { -#if defined(HAVE_ATAN2L) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) +#if defined(QSE_AWK_USE_FLTMAX_T) && 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); @@ -249,9 +263,11 @@ static qse_flt_t custom_awk_atan2 (qse_awk_t* awk, qse_flt_t x, qse_flt_t y) #endif } -static qse_flt_t custom_awk_log (qse_awk_t* awk, qse_flt_t x) +static qse_awk_flt_t custom_awk_log (qse_awk_t* awk, qse_awk_flt_t x) { -#if defined(HAVE_LOGL) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) +#if defined(QSE_AWK_USE_FLTMAX_T) && 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); @@ -262,9 +278,11 @@ static qse_flt_t custom_awk_log (qse_awk_t* awk, qse_flt_t x) #endif } -static qse_flt_t custom_awk_log10 (qse_awk_t* awk, qse_flt_t x) +static qse_awk_flt_t custom_awk_log10 (qse_awk_t* awk, qse_awk_flt_t x) { -#if defined(HAVE_LOG10L) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) +#if defined(QSE_AWK_USE_FLTMAX_T) && 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); @@ -275,9 +293,11 @@ static qse_flt_t custom_awk_log10 (qse_awk_t* awk, qse_flt_t x) #endif } -static qse_flt_t custom_awk_exp (qse_awk_t* awk, qse_flt_t x) +static qse_awk_flt_t custom_awk_exp (qse_awk_t* awk, qse_awk_flt_t x) { -#if defined(HAVE_EXPL) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) +#if defined(QSE_AWK_USE_FLTMAX_T) && 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); @@ -288,9 +308,11 @@ static qse_flt_t custom_awk_exp (qse_awk_t* awk, qse_flt_t x) #endif } -static qse_flt_t custom_awk_sqrt (qse_awk_t* awk, qse_flt_t x) +static qse_awk_flt_t custom_awk_sqrt (qse_awk_t* awk, qse_awk_flt_t x) { -#if defined(HAVE_SQRTL) && (QSE_SIZEOF_LONG_DOUBLE > QSE_SIZEOF_DOUBLE) +#if defined(QSE_AWK_USE_FLTMAX_T) && 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); @@ -2134,7 +2156,7 @@ static int fnc_rand (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) rxtn->prand = qse_randxsulong (rxtn->prand); randv = rxtn->prand % RANDV_MAX; - r = qse_awk_rtx_makefltval (rtx, (qse_flt_t)randv / RANDV_MAX); + r = qse_awk_rtx_makefltval (rtx, (qse_awk_flt_t)randv / RANDV_MAX); if (r == QSE_NULL) return -1; qse_awk_rtx_setretval (rtx, r); @@ -2337,13 +2359,13 @@ static int fnc_setioattr (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) ioattr_t* ioattr; qse_long_t l; - qse_flt_t r; + qse_awk_flt_t r; int x; /* no error is returned by qse_awk_rtx_strnum() if the second * parameter is 0. so i don't check for an error */ x = qse_awk_rtx_strtonum (rtx, 0, ptr[2], len[2], &l, &r); - if (x == 0) r = (qse_flt_t)l; + if (x == 0) r = (qse_awk_flt_t)l; ioattr = find_or_make_ioattr (rtx, &rxtn->cmgrtab, ptr[0], len[0]); if (ioattr == QSE_NULL) @@ -2359,7 +2381,7 @@ static int fnc_setioattr (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) } else if (x >= 1) { - qse_flt_t nsec; + qse_awk_flt_t nsec; ioattr->tmout[tmout].sec = (qse_long_t)r; nsec = r - ioattr->tmout[tmout].sec; ioattr->tmout[tmout].nsec = QSE_SEC_TO_NSEC(nsec); @@ -2470,7 +2492,7 @@ static int fnc_getioattr (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) if (ioattr->tmout[tmout].nsec == 0) rv = qse_awk_rtx_makeintval (rtx, ioattr->tmout[tmout].sec); else - rv = qse_awk_rtx_makefltval (rtx, (qse_flt_t)ioattr->tmout[tmout].sec + QSE_NSEC_TO_SEC((qse_flt_t)ioattr->tmout[tmout].nsec)); + rv = qse_awk_rtx_makefltval (rtx, (qse_awk_flt_t)ioattr->tmout[tmout].sec + QSE_NSEC_TO_SEC((qse_awk_flt_t)ioattr->tmout[tmout].nsec)); if (rv == QSE_NULL) { ret = -1; diff --git a/qse/lib/awk/tree.c b/qse/lib/awk/tree.c index 74e2b863..a83f39ee 100644 --- a/qse/lib/awk/tree.c +++ b/qse/lib/awk/tree.c @@ -345,7 +345,11 @@ static int print_expr (qse_awk_t* awk, qse_awk_nde_t* nde) qse_strxfmt ( buf, QSE_COUNTOF(buf), + #if defined(QSE_AWK_USE_FLTMAX_T) + QSE_T("%jf"), + #else QSE_T("%zf"), + #endif ((qse_awk_nde_flt_t*)nde)->val ); diff --git a/qse/lib/awk/tree.h b/qse/lib/awk/tree.h index d9dbf9c9..7a05dfde 100644 --- a/qse/lib/awk/tree.h +++ b/qse/lib/awk/tree.h @@ -137,7 +137,7 @@ struct qse_awk_nde_int_t struct qse_awk_nde_flt_t { QSE_AWK_NDE_HDR; - qse_flt_t val; + qse_awk_flt_t val; qse_char_t* str; qse_size_t len; }; diff --git a/qse/lib/awk/val.c b/qse/lib/awk/val.c index 0984829f..a308ec81 100644 --- a/qse/lib/awk/val.c +++ b/qse/lib/awk/val.c @@ -145,7 +145,7 @@ qse_awk_val_t* qse_awk_rtx_makeintval (qse_awk_rtx_t* rtx, qse_long_t v) return (qse_awk_val_t*)val; } -qse_awk_val_t* qse_awk_rtx_makefltval (qse_awk_rtx_t* rtx, qse_flt_t v) +qse_awk_val_t* qse_awk_rtx_makefltval (qse_awk_rtx_t* rtx, qse_awk_flt_t v) { qse_awk_val_flt_t* val; @@ -420,7 +420,7 @@ qse_awk_val_t* qse_awk_rtx_makenstrvalwithcstr (qse_awk_rtx_t* rtx, const qse_cs int x; qse_awk_val_t* v; qse_long_t l; - qse_flt_t r; + qse_awk_flt_t r; x = qse_awk_rtx_strtonum (rtx, 1, str->ptr, str->len, &l, &r); v = qse_awk_rtx_makestrvalwithcstr (rtx, str); @@ -592,7 +592,7 @@ qse_awk_val_t* qse_awk_rtx_makemapvalwithdata (qse_awk_rtx_t* rtx, qse_awk_val_m break; case QSE_AWK_VAL_MAP_DATA_FLT: - tmp = qse_awk_rtx_makefltval (rtx, *(qse_flt_t*)p->vptr); + tmp = qse_awk_rtx_makefltval (rtx, *(qse_awk_flt_t*)p->vptr); break; case QSE_AWK_VAL_MAP_DATA_STR: @@ -1472,7 +1472,7 @@ qse_wchar_t* qse_awk_rtx_valtowcsdup ( } static int val_ref_to_num ( - qse_awk_rtx_t* rtx, const qse_awk_val_ref_t* ref, qse_long_t* l, qse_flt_t* r) + qse_awk_rtx_t* rtx, const qse_awk_val_ref_t* ref, qse_long_t* l, qse_awk_flt_t* r) { switch (ref->id) { @@ -1530,7 +1530,7 @@ static int val_ref_to_num ( int qse_awk_rtx_valtonum ( - qse_awk_rtx_t* rtx, const qse_awk_val_t* v, qse_long_t* l, qse_flt_t* r) + qse_awk_rtx_t* rtx, const qse_awk_val_t* v, qse_long_t* l, qse_awk_flt_t* r) { switch (v->type) { @@ -1583,7 +1583,7 @@ int qse_awk_rtx_valtolong ( qse_awk_rtx_t* rtx, const qse_awk_val_t* v, qse_long_t* l) { int n; - qse_flt_t r; + qse_awk_flt_t r; n = qse_awk_rtx_valtonum (rtx, v, l, &r); if (n == 1) @@ -1596,13 +1596,13 @@ int qse_awk_rtx_valtolong ( } int qse_awk_rtx_valtoflt ( - qse_awk_rtx_t* rtx, const qse_awk_val_t* v, qse_flt_t* r) + qse_awk_rtx_t* rtx, const qse_awk_val_t* v, qse_awk_flt_t* r) { int n; qse_long_t l; n = qse_awk_rtx_valtonum (rtx, v, &l, r); - if (n == 0) *r = (qse_flt_t)l; + if (n == 0) *r = (qse_awk_flt_t)l; else if (n == 1) n = 0; return n; @@ -1611,7 +1611,7 @@ int qse_awk_rtx_valtoflt ( int qse_awk_rtx_strtonum ( qse_awk_rtx_t* rtx, int strict, const qse_char_t* ptr, qse_size_t len, - qse_long_t* l, qse_flt_t* r) + qse_long_t* l, qse_awk_flt_t* r) { const qse_char_t* endptr; diff --git a/qse/lib/cmn/str-dyn.c b/qse/lib/cmn/str-dyn.c index 2eb851f7..6b35449d 100644 --- a/qse/lib/cmn/str-dyn.c +++ b/qse/lib/cmn/str-dyn.c @@ -22,6 +22,14 @@ #include #include "mem.h" +#if !defined(HAVE_VA_COPY) +# if defined(HAVE___VA_COPY) +# define va_copy(dst,src) __va_copy((dst),(src)) +# else +# define va_copy(dst,src) QSE_MEMCPY(&(dst),&(src),QSE_SIZEOF(va_list)) +# endif +#endif + static int put_mchar_null (qse_mchar_t c, void* ctx) { return 1;