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", &parameter, 
&parameter_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

Reply via email to