helly           Fri Mar 26 19:50:41 2004 EDT

  Modified files:              
    /php-src/ext/standard       config.m4 basic_functions.c basic_functions.h 
                                var_unserializer.re 
    /php-src/ext/standard/tests/math    bug27646.phpt 
  Log:
  Portable solution for bug #27646 that works correct on Windows, too
  
  
http://cvs.php.net/diff.php/php-src/ext/standard/config.m4?r1=1.67&r2=1.68&ty=u
Index: php-src/ext/standard/config.m4
diff -u php-src/ext/standard/config.m4:1.67 php-src/ext/standard/config.m4:1.68
--- php-src/ext/standard/config.m4:1.67 Mon Oct 27 00:35:41 2003
+++ php-src/ext/standard/config.m4      Fri Mar 26 19:50:39 2004
@@ -1,4 +1,4 @@
-dnl $Id: config.m4,v 1.67 2003/10/27 05:35:41 iliaa Exp $ -*- sh -*-
+dnl $Id: config.m4,v 1.68 2004/03/27 00:50:39 helly Exp $ -*- sh -*-
 
 divert(3)dnl
 
@@ -326,6 +326,71 @@
   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_CHECK_I18N_FUNCS
 
 PHP_NEW_EXTENSION(standard, array.c base64.c basic_functions.c browscap.c crc32.c 
crypt.c \
http://cvs.php.net/diff.php/php-src/ext/standard/basic_functions.c?r1=1.658&r2=1.659&ty=u
Index: php-src/ext/standard/basic_functions.c
diff -u php-src/ext/standard/basic_functions.c:1.658 
php-src/ext/standard/basic_functions.c:1.659
--- php-src/ext/standard/basic_functions.c:1.658        Fri Mar 26 14:53:07 2004
+++ php-src/ext/standard/basic_functions.c      Fri Mar 26 19:50:39 2004
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: basic_functions.c,v 1.658 2004/03/26 19:53:07 helly Exp $ */
+/* $Id: basic_functions.c,v 1.659 2004/03/27 00:50:39 helly Exp $ */
 
 #include "php.h"
 #include "php_streams.h"
@@ -950,7 +950,7 @@
 #define PHP_DOUBLE_INFINITY_HIGH       0x7ff00000
 #define PHP_DOUBLE_QUIET_NAN_HIGH      0xfff80000
 
-static double php_get_nan()
+PHPAPI double php_get_nan()
 {
 #if defined(__i386__) || defined(_X86_) || defined(ALPHA) || defined(_ALPHA) || 
defined(__alpha)
        double val;
@@ -963,7 +963,7 @@
 #endif
 }
 
-static double php_get_inf()
+PHPAPI double php_get_inf()
 {
 #if defined(__i386__) || defined(_X86_) || defined(ALPHA) || defined(_ALPHA) || 
defined(__alpha)
        double val;
http://cvs.php.net/diff.php/php-src/ext/standard/basic_functions.h?r1=1.132&r2=1.133&ty=u
Index: php-src/ext/standard/basic_functions.h
diff -u php-src/ext/standard/basic_functions.h:1.132 
php-src/ext/standard/basic_functions.h:1.133
--- php-src/ext/standard/basic_functions.h:1.132        Mon Feb 23 16:03:58 2004
+++ php-src/ext/standard/basic_functions.h      Fri Mar 26 19:50:39 2004
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: basic_functions.h,v 1.132 2004/02/23 21:03:58 wez Exp $ */
+/* $Id: basic_functions.h,v 1.133 2004/03/27 00:50:39 helly Exp $ */
 
 #ifndef BASIC_FUNCTIONS_H
 #define BASIC_FUNCTIONS_H
@@ -231,4 +231,7 @@
 #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 */
http://cvs.php.net/diff.php/php-src/ext/standard/var_unserializer.re?r1=1.26&r2=1.27&ty=u
Index: php-src/ext/standard/var_unserializer.re
diff -u php-src/ext/standard/var_unserializer.re:1.26 
php-src/ext/standard/var_unserializer.re:1.27
--- php-src/ext/standard/var_unserializer.re:1.26       Tue Mar 23 17:30:25 2004
+++ php-src/ext/standard/var_unserializer.re    Fri Mar 26 19:50:39 2004
@@ -16,7 +16,7 @@
   +----------------------------------------------------------------------+
 */
 
-/* $Id: var_unserializer.re,v 1.26 2004/03/23 22:30:25 helly Exp $ */
+/* $Id: var_unserializer.re,v 1.27 2004/03/27 00:50:39 helly Exp $ */
 
 #include "php.h"
 #include "ext/standard/php_var.h"
@@ -320,7 +320,24 @@
        return 1;
 }
 
-"d:" (iv | nv | nvexp | "NAN" | "-"? "INF") ";"        {
+"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);
        ZVAL_DOUBLE(*rval, atof(start + 2));
http://cvs.php.net/diff.php/php-src/ext/standard/tests/math/bug27646.phpt?r1=1.2&r2=1.3&ty=u
Index: php-src/ext/standard/tests/math/bug27646.phpt
diff -u php-src/ext/standard/tests/math/bug27646.phpt:1.2 
php-src/ext/standard/tests/math/bug27646.phpt:1.3
--- php-src/ext/standard/tests/math/bug27646.phpt:1.2   Thu Mar 25 17:36:36 2004
+++ php-src/ext/standard/tests/math/bug27646.phpt       Fri Mar 26 19:50:41 2004
@@ -3,6 +3,16 @@
 --FILE--
 <?php
 
+$f=12.3;
+var_dump($f);
+var_dump(serialize($f));
+var_dump(unserialize(serialize($f)));
+
+$f=-12.3;
+var_dump($f);
+var_dump(serialize($f));
+var_dump(unserialize(serialize($f)));
+
 $f=-INF;
 var_dump($f);
 var_dump(serialize($f));
@@ -19,7 +29,13 @@
 var_dump(unserialize(serialize($f)));
 
 ?>
---EXPECT--
+--EXPECTF--
+float(1%f)
+string(%d) "d:1%s;"
+float(1%f)
+float(-1%f)
+string(%d) "d:-1%s;"
+float(-1%f)
 float(-INF)
 string(7) "d:-INF;"
 float(-INF)

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to