andrei Mon Dec 4 18:55:40 2006 UTC
Modified files:
/php-src/ext/standard string.c var.c
Log:
Unicode support in var_export().
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/string.c?r1=1.616&r2=1.617&diff_format=u
Index: php-src/ext/standard/string.c
diff -u php-src/ext/standard/string.c:1.616 php-src/ext/standard/string.c:1.617
--- php-src/ext/standard/string.c:1.616 Thu Nov 30 21:46:54 2006
+++ php-src/ext/standard/string.c Mon Dec 4 18:55:40 2006
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: string.c,v 1.616 2006/11/30 21:46:54 andrei Exp $ */
+/* $Id: string.c,v 1.617 2006/12/04 18:55:40 andrei Exp $ */
/* Synced with php 3.0 revision 1.193 1999-06-16 [ssb] */
@@ -4799,7 +4799,7 @@
*(buf+buf_len) = (UChar)0x30; buf_len++; /* 0 */
break;
case '\'':
- case '\"':
+ case '\"':
case '\\':
*(buf+buf_len) = (UChar)0x5C;
buf_len++; /* \ */
/* break is missing *intentionally* */
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/var.c?r1=1.248&r2=1.249&diff_format=u
Index: php-src/ext/standard/var.c
diff -u php-src/ext/standard/var.c:1.248 php-src/ext/standard/var.c:1.249
--- php-src/ext/standard/var.c:1.248 Fri Dec 1 19:25:10 2006
+++ php-src/ext/standard/var.c Mon Dec 4 18:55:40 2006
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: var.c,v 1.248 2006/12/01 19:25:10 andrei Exp $ */
+/* $Id: var.c,v 1.249 2006/12/04 18:55:40 andrei Exp $ */
@@ -521,6 +521,47 @@
return 0;
}
+static void php_unicode_export(UChar *ustr, int ustr_len TSRMLS_DC)
+{
+ UChar32 cp;
+ int i = 0;
+ char buf[10];
+ int buf_len;
+
+ /*
+ * We export all codepoints > 128 in escaped form to avoid encoding
issues
+ * in case the result is used in a script.
+ */
+ while (i < ustr_len) {
+ U16_NEXT(ustr, i, ustr_len, cp);
+ switch (cp) {
+ case 0x0: /* '\0' */
+ PHPWRITE("\\0", 2);
+ break;
+
+ case 0x27: /* '\'' */
+ PHPWRITE("\\'", 2);
+ break;
+
+ case 0x5c: /* '\\' */
+ PHPWRITE("\\\\", 2);
+ break;
+
+ default:
+ if ((uint32_t)cp < 128) {
+ buf[0] = (char) (short) cp;
+ buf_len = 1;
+ } else if (U_IS_BMP(cp)) {
+ buf_len = snprintf(buf, sizeof(buf),
"\\u%04X", cp);
+ } else {
+ buf_len = snprintf(buf, sizeof(buf),
"\\u%06X", cp);
+ }
+ PHPWRITE(buf, buf_len);
+ break;
+ }
+ }
+}
+
PHPAPI void php_var_export(zval **struc, int level TSRMLS_DC)
{
HashTable *myht;
@@ -550,7 +591,9 @@
efree (tmp_str);
break;
case IS_UNICODE:
- php_var_dump_unicode(Z_USTRVAL_PP(struc), Z_USTRLEN_PP(struc),
0, "'", 1 TSRMLS_CC);
+ PUTS ("'");
+ php_unicode_export(Z_USTRVAL_PP(struc), Z_USTRLEN_PP(struc)
TSRMLS_CC);
+ PUTS ("'");
break;
case IS_ARRAY:
myht = Z_ARRVAL_PP(struc);
@@ -589,7 +632,7 @@
/* }}} */
-/* {{{ proto mixed var_export(mixed var [, bool return])
+/* {{{ proto mixed var_export(mixed var [, bool return]) U
Outputs or returns a string representation of a variable */
PHP_FUNCTION(var_export)
{
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php