diff options
-rw-r--r-- | ext/POSIX/POSIX.xs | 159 | ||||
-rw-r--r-- | perl.h | 149 |
2 files changed, 217 insertions, 91 deletions
diff --git a/ext/POSIX/POSIX.xs b/ext/POSIX/POSIX.xs index fb60d573d8..dcda63170f 100644 --- a/ext/POSIX/POSIX.xs +++ b/ext/POSIX/POSIX.xs @@ -57,44 +57,78 @@ #include <unistd.h> #endif -#ifndef M_E -# define M_E 2.71828182845904523536028747135266250 -#endif -#ifndef M_LOG2E -# define M_LOG2E 1.44269504088896340735992468100189214 -#endif -#ifndef M_LOG10E -# define M_LOG10E 0.434294481903251827651128918916605082 -#endif -#ifndef M_LN2 -# define M_LN2 0.693147180559945309417232121458176568 -#endif -#ifndef M_LN10 -# define M_LN10 2.30258509299404568401799145468436421 -#endif -#ifndef M_PI -# define M_PI 3.14159265358979323846264338327950288 -#endif -#ifndef M_PI_2 -# define M_PI_2 1.57079632679489661923132169163975144 -#endif -#ifndef M_PI_4 -# define M_PI_4 0.785398163397448309615660845819875721 -#endif -#ifndef M_1_PI -# define M_1_PI 0.318309886183790671537767526745028724 -#endif -#ifndef M_2_PI -# define M_2_PI 0.636619772367581343075535053490057448 -#endif -#ifndef M_2_SQRTPI -# define M_2_SQRTPI 1.12837916709551257389615890312154517 -#endif -#ifndef M_SQRT2 -# define M_SQRT2 1.41421356237309504880168872420969808 -#endif -#ifndef M_SQRT1_2 -# define M_SQRT1_2 0.707106781186547524400844362104849039 +#if defined(USE_QUADMATH) && defined(I_QUADMATH) + +# undef M_E +# undef M_LOG2E +# undef M_LOG10E +# undef M_LN2 +# undef M_LN10 +# undef M_PI +# undef M_PI_2 +# undef M_PI_4 +# undef M_1_PI +# undef M_2_PI +# undef M_2_SQRTPI +# undef M_SQRT2 +# undef M_SQRT1_2 + +# define M_E M_Eq +# define M_LOG2E M_LOG2Eq +# define M_LOG10E M_LOG10Eq +# define M_LN2 M_LN2q +# define M_LN10 M_LN10q +# define M_PI M_PIq +# define M_PI_2 M_PI_2q +# define M_PI_4 M_PI_4q +# define M_1_PI M_1_PIq +# define M_2_PI M_2_PIq +# define M_2_SQRTPI M_2_SQRTPIq +# define M_SQRT2 M_SQRT2q +# define M_SQRT1_2 M_SQRT1_2q + +#else + +# ifndef M_E +# define M_E 2.71828182845904523536028747135266250 +# endif +# ifndef M_LOG2E +# define M_LOG2E 1.44269504088896340735992468100189214 +# endif +# ifndef M_LOG10E +# define M_LOG10E 0.434294481903251827651128918916605082 +# endif +# ifndef M_LN2 +# define M_LN2 0.693147180559945309417232121458176568 +# endif +# ifndef M_LN10 +# define M_LN10 2.30258509299404568401799145468436421 +# endif +# ifndef M_PI +# define M_PI 3.14159265358979323846264338327950288 +# endif +# ifndef M_PI_2 +# define M_PI_2 1.57079632679489661923132169163975144 +# endif +# ifndef M_PI_4 +# define M_PI_4 0.785398163397448309615660845819875721 +# endif +# ifndef M_1_PI +# define M_1_PI 0.318309886183790671537767526745028724 +# endif +# ifndef M_2_PI +# define M_2_PI 0.636619772367581343075535053490057448 +# endif +# ifndef M_2_SQRTPI +# define M_2_SQRTPI 1.12837916709551257389615890312154517 +# endif +# ifndef M_SQRT2 +# define M_SQRT2 1.41421356237309504880168872420969808 +# endif +# ifndef M_SQRT1_2 +# define M_SQRT1_2 0.707106781186547524400844362104849039 +# endif + #endif #if !defined(INFINITY) && defined(NV_INF) @@ -193,10 +227,53 @@ # define NO_C99_LONG_DOUBLE_MATH # endif +# if defined(USE_QUADMATH) && defined(I_QUADMATH) +# define c99_acosh acoshq +# define c99_asinh asinhq +# define c99_atanh atanhq +# define c99_cbrt cbrtq +# define c99_copysign copysignq +# define c99_erf erfq +# define c99_erfc erfcq +/* no exp2q */ +# define c99_expm1 expm1q +# define c99_fdim fdimq +# define c99_fma fmaq +# define c99_fmax fmaxq +# define c99_fmin fminq +# define c99_hypot hypotq +# define c99_ilogb ilogbq +# define c99_lgamma lgammaq +# define c99_log1p log1pq +# define c99_log2 log2q +/* no logbq */ +/* no llrintq */ +/* no llroundq */ +# define c99_lrint lrintq +# define c99_lround lroundq +# define c99_nan nanq +# define c99_nearbyint nearbyintq +# define c99_nextafter nextafterq +/* no nexttowardq */ +# define c99_remainder remainderq +# define c99_remquo remquoq +# define c99_rint rintq +# define c99_round roundq +# define c99_scalbn scalbnq +# define c99_signbit signbitq +# define c99_tgamma tgammal +# define c99_trunc truncq +# define bessel_j0 j0q +# define bessel_j1 j1q +# define bessel_jn jnq +# define bessel_y0 y0q +# define bessel_y1 y1q +# define bessel_yn ynq +# elif defined(USE_LONG_DOUBLE) && \ + !defined(NO_C99_LONG_DOUBLE_MATH) && \ + defined(HAS_ILOGBL) /* There's already a symbol for ilogbl, we will use its truthiness * as the canary for all the *l variants being defined. */ -# if defined(USE_LONG_DOUBLE) && defined(HAS_ILOGBL) && \ - !defined(NO_C99_LONG_DOUBLE_MATH) # define c99_acosh acoshl # define c99_asinh asinhl # define c99_atanh atanhl @@ -479,7 +556,7 @@ #endif /* The Bessel functions: BSD, SVID, XPG4, and POSIX. But not C99. */ -#ifdef HAS_J0 +#if defined(HAS_J0) && !defined(bessel_j0) # if defined(USE_LONG_DOUBLE) && defined(HAS_J0L) # define bessel_j0 j0l # define bessel_j1 j1l @@ -1854,45 +1854,83 @@ typedef NVTYPE NV; # ifdef I_SUNMATH # include <sunmath.h> # endif -# define NV_DIG LDBL_DIG -# ifdef LDBL_MANT_DIG -# define NV_MANT_DIG LDBL_MANT_DIG +# if defined(USE_QUADMATH) && defined(I_QUADMATH) +# include <quadmath.h> # endif -# ifdef LDBL_MIN -# define NV_MIN LDBL_MIN -# endif -# ifdef LDBL_MAX -# define NV_MAX LDBL_MAX -# endif -# ifdef LDBL_MIN_EXP -# define NV_MIN_EXP LDBL_MIN_EXP -# endif -# ifdef LDBL_MAX_EXP -# define NV_MAX_EXP LDBL_MAX_EXP -# endif -# ifdef LDBL_MIN_10_EXP -# define NV_MIN_10_EXP LDBL_MIN_10_EXP -# endif -# ifdef LDBL_MAX_10_EXP -# define NV_MAX_10_EXP LDBL_MAX_10_EXP -# endif -# ifdef LDBL_EPSILON -# define NV_EPSILON LDBL_EPSILON -# endif -# ifdef LDBL_MAX -# define NV_MAX LDBL_MAX +# ifdef FLT128_DIG +# define NV_DIG FLT128_DIG +# define NV_MANT_DIG FLT128_MANT_DIG +# define NV_MIN FLT128_MIN +# define NV_MAX FLT128_MAX +# define NV_MIN_EXP FLT128_MIN_EXP +# define NV_MAX_EXP FLT128_MAX_EXP +# define NV_EPSILON FLT128_EPSILON +# define NV_MIN_10_EXP FLT128_MIN_10_EXP +# define NV_MAX_10_EXP FLT128_MAX_10_EXP +# define NV_INF HUGE_VALQ +# define NV_NAN nanq("0") +# elif defined(LDBL_DIG) +# define NV_DIG LDBL_DIG +# ifdef LDBL_MANT_DIG +# define NV_MANT_DIG LDBL_MANT_DIG +# endif +# ifdef LDBL_MIN +# define NV_MIN LDBL_MIN +# endif +# ifdef LDBL_MAX +# define NV_MAX LDBL_MAX +# endif +# ifdef LDBL_MIN_EXP +# define NV_MIN_EXP LDBL_MIN_EXP +# endif +# ifdef LDBL_MAX_EXP +# define NV_MAX_EXP LDBL_MAX_EXP +# endif +# ifdef LDBL_MIN_10_EXP +# define NV_MIN_10_EXP LDBL_MIN_10_EXP +# endif +# ifdef LDBL_MAX_10_EXP +# define NV_MAX_10_EXP LDBL_MAX_10_EXP +# endif +# ifdef LDBL_EPSILON +# define NV_EPSILON LDBL_EPSILON +# endif +# ifdef LDBL_MAX +# define NV_MAX LDBL_MAX /* Having LDBL_MAX doesn't necessarily mean that we have LDBL_MIN... -Allen */ -# else -# ifdef HUGE_VALL -# define NV_MAX HUGE_VALL # else -# ifdef HUGE_VAL -# define NV_MAX ((NV)HUGE_VAL) +# ifdef HUGE_VALL +# define NV_MAX HUGE_VALL # endif # endif # endif -# ifdef HAS_SQRTL -/* These math interfaces are the long double cousins of the C89 math. */ +# if defined(USE_QUADMATH) && defined(I_QUADMATH) +# define Perl_acos acosq +# define Perl_asin asinq +# define Perl_atan atanq +# define Perl_atan2 atan2q +# define Perl_ceil ceilq +# define Perl_cos cosq +# define Perl_cosh coshq +# define Perl_exp expq +/* no Perl_fabs, but there's PERL_ABS */ +# define Perl_floor floorq +# define Perl_fmod fmodq +# define Perl_log logq +# define Perl_log10 log10q +# define Perl_pow powq +# define Perl_sin sinq +# define Perl_sinh sinhq +# define Perl_sqrt sqrtq +# define Perl_tan tanq +# define Perl_tanh tanhq +# define Perl_modf(x,y) modfq(x,y) +# define Perl_frexp(x,y) frexpq(x,y) +# define Perl_ldexp(x, y) ldexpq(x,y) +# define Perl_isinf(x) isinfq(x) +# define Perl_isnan(x) isnanq(x) +# define Perl_isfinite(x) !(isnanq(x) || isinfq(x)) +# elif defined(HAS_SQRTL) # define Perl_acos acosl # define Perl_asin asinl # define Perl_atan atanl @@ -1914,30 +1952,36 @@ typedef NVTYPE NV; # define Perl_tanh tanhl # endif /* e.g. libsunmath doesn't have modfl and frexpl as of mid-March 2000 */ -# ifdef HAS_MODFL -# define Perl_modf(x,y) modfl(x,y) +# ifndef Perl_modf +# ifdef HAS_MODFL +# define Perl_modf(x,y) modfl(x,y) /* eg glibc 2.2 series seems to provide modfl on ppc and arm, but has no prototype in <math.h> */ -# ifndef HAS_MODFL_PROTO +# ifndef HAS_MODFL_PROTO EXTERN_C long double modfl(long double, long double *); -# endif -# elif (defined(HAS_TRUNCL) || defined(HAS_AINTL)) && defined(HAS_COPYSIGNL) +# endif +# elif (defined(HAS_TRUNCL) || defined(HAS_AINTL)) && defined(HAS_COPYSIGNL) extern long double Perl_my_modfl(long double x, long double *ip); # define Perl_modf(x,y) Perl_my_modfl(x,y) +# endif # endif -# ifdef HAS_FREXPL -# define Perl_frexp(x,y) frexpl(x,y) -# else -# if defined(HAS_ILOGBL) && defined(HAS_SCALBNL) - extern long double Perl_my_frexpl(long double x, int *e); -# define Perl_frexp(x,y) Perl_my_frexpl(x,y) +# ifndef Perl_frexp +# ifdef HAS_FREXPL +# define Perl_frexp(x,y) frexpl(x,y) +# else +# if defined(HAS_ILOGBL) && defined(HAS_SCALBNL) +extern long double Perl_my_frexpl(long double x, int *e); +# define Perl_frexp(x,y) Perl_my_frexpl(x,y) +# endif # endif # endif -# ifdef HAS_LDEXPL -# define Perl_ldexp(x, y) ldexpl(x,y) -# else -# if defined(HAS_SCALBNL) && FLT_RADIX == 2 -# define Perl_ldexp(x,y) scalbnl(x,y) +# ifndef Perl_ldexp +# ifdef HAS_LDEXPL +# define Perl_ldexp(x, y) ldexpl(x,y) +# else +# if defined(HAS_SCALBNL) && FLT_RADIX == 2 +# define Perl_ldexp(x,y) scalbnl(x,y) +# endif # endif # endif # ifndef Perl_isnan @@ -4993,6 +5037,9 @@ EXTCONST char PL_bincompat_options[] = # ifdef USE_PERLIO " USE_PERLIO" # endif +# ifdef USE_QUADMATH + " USE_QUADMATH" +# endif # ifdef USE_REENTRANT_API " USE_REENTRANT_API" # endif @@ -5765,7 +5812,9 @@ typedef struct am_table_short AMTS; #endif /* !USE_LOCALE_NUMERIC */ -#if defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE) +#ifdef USE_QUADMATH +# define Perl_strtod(s, e) strtoflt128(s, e) +#elif defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE) # if defined(HAS_STRTOLD) # define Perl_strtod(s, e) strtold(s, e) # elif defined(HAS_STRTOD) |