diff options
author | Marcus Boerger <helly@php.net> | 2004-03-27 01:17:07 +0000 |
---|---|---|
committer | Marcus Boerger <helly@php.net> | 2004-03-27 01:17:07 +0000 |
commit | 91786ab7a50ea2933d938448b6a709c085767f62 (patch) | |
tree | 8b8ecfbdb1a7029e97da748788f6a7fb8f885496 | |
parent | 0bf404dbeb2be35c824865f7220e1dae425209a8 (diff) | |
download | php-git-91786ab7a50ea2933d938448b6a709c085767f62.tar.gz |
MFH: bugfix #27646
-rw-r--r-- | ext/standard/basic_functions.c | 31 | ||||
-rw-r--r-- | ext/standard/basic_functions.h | 3 | ||||
-rw-r--r-- | ext/standard/config.m4 | 65 | ||||
-rw-r--r-- | ext/standard/var_unserializer.re | 18 |
4 files changed, 117 insertions, 0 deletions
diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index c2e6ad9403..f1066fc4c6 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -996,6 +996,35 @@ static void basic_globals_dtor(php_basic_globals *basic_globals_p TSRMLS_DC) } +#define PHP_DOUBLE_INFINITY_HIGH 0x7ff00000 +#define PHP_DOUBLE_QUIET_NAN_HIGH 0xfff80000 + +PHPAPI double php_get_nan() +{ +#if defined(__i386__) || defined(_X86_) || defined(ALPHA) || defined(_ALPHA) || defined(__alpha) + double val; + ((php_uint32*)&val)[1] = PHP_DOUBLE_QUIET_NAN_HIGH; + ((php_uint32*)&val)[0] = 0; + return val; +#else + /* hope the target platform is ISO-C compliant */ + return atof("NAN"); +#endif +} + +PHPAPI double php_get_inf() +{ +#if defined(__i386__) || defined(_X86_) || defined(ALPHA) || defined(_ALPHA) || defined(__alpha) + double val; + ((php_uint32*)&val)[1] = PHP_DOUBLE_INFINITY_HIGH; + ((php_uint32*)&val)[0] = 0; + return val; +#else + /* hope the target platform is ISO-C compliant */ + return atof("INF"); +#endif +} + PHP_MINIT_FUNCTION(basic) { #ifdef ZTS @@ -1027,6 +1056,8 @@ PHP_MINIT_FUNCTION(basic) REGISTER_MATH_CONSTANT(M_2_SQRTPI); REGISTER_MATH_CONSTANT(M_SQRT2); REGISTER_MATH_CONSTANT(M_SQRT1_2); + REGISTER_DOUBLE_CONSTANT("INF", php_get_inf(), CONST_CS | CONST_PERSISTENT); + REGISTER_DOUBLE_CONSTANT("NAN", php_get_nan(), CONST_CS | CONST_PERSISTENT); #if ENABLE_TEST_CLASS test_class_startup(); diff --git a/ext/standard/basic_functions.h b/ext/standard/basic_functions.h index c002ad5c98..01f3da44cf 100644 --- a/ext/standard/basic_functions.h +++ b/ext/standard/basic_functions.h @@ -211,4 +211,7 @@ typedef struct { #define SAFE_MODE_PROTECTED_ENV_VARS "LD_LIBRARY_PATH" #define SAFE_MODE_ALLOWED_ENV_VARS "PHP_" +PHPAPI double php_get_nan(); +PHPAPI double php_get_inf(); + #endif /* BASIC_FUNCTIONS_H */ diff --git a/ext/standard/config.m4 b/ext/standard/config.m4 index 136ce213c3..ff4d514444 100644 --- a/ext/standard/config.m4 +++ b/ext/standard/config.m4 @@ -263,6 +263,71 @@ if test "$PHP_SAPI" = "cgi" -o "$PHP_SAPI" = "cli" -o "$PHP_SAPI" = "embed"; the AC_DEFINE(ENABLE_CHROOT_FUNC, 1, [Whether to enable chroot() function]) fi +AC_CHECK_FUNCS(fpclass isinf isnan) + +AC_CACHE_CHECK(whether atof() accepts NAN, ac_cv_atof_accept_nan,[ + AC_TRY_RUN([ +#include <math.h> +#include <stdlib.h> + +#ifdef HAVE_ISNAN +#define zend_isnan(a) isnan(a) +#elif defined(NAN) +#define zend_isnan(a) (((a)==NAN)?1:0) +#elif defined(HAVE_FPCLASS) +#define zend_isnan(a) ((fpclass(a) == FP_SNAN) || (fpclass(a) == FP_QNAN)) +#else +#define zend_isnan(a) 0 +#endif + +int main(int argc, char** argv) +{ + return zend_isnan(atof("NAN")) ? 0 : 1; +} + ],[ + ac_cv_atof_accept_nan=yes + ],[ + ac_cv_atof_accept_nan=no + ],[ + ac_cv_atof_accept_nan=no + ]) + if test "$ac_cv_atof_accept_nan" = "yes"; then + AC_DEFINE([HAVE_ATOF_ACCEPTS_NAN], 1, [whether atof() accepts NAN]) + fi +]) + +AC_CACHE_CHECK(whether atof() accepts INF, ac_cv_atof_accept_inf,[ + AC_TRY_RUN([ +#include <math.h> +#include <stdlib.h> + +#ifdef HAVE_ISINF +#define zend_isinf(a) isinf(a) +#elif defined(INFINITY) +/* Might not work, but is required by ISO C99 */ +#define zend_isinf(a) (((a)==INFINITY)?1:0) +#elif defined(HAVE_FPCLASS) +#define zend_isinf(a) ((fpclass(a) == FP_PINF) || (fpclass(a) == FP_NINF)) +#else +#define zend_isinf(a) 0 +#endif + +int main(int argc, char** argv) +{ + return zend_isinf(atof("INF")) && zend_isinf(atof("-INF")) ? 0 : 1; +} + ],[ + ac_cv_atof_accept_inf=yes + ],[ + ac_cv_atof_accept_inf=no + ],[ + ac_cv_atof_accept_inf=no + ]) + if test "$ac_cv_atof_accept_inf" = "yes"; then + AC_DEFINE([HAVE_ATOF_ACCEPTS_INF], 1, [whether atof() accepts INF]) + fi +]) + PHP_NEW_EXTENSION(standard, array.c base64.c basic_functions.c browscap.c crc32.c crypt.c \ cyr_convert.c datetime.c dir.c dl.c dns.c exec.c file.c filestat.c \ flock_compat.c formatted_print.c fsock.c head.c html.c image.c \ diff --git a/ext/standard/var_unserializer.re b/ext/standard/var_unserializer.re index efdbdac5ef..7fa61059b5 100644 --- a/ext/standard/var_unserializer.re +++ b/ext/standard/var_unserializer.re @@ -1,3 +1,4 @@ + #include "php.h" #include "ext/standard/php_var.h" #include "php_incomplete_class.h" @@ -275,6 +276,23 @@ PHPAPI int php_var_unserialize(UNSERIALIZE_PARAMETER) return 1; } +"d:" ("NAN" | "-"? "INF") ";" { + *p = YYCURSOR; + INIT_PZVAL(*rval); +#if defined(HAVE_ATOF_ACCEPTS_NAN) && defined(HAVE_ATOF_ACCEPTS_INF) + ZVAL_DOUBLE(*rval, atof(start + 2)); +#else + if (!strncmp(start + 2, "NAN", 3)) { + ZVAL_DOUBLE(*rval, php_get_nan()); + } else if (!strncmp(start + 2, "INF", 3)) { + ZVAL_DOUBLE(*rval, php_get_inf()); + } else if (!strncmp(start + 2, "-INF", 4)) { + ZVAL_DOUBLE(*rval, -php_get_inf()); + } +#endif + return 1; +} + "d:" (iv | nv | nvexp) ";" { *p = YYCURSOR; INIT_PZVAL(*rval); |