mirror of
https://github.com/php/php-src.git
synced 2026-04-26 09:28:21 +02:00
Merge branch 'PHP-5.4' into PHP-5.5
* PHP-5.4: Related bug #63588 fix length computation + optimize for speed
This commit is contained in:
+22
-17
@@ -363,12 +363,13 @@ static int json_utf8_to_utf16(unsigned short *utf16, char utf8[], int len) /* {{
|
||||
size_t pos = 0, us;
|
||||
int j, status;
|
||||
|
||||
for (j=0 ; pos < len ; j++) {
|
||||
us = php_next_utf8_char((const unsigned char *)utf8, len, &pos, &status);
|
||||
if (status != SUCCESS) {
|
||||
return -1;
|
||||
}
|
||||
if (utf16) {
|
||||
if (utf16) {
|
||||
/* really convert the utf8 string */
|
||||
for (j=0 ; pos < len ; j++) {
|
||||
us = php_next_utf8_char((const unsigned char *)utf8, len, &pos, &status);
|
||||
if (status != SUCCESS) {
|
||||
return -1;
|
||||
}
|
||||
/* From http://en.wikipedia.org/wiki/UTF16 */
|
||||
if (us >= 0x10000) {
|
||||
us -= 0x10000;
|
||||
@@ -378,14 +379,23 @@ static int json_utf8_to_utf16(unsigned short *utf16, char utf8[], int len) /* {{
|
||||
utf16[j] = (unsigned short)us;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
/* Only check if utf8 string is valid, and compute utf16 lenght */
|
||||
for (j=0 ; pos < len ; j++) {
|
||||
us = php_next_utf8_char((const unsigned char *)utf8, len, &pos, &status);
|
||||
if (status != SUCCESS) {
|
||||
return -1;
|
||||
}
|
||||
if (us >= 0x10000) {
|
||||
j++;
|
||||
}
|
||||
}
|
||||
}
|
||||
return j;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
#define REVERSE16(us) (((us & 0xf) << 12) | (((us >> 4) & 0xf) << 8) | (((us >> 8) & 0xf) << 4) | ((us >> 12) & 0xf))
|
||||
|
||||
static void json_escape_string(smart_str *buf, char *s, int len, int options TSRMLS_DC) /* {{{ */
|
||||
{
|
||||
int pos = 0, ulen = 0;
|
||||
@@ -527,15 +537,10 @@ static void json_escape_string(smart_str *buf, char *s, int len, int options TSR
|
||||
smart_str_appendc(buf, (unsigned char) us);
|
||||
} else {
|
||||
smart_str_appendl(buf, "\\u", 2);
|
||||
us = REVERSE16(us);
|
||||
|
||||
smart_str_appendc(buf, digits[us & ((1 << 4) - 1)]);
|
||||
us >>= 4;
|
||||
smart_str_appendc(buf, digits[us & ((1 << 4) - 1)]);
|
||||
us >>= 4;
|
||||
smart_str_appendc(buf, digits[us & ((1 << 4) - 1)]);
|
||||
us >>= 4;
|
||||
smart_str_appendc(buf, digits[us & ((1 << 4) - 1)]);
|
||||
smart_str_appendc(buf, digits[(us & 0xf000) >> 12]);
|
||||
smart_str_appendc(buf, digits[(us & 0xf00) >> 8]);
|
||||
smart_str_appendc(buf, digits[(us & 0xf0) >> 4]);
|
||||
smart_str_appendc(buf, digits[(us & 0xf)]);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user