@@ -37,15 +37,6 @@ static PHP_FUNCTION(json_last_error);
37
37
38
38
static const char digits [] = "0123456789abcdef" ;
39
39
40
- #define PHP_JSON_HEX_TAG (1<<0)
41
- #define PHP_JSON_HEX_AMP (1<<1)
42
- #define PHP_JSON_HEX_APOS (1<<2)
43
- #define PHP_JSON_HEX_QUOT (1<<3)
44
- #define PHP_JSON_FORCE_OBJECT (1<<4)
45
-
46
- #define PHP_JSON_OUTPUT_ARRAY 0
47
- #define PHP_JSON_OUTPUT_OBJECT 1
48
-
49
40
ZEND_DECLARE_MODULE_GLOBALS (json )
50
41
51
42
/* {{{ arginfo */
@@ -81,6 +72,7 @@ static PHP_MINIT_FUNCTION(json)
81
72
REGISTER_LONG_CONSTANT ("JSON_HEX_APOS" , PHP_JSON_HEX_APOS , CONST_CS | CONST_PERSISTENT );
82
73
REGISTER_LONG_CONSTANT ("JSON_HEX_QUOT" , PHP_JSON_HEX_QUOT , CONST_CS | CONST_PERSISTENT );
83
74
REGISTER_LONG_CONSTANT ("JSON_FORCE_OBJECT" , PHP_JSON_FORCE_OBJECT , CONST_CS | CONST_PERSISTENT );
75
+ REGISTER_LONG_CONSTANT ("JSON_NUMERIC_CHECK" , PHP_JSON_NUMERIC_CHECK , CONST_CS | CONST_PERSISTENT );
84
76
85
77
REGISTER_LONG_CONSTANT ("JSON_ERROR_NONE" , PHP_JSON_ERROR_NONE , CONST_CS | CONST_PERSISTENT );
86
78
REGISTER_LONG_CONSTANT ("JSON_ERROR_DEPTH" , PHP_JSON_ERROR_DEPTH , CONST_CS | CONST_PERSISTENT );
@@ -294,6 +286,30 @@ static void json_escape_string(smart_str *buf, char *s, int len, int options TSR
294
286
return ;
295
287
}
296
288
289
+ if (options & PHP_JSON_NUMERIC_CHECK ) {
290
+ double d ;
291
+ int type ;
292
+ long p ;
293
+
294
+ if ((type = is_numeric_string (s , len , & p , & d , 0 )) != 0 ) {
295
+ if (type == IS_LONG ) {
296
+ smart_str_append_long (buf , p );
297
+ } else if (type == IS_DOUBLE ) {
298
+ if (!zend_isinf (d ) && !zend_isnan (d )) {
299
+ char * tmp ;
300
+ int l = spprintf (& tmp , 0 , "%.*k" , (int ) EG (precision ), d );
301
+ smart_str_appendl (buf , tmp , l );
302
+ efree (tmp );
303
+ } else {
304
+ php_error_docref (NULL TSRMLS_CC , E_WARNING , "double %.9g does not conform to the JSON spec, encoded as 0" , d );
305
+ smart_str_appendc (buf , '0' );
306
+ }
307
+ }
308
+ return ;
309
+ }
310
+
311
+ }
312
+
297
313
utf16 = (unsigned short * ) safe_emalloc (len , sizeof (unsigned short ), 0 );
298
314
299
315
len = utf8_to_utf16 (utf16 , s , len );
@@ -445,7 +461,7 @@ PHP_JSON_API void php_json_encode(smart_str *buf, zval *val, int options TSRMLS_
445
461
smart_str_appendl (buf , d , len );
446
462
efree (d );
447
463
} else {
448
- zend_error ( E_WARNING , "[json] (php_json_encode) double %.9g does not conform to the JSON spec, encoded as 0" , dbl );
464
+ php_error_docref ( NULL TSRMLS_CC , E_WARNING , "double %.9g does not conform to the JSON spec, encoded as 0" , dbl );
449
465
smart_str_appendc (buf , '0' );
450
466
}
451
467
}
@@ -461,7 +477,7 @@ PHP_JSON_API void php_json_encode(smart_str *buf, zval *val, int options TSRMLS_
461
477
break ;
462
478
463
479
default :
464
- zend_error ( E_WARNING , "[json] (php_json_encode) type is unsupported, encoded as null" );
480
+ php_error_docref ( NULL TSRMLS_CC , E_WARNING , "type is unsupported, encoded as null" );
465
481
smart_str_appendl (buf , "null" , 4 );
466
482
break ;
467
483
}
0 commit comments