]> granicus.if.org Git - php/commitdiff
MFH: bugfix #27646
authorMarcus Boerger <helly@php.net>
Sat, 27 Mar 2004 01:17:07 +0000 (01:17 +0000)
committerMarcus Boerger <helly@php.net>
Sat, 27 Mar 2004 01:17:07 +0000 (01:17 +0000)
ext/standard/basic_functions.c
ext/standard/basic_functions.h
ext/standard/config.m4
ext/standard/var_unserializer.re

index c2e6ad940384890e5fa91e29dc40064d239e4eb7..f1066fc4c640fbfd0989474e193d8537f64d243e 100644 (file)
@@ -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();
index c002ad5c98e8d871750a36ba118da0bba2fd6db7..01f3da44cfabdeaff4c52fc27d035f3b2c0fa8b4 100644 (file)
@@ -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 */
index 136ce213c39487c17a268e8ea305365dc009f2c3..ff4d514444e4371e5e768d61ea3ede2923b08c17 100644 (file)
@@ -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 \
index efdbdac5ef160f6724c1fa1511d32dc4a19bc111..7fa61059b5b1aa32ab17c780c0850b5e3aea7df2 100644 (file)
@@ -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);