]> granicus.if.org Git - php/commitdiff
Use one place to define max length of double
authorJakub Zelenka <bukka@php.net>
Sun, 26 Jun 2016 13:03:01 +0000 (14:03 +0100)
committerJakub Zelenka <bukka@php.net>
Sun, 26 Jun 2016 13:03:01 +0000 (14:03 +0100)
Introduce new constant PHP_DOUBLE_MAX_LENGTH for that purpose

ext/json/json.c
ext/json/json_encoder.c
ext/standard/var.c
main/php.h
main/spprintf.c

index d3c6111d4df264870abc994abecdb0710f181c10..8bb5e51d4159b409320f5265e99a4fcd9a4e387f 100644 (file)
 #include "php_json_parser.h"
 #include <zend_exceptions.h>
 
-#include <float.h>
-#if defined(DBL_MANT_DIG) && defined(DBL_MIN_EXP)
-#define NUM_BUF_SIZE (3 + DBL_MANT_DIG - DBL_MIN_EXP)
-#else
-#define NUM_BUF_SIZE 1080
-#endif
-
-
 static PHP_MINFO_FUNCTION(json);
 static PHP_FUNCTION(json_encode);
 static PHP_FUNCTION(json_decode);
index 7720393c3689d82f273d902ed416f094bb62ec5c..7cf76732350b9550a98e2c944a00c8badf2e7878 100644 (file)
 #include "php_json.h"
 #include <zend_exceptions.h>
 
-/* double limits */
-#include <float.h>
-#if defined(DBL_MANT_DIG) && defined(DBL_MIN_EXP)
-#define PHP_JSON_DOUBLE_MAX_LENGTH (3 + DBL_MANT_DIG - DBL_MIN_EXP)
-#else
-#define PHP_JSON_DOUBLE_MAX_LENGTH 1080
-#endif
-
 static const char digits[] = "0123456789abcdef";
 
 static void php_json_escape_string(smart_str *buf, char *s, size_t len, int options);
@@ -103,11 +95,11 @@ static inline int php_json_is_valid_double(double d) /* {{{ */
 static inline void php_json_encode_double(smart_str *buf, double d, int options) /* {{{ */
 {
        size_t len;
-       char num[PHP_JSON_DOUBLE_MAX_LENGTH];
+       char num[PHP_DOUBLE_MAX_LENGTH];
 
        php_gcvt(d, (int)PG(serialize_precision), '.', 'e', num);
        len = strlen(num);
-       if (options & PHP_JSON_PRESERVE_ZERO_FRACTION && strchr(num, '.') == NULL && len < PHP_JSON_DOUBLE_MAX_LENGTH - 2) {
+       if (options & PHP_JSON_PRESERVE_ZERO_FRACTION && strchr(num, '.') == NULL && len < PHP_DOUBLE_MAX_LENGTH - 2) {
                num[len++] = '.';
                num[len++] = '0';
                num[len] = '\0';
index e0938fe6e9b4eae96c7ec751d7b375fb710c8bc4..809161afecad4be3001979d8e7772de7b19a883a 100644 (file)
 
 #define COMMON (is_ref ? "&" : "")
 
-/* Copied from main/spprintf.c and use the same buffer size
- *
- * NUM_BUF_SIZE is the size of the buffer used for arithmetic conversions
- *
- * XXX: this is a magic number; do not decrease it
- * Emax = 1023
- * NDIG = 320
- * NUM_BUF_SIZE >= strlen("-") + Emax + strlrn(".") + NDIG + strlen("E+1023") + 1;
- */
-#define NUM_BUF_SIZE           2048
-
 static void php_array_element_dump(zval *zv, zend_ulong index, zend_string *key, int level) /* {{{ */
 {
        if (key == NULL) { /* numeric key */
@@ -447,7 +436,7 @@ static void php_object_element_export(zval *zv, zend_ulong index, zend_string *k
 PHPAPI void php_var_export_ex(zval *struc, int level, smart_str *buf) /* {{{ */
 {
        HashTable *myht;
-       char tmp_str[NUM_BUF_SIZE];
+       char tmp_str[PHP_DOUBLE_MAX_LENGTH];
        zend_string *ztmp, *ztmp2;
        zend_ulong index;
        zend_string *key;
@@ -853,7 +842,7 @@ again:
                        return;
 
                case IS_DOUBLE: {
-                       char tmp_str[NUM_BUF_SIZE];
+                       char tmp_str[PHP_DOUBLE_MAX_LENGTH];
                        smart_str_appendl(buf, "d:", 2);
                        php_gcvt(Z_DVAL_P(struc), (int)PG(serialize_precision), '.', 'E', tmp_str);
                        smart_str_appends(buf, tmp_str);
index 8eb1c53e8b11d856e01afd8182bf32c3f4386669..8cc785101626106c8528ff45fd114631c7247c79 100644 (file)
@@ -231,6 +231,14 @@ char *strerror(int);
 #define INT_MIN (- INT_MAX - 1)
 #endif
 
+/* double limits */
+#include <float.h>
+#if defined(DBL_MANT_DIG) && defined(DBL_MIN_EXP)
+#define PHP_DOUBLE_MAX_LENGTH (3 + DBL_MANT_DIG - DBL_MIN_EXP)
+#else
+#define PHP_DOUBLE_MAX_LENGTH 1080
+#endif
+
 #define PHP_GCC_VERSION ZEND_GCC_VERSION
 #define PHP_ATTRIBUTE_MALLOC ZEND_ATTRIBUTE_MALLOC
 #define PHP_ATTRIBUTE_FORMAT ZEND_ATTRIBUTE_FORMAT
index cac4210dfbd86c2d58f48270a490f7b1a5e74f67..73a5ff52e3fc8add467167395d2244a87cd831b6 100644 (file)
 
 /*
  * NUM_BUF_SIZE is the size of the buffer used for arithmetic conversions
- *
- * XXX: this is a magic number; do not decrease it
- * Emax = 1023
- * NDIG = 320
- * NUM_BUF_SIZE >= strlen("-") + Emax + strlrn(".") + NDIG + strlen("E+1023") + 1;
+ * which can be at most max length of double
  */
-#define NUM_BUF_SIZE           2048
+#define NUM_BUF_SIZE PHP_DOUBLE_MAX_LENGTH
 
 #define NUM(c) (c - '0')