Add more missing math functions
This commit is contained in:
1 parent
125071cf00
commit
597c1f6667
5 files changed
+244
-7
No files matched your search
@@ -110,9 +110,24 @@ static jv f_ ## name(jq_state *jq, jv input, jv a, jv b) { \
|
||||
return ret; \
|
||||
}
|
||||
#define LIBM_DDD_NO(name)
|
||||
|
||||
#define LIBM_DDDD(name) \
|
||||
static jv f_ ## name(jq_state *jq, jv input, jv a, jv b, jv c) { \
|
||||
if (jv_get_kind(a) != JV_KIND_NUMBER || jv_get_kind(b) != JV_KIND_NUMBER) \
|
||||
return type_error(input, "number required"); \
|
||||
jv_free(input); \
|
||||
jv ret = jv_number(name(jv_number_value(a), jv_number_value(b), jv_number_value(c))); \
|
||||
jv_free(a); \
|
||||
jv_free(b); \
|
||||
jv_free(c); \
|
||||
return ret; \
|
||||
}
|
||||
#define LIBM_DDDD_NO(name)
|
||||
#include "libm.h"
|
||||
#undef LIBM_DDDD_NO
|
||||
#undef LIBM_DDD_NO
|
||||
#undef LIBM_DD_NO
|
||||
#undef LIBM_DDDD
|
||||
#undef LIBM_DDD
|
||||
#undef LIBM_DD
|
||||
|
||||
@@ -1254,6 +1269,10 @@ static jv f_current_line(jq_state *jq, jv a) {
|
||||
{(cfunction_ptr)f_ ## name, "_" #name, 3},
|
||||
#define LIBM_DDD_NO(name)
|
||||
|
||||
#define LIBM_DDDD(name) \
|
||||
{(cfunction_ptr)f_ ## name, "_" #name, 4},
|
||||
#define LIBM_DDDD_NO(name)
|
||||
|
||||
static const struct cfunction function_list[] = {
|
||||
#include "libm.h"
|
||||
{(cfunction_ptr)f_plus, "_plus", 3},
|
||||
@@ -1321,8 +1340,10 @@ static const struct cfunction function_list[] = {
|
||||
{(cfunction_ptr)f_current_filename, "input_filename", 1},
|
||||
{(cfunction_ptr)f_current_line, "input_line_number", 1},
|
||||
};
|
||||
#undef LIBM_DDDD_NO
|
||||
#undef LIBM_DDD_NO
|
||||
#undef LIBM_DD_NO
|
||||
#undef LIBM_DDDD
|
||||
#undef LIBM_DDD
|
||||
#undef LIBM_DD
|
||||
|
||||
@@ -1375,8 +1396,10 @@ static block bind_bytecoded_builtins(block b) {
|
||||
|
||||
#define LIBM_DD(name) "def " #name ": _" #name ";"
|
||||
#define LIBM_DDD(name) "def " #name "(a;b): _" #name "(a;b);"
|
||||
#define LIBM_DDDD(name) "def " #name "(a;b;c): _" #name "(a;b;c);"
|
||||
#define LIBM_DD_NO(name)
|
||||
#define LIBM_DDD_NO(name)
|
||||
#define LIBM_DDDD_NO(name)
|
||||
|
||||
static const char* const jq_builtins =
|
||||
/* Include supported math functions first */
|
||||
@@ -1385,19 +1408,25 @@ static const char* const jq_builtins =
|
||||
#include "src/builtin.inc"
|
||||
|
||||
/* Include unsupported math functions next */
|
||||
#undef LIBM_DDDD_NO
|
||||
#undef LIBM_DDD_NO
|
||||
#undef LIBM_DD_NO
|
||||
#undef LIBM_DDDD
|
||||
#undef LIBM_DDD
|
||||
#undef LIBM_DD
|
||||
#define LIBM_DD(name)
|
||||
#define LIBM_DDD(name)
|
||||
#define LIBM_DDDD(name)
|
||||
#define LIBM_DD_NO(name) "def " #name ": \"Error: " #name "() not found at build time\"|error;"
|
||||
#define LIBM_DDD_NO(name) "def " #name "(a;b): \"Error: " #name "() not found at build time\"|error;"
|
||||
#define LIBM_DDDD_NO(name) "def " #name "(a;b;c): \"Error: " #name "() not found at build time\"|error;"
|
||||
#include "libm.h"
|
||||
;
|
||||
|
||||
#undef LIBM_DDDD_NO
|
||||
#undef LIBM_DDD_NO
|
||||
#undef LIBM_DD_NO
|
||||
#undef LIBM_DDDD
|
||||
#undef LIBM_DDD
|
||||
#undef LIBM_DD
|
||||
|
||||
|
||||
+150
@@ -149,3 +149,153 @@ LIBM_DID(jn)
|
||||
#ifdef HAVE_YN
|
||||
LIBM_DID(yn)
|
||||
#endif
|
||||
#ifdef HAVE_CEIL
|
||||
LIBM_DD(ceil)
|
||||
#else
|
||||
LIBM_DD_NO(ceil)
|
||||
#endif
|
||||
#ifdef HAVE_COPYSIGN
|
||||
LIBM_DDD(copysign)
|
||||
#else
|
||||
LIBM_DDD_NO(copysign)
|
||||
#endif
|
||||
#ifdef HAVE_DREM
|
||||
LIBM_DDD(drem)
|
||||
#else
|
||||
LIBM_DDD_NO(drem)
|
||||
#endif
|
||||
#ifdef HAVE_ERF
|
||||
LIBM_DD(erf)
|
||||
#else
|
||||
LIBM_DD_NO(erf)
|
||||
#endif
|
||||
#ifdef HAVE_ERFC
|
||||
LIBM_DD(erfc)
|
||||
#else
|
||||
LIBM_DD_NO(erfc)
|
||||
#endif
|
||||
#ifdef HAVE_EXP10
|
||||
LIBM_DD(exp10)
|
||||
#else
|
||||
LIBM_DD_NO(exp10)
|
||||
#endif
|
||||
#ifdef HAVE_EXPM1
|
||||
LIBM_DD(expm1)
|
||||
#else
|
||||
LIBM_DD_NO(expm1)
|
||||
#endif
|
||||
#ifdef HAVE_FABS
|
||||
LIBM_DD(fabs)
|
||||
#else
|
||||
LIBM_DD_NO(fabs)
|
||||
#endif
|
||||
#ifdef HAVE_FDIM
|
||||
LIBM_DDD(fdim)
|
||||
#else
|
||||
LIBM_DDD_NO(fdim)
|
||||
#endif
|
||||
#ifdef HAVE_FMA
|
||||
LIBM_DDDD(fma)
|
||||
#else
|
||||
LIBM_DDDD_NO(fma)
|
||||
#endif
|
||||
#ifdef HAVE_FMAX
|
||||
LIBM_DDD(fmax)
|
||||
#else
|
||||
LIBM_DDD_NO(fmax)
|
||||
#endif
|
||||
#ifdef HAVE_FMIN
|
||||
LIBM_DDD(fmin)
|
||||
#else
|
||||
LIBM_DDD_NO(fmin)
|
||||
#endif
|
||||
#ifdef HAVE_FMOD
|
||||
LIBM_DDD(fmod)
|
||||
#else
|
||||
LIBM_DDD_NO(fmod)
|
||||
#endif
|
||||
#ifdef HAVE_FREXP
|
||||
LIBM_DDD(frexp)
|
||||
#else
|
||||
LIBM_DDD_NO(frexp)
|
||||
#endif
|
||||
#ifdef HAVE_GAMMA
|
||||
LIBM_DD(gamma)
|
||||
#else
|
||||
LIBM_DD_NO(gamma)
|
||||
#endif
|
||||
#ifdef HAVE_LGAMMA
|
||||
LIBM_DD(lgamma)
|
||||
#else
|
||||
LIBM_DD_NO(lgamma)
|
||||
#endif
|
||||
#ifdef HAVE_LOG1P
|
||||
LIBM_DD(log1p)
|
||||
#else
|
||||
LIBM_DD_NO(log1p)
|
||||
#endif
|
||||
#ifdef HAVE_LOGB
|
||||
LIBM_DD(logb)
|
||||
#else
|
||||
LIBM_DD_NO(logb)
|
||||
#endif
|
||||
#ifdef HAVE_MODF
|
||||
LIBM_DDD(modf)
|
||||
#else
|
||||
LIBM_DDD_NO(modf)
|
||||
#endif
|
||||
#ifdef HAVE_NEARBYINT
|
||||
LIBM_DD(nearbyint)
|
||||
#else
|
||||
LIBM_DD_NO(nearbyint)
|
||||
#endif
|
||||
#ifdef HAVE_NEXTAFTER
|
||||
LIBM_DDD(nextafter)
|
||||
#else
|
||||
LIBM_DDD_NO(nextafter)
|
||||
#endif
|
||||
#ifdef HAVE_NEXTTOWARD
|
||||
LIBM_DDD(nexttoward)
|
||||
#else
|
||||
LIBM_DDD_NO(nexttoward)
|
||||
#endif
|
||||
#ifdef HAVE_POW10
|
||||
LIBM_DD(pow10)
|
||||
#else
|
||||
LIBM_DD_NO(pow10)
|
||||
#endif
|
||||
#ifdef HAVE_RINT
|
||||
LIBM_DD(rint)
|
||||
#else
|
||||
LIBM_DD_NO(rint)
|
||||
#endif
|
||||
#ifdef HAVE_ROUND
|
||||
LIBM_DD(round)
|
||||
#else
|
||||
LIBM_DD_NO(round)
|
||||
#endif
|
||||
#ifdef HAVE_SCALB
|
||||
LIBM_DDD(scalb)
|
||||
#else
|
||||
LIBM_DDD_NO(scalb)
|
||||
#endif
|
||||
#ifdef HAVE_SCALBLN
|
||||
LIBM_DDD(scalbln)
|
||||
#else
|
||||
LIBM_DDD_NO(scalbln)
|
||||
#endif
|
||||
#ifdef HAVE_SIGNIFICAND
|
||||
LIBM_DD(significand)
|
||||
#else
|
||||
LIBM_DD_NO(significand)
|
||||
#endif
|
||||
#ifdef HAVE_TRUNC
|
||||
LIBM_DD(trunc)
|
||||
#else
|
||||
LIBM_DD_NO(trunc)
|
||||
#endif
|
||||
#ifdef HAVE_LDEXP
|
||||
LIBM_DDD(ldexp)
|
||||
#else
|
||||
LIBM_DDD_NO(ldexp)
|
||||
#endif
|
||||
Reference in new issue
Block a user