andrei Sun May 31 01:43:45 2009 UTC Modified files: (Branch: PHP_5_2) /php-src/ext/json json.c php_json.h Log: Expose encode/decode API. http://cvs.php.net/viewvc.cgi/php-src/ext/json/json.c?r1=1.9.2.26&r2=1.9.2.27&diff_format=u Index: php-src/ext/json/json.c diff -u php-src/ext/json/json.c:1.9.2.26 php-src/ext/json/json.c:1.9.2.27 --- php-src/ext/json/json.c:1.9.2.26 Thu Feb 12 00:36:23 2009 +++ php-src/ext/json/json.c Sun May 31 01:43:45 2009 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: json.c,v 1.9.2.26 2009/02/12 00:36:23 scottmac Exp $ */ +/* $Id: json.c,v 1.9.2.27 2009/05/31 01:43:45 andrei Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -83,7 +83,6 @@ } /* }}} */ -static void json_encode_r(smart_str *buf, zval *val TSRMLS_DC); static void json_escape_string(smart_str *buf, char *s, int len TSRMLS_DC); static int json_determine_array_type(zval **val TSRMLS_DC) /* {{{ */ @@ -176,7 +175,7 @@ need_comma = 1; } - json_encode_r(buf, *data TSRMLS_CC); + php_json_encode(buf, *data TSRMLS_CC); } else if (r == 1) { if (i == HASH_KEY_IS_STRING) { if (key[0] == '\0' && Z_TYPE_PP(val) == IS_OBJECT) { @@ -196,7 +195,7 @@ json_escape_string(buf, key, key_len - 1 TSRMLS_CC); smart_str_appendc(buf, ':'); - json_encode_r(buf, *data TSRMLS_CC); + php_json_encode(buf, *data TSRMLS_CC); } else { if (need_comma) { smart_str_appendc(buf, ','); @@ -209,7 +208,7 @@ smart_str_appendc(buf, '"'); smart_str_appendc(buf, ':'); - json_encode_r(buf, *data TSRMLS_CC); + php_json_encode(buf, *data TSRMLS_CC); } } @@ -342,7 +341,7 @@ } /* }}} */ -static void json_encode_r(smart_str *buf, zval *val TSRMLS_DC) /* {{{ */ +PHPAPI void php_json_encode(smart_str *buf, zval *val TSRMLS_DC) /* {{{ */ { switch (Z_TYPE_P(val)) { case IS_NULL: @@ -372,7 +371,7 @@ smart_str_appendl(buf, d, len); efree(d); } else { - zend_error(E_WARNING, "[json] (json_encode_r) double %.9g does not conform to the JSON spec, encoded as 0.", dbl); + zend_error(E_WARNING, "[json] (php_json_encode) double %.9g does not conform to the JSON spec, encoded as 0.", dbl); smart_str_appendc(buf, '0'); } } @@ -385,7 +384,7 @@ json_encode_array(buf, &val TSRMLS_CC); break; default: - zend_error(E_WARNING, "[json] (json_encode_r) type is unsupported, encoded as null."); + zend_error(E_WARNING, "[json] (php_json_encode) type is unsupported, encoded as null."); smart_str_appendl(buf, "null", 4); break; } @@ -394,6 +393,64 @@ } /* }}} */ +PHPAPI void php_json_decode(zval *return_value, char *buf, int buf_len, zend_bool assoc) /* {{{ */ +{ + unsigned short *utf16; + int utf16_len; + zval *z; + + utf16 = (unsigned short *) safe_emalloc((buf_len+1), sizeof(unsigned short), 1); + + utf16_len = utf8_to_utf16(utf16, buf, buf_len); + if (utf16_len <= 0) + { + if (utf16) + { + efree(utf16); + } + + RETURN_NULL(); + } + + ALLOC_INIT_ZVAL(z); + if (JSON_parser(z, utf16, utf16_len, assoc TSRMLS_CC)) + { + *return_value = *z; + + FREE_ZVAL(z); + efree(utf16); + } + else + { + double d; + int type; + long p; + + zval_dtor(z); + FREE_ZVAL(z); + efree(utf16); + + if (buf_len == 4) { + if (!strcasecmp(buf, "null")) { + RETURN_NULL(); + } else if (!strcasecmp(buf, "true")) { + RETURN_BOOL(1); + } + } else if (buf_len == 5 && !strcasecmp(buf, "false")) { + RETURN_BOOL(0); + } + if ((type = is_numeric_string(buf, buf_len, &p, &d, 0)) != 0) { + if (type == IS_LONG) { + RETURN_LONG(p); + } else if (type == IS_DOUBLE) { + RETURN_DOUBLE(d); + } + } + RETURN_NULL(); + } +} +/* }}} */ + /* {{{ proto string json_encode(mixed data) Returns the JSON representation of a value */ static PHP_FUNCTION(json_encode) @@ -405,7 +462,7 @@ return; } - json_encode_r(&buf, parameter TSRMLS_CC); + php_json_encode(&buf, parameter TSRMLS_CC); ZVAL_STRINGL(return_value, buf.c, buf.len, 1); @@ -418,10 +475,8 @@ static PHP_FUNCTION(json_decode) { char *parameter; - int parameter_len, utf16_len; + int parameter_len; zend_bool assoc = 0; /* return JS objects as PHP objects by default */ - zval *z; - unsigned short *utf16; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|b", ¶meter, ¶meter_len, &assoc) == FAILURE) { return; @@ -432,55 +487,7 @@ RETURN_NULL(); } - utf16 = (unsigned short *) safe_emalloc((parameter_len+1), sizeof(unsigned short), 1); - - utf16_len = utf8_to_utf16(utf16, parameter, parameter_len); - if (utf16_len <= 0) - { - if (utf16) - { - efree(utf16); - } - - RETURN_NULL(); - } - - ALLOC_INIT_ZVAL(z); - if (JSON_parser(z, utf16, utf16_len, assoc TSRMLS_CC)) - { - *return_value = *z; - - FREE_ZVAL(z); - efree(utf16); - } - else - { - double d; - int type; - long p; - - zval_dtor(z); - FREE_ZVAL(z); - efree(utf16); - - if (parameter_len == 4) { - if (!strcasecmp(parameter, "null")) { - RETURN_NULL(); - } else if (!strcasecmp(parameter, "true")) { - RETURN_BOOL(1); - } - } else if (parameter_len == 5 && !strcasecmp(parameter, "false")) { - RETURN_BOOL(0); - } - if ((type = is_numeric_string(parameter, parameter_len, &p, &d, 0)) != 0) { - if (type == IS_LONG) { - RETURN_LONG(p); - } else if (type == IS_DOUBLE) { - RETURN_DOUBLE(d); - } - } - RETURN_NULL(); - } + php_json_decode(return_value, parameter, parameter_len, assoc); } /* }}} */ http://cvs.php.net/viewvc.cgi/php-src/ext/json/php_json.h?r1=1.8.2.4&r2=1.8.2.5&diff_format=u Index: php-src/ext/json/php_json.h diff -u php-src/ext/json/php_json.h:1.8.2.4 php-src/ext/json/php_json.h:1.8.2.5 --- php-src/ext/json/php_json.h:1.8.2.4 Wed Dec 31 11:17:38 2008 +++ php-src/ext/json/php_json.h Sun May 31 01:43:45 2009 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_json.h,v 1.8.2.4 2008/12/31 11:17:38 sebastian Exp $ */ +/* $Id: php_json.h,v 1.8.2.5 2009/05/31 01:43:45 andrei Exp $ */ #ifndef PHP_JSON_H #define PHP_JSON_H @@ -42,6 +42,9 @@ #define JSON_G(v) (json_globals.v) #endif +PHPAPI void php_json_encode(smart_str *buf, zval *val TSRMLS_DC); +PHPAPI void php_json_decode(zval *return_value, char *buf, int buf_len, zend_bool assoc); + #endif /* PHP_JSON_H */
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php