]> granicus.if.org Git - php/commitdiff
MFH: Fixed bug #24640 (var_export and var_dump can not output large float). (Marcus)
authorfoobar <sniper@php.net>
Fri, 18 Jul 2003 01:37:44 +0000 (01:37 +0000)
committerfoobar <sniper@php.net>
Fri, 18 Jul 2003 01:37:44 +0000 (01:37 +0000)
main/snprintf.c

index cb52a83a94623f29cede2d9ed03e58f0cc1b2151..b0794ca56c36ba1a47a34f3a78e487f6b3bfed80 100644 (file)
@@ -1,3 +1,25 @@
+/*
+  +----------------------------------------------------------------------+
+  | PHP Version 4                                                        |
+  +----------------------------------------------------------------------+
+  | Copyright (c) 1997-2003 The PHP Group                                |
+  +----------------------------------------------------------------------+
+  | This source file is subject to version 2.02 of the PHP license,      |
+  | that is bundled with this package in the file LICENSE, and is        |
+  | available at through the world-wide-web at                           |
+  | http://www.php.net/license/2_02.txt.                                 |
+  | If you did not receive a copy of the PHP license and are unable to   |
+  | obtain it through the world-wide-web, please send a note to          |
+  | license@php.net so we can mail you a copy immediately.               |
+  +----------------------------------------------------------------------+
+  | Author:                                                              |
+  +----------------------------------------------------------------------+
+
+  $Id$ 
+*/
+
+/* $Id$ */
+
 /* ====================================================================
  * Copyright (c) 1995-1998 The Apache Group.  All rights reserved.
  *
@@ -132,6 +154,8 @@ ap_php_conv_10(register wide_int num, register bool_int is_unsigned,
        return (p);
 }
 
+/* If you change this value then also change bug24640.phpt.
+ */
 #define        NDIG    80
 
 
@@ -271,6 +295,7 @@ char *
 ap_php_cvt(double arg, int ndigits, int *decpt, int *sign, int eflag, char *buf)
 {
        register int r2;
+       int mvl;
        double fi, fj;
        register char *p, *p1;
 
@@ -290,9 +315,16 @@ ap_php_cvt(double arg, int ndigits, int *decpt, int *sign, int eflag, char *buf)
         */
        if (fi != 0) {
                p1 = &buf[NDIG];
-               while (p1 > &buf[0] && fi != 0) {
+               while (fi != 0) {
                        fj = modf(fi / 10, &fi);
-                       *--p1 = (int) ((fj + .03) * 10) + '0';
+                       if (p1 > &buf[0]) {
+                               *--p1 = (int) ((fj + .03) * 10) + '0';
+                       } else {
+                               mvl = NDIG - ndigits;
+                               memmove(&buf[mvl], &buf[0], NDIG-mvl-1);
+                               p1 += mvl;
+                               *--p1 = (int) ((fj + .03) * 10) + '0';
+                       }
                        r2++;
                }
                while (p1 < &buf[NDIG])