Skip to content

Commit 4cc7c77

Browse files
authored
Add php_str_to_utf8 Without allocation
1 parent 836e617 commit 4cc7c77

File tree

1 file changed

+16
-25
lines changed

1 file changed

+16
-25
lines changed

ext/standard/url.c

Lines changed: 16 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -47,25 +47,16 @@ PHPAPI void php_url_free(php_url *theurl)
4747
}
4848
/* }}} */
4949

50-
static void php_str_to_utf8(const char *str, size_t len)
50+
static void php_str_to_utf8(zend_string *str)
5151
{
52-
zend_string *utf8 = zend_string_safe_alloc(len, 4, 0, 0);
53-
const unsigned char *s = (const unsigned char *)str;
54-
const unsigned char *e = s + len;
55-
unsigned char *d = (unsigned char *)ZSTR_VAL(utf8);
56-
52+
const unsigned char *s = (const unsigned char *)ZSTR_VAL(str);
53+
const unsigned char *e = s + ZSTR_LEN(str);
5754
while (s < e) {
58-
if (*s < 0x80) { // ASCII
59-
*d++ = *s++;
60-
} else {
61-
/* Convert non-ASCII bytes to UTF-8 */
62-
*d++ = 0xEF;
63-
*d++ = 0xBF;
64-
*d++ = 0xBD;
65-
s++;
55+
if (*s & 0x80) {
56+
return;
6657
}
58+
s++;
6759
}
68-
zend_string_release(utf8);
6960
}
7061

7162
PHPAPI php_url *php_url_parse(char const *str)
@@ -125,7 +116,7 @@ PHPAPI php_url *php_url_parse_ex2(char const *str, size_t length, bool *has_port
125116

126117
if (e + 1 == ue) { /* only scheme is available */
127118
ret->scheme = zend_string_init(s, (e - s), 0);
128-
php_str_to_utf8(ZSTR_VAL(ret->scheme), ZSTR_LEN(ret->scheme));
119+
php_str_to_utf8(ret->scheme);
129120
return ret;
130121
}
131122

@@ -147,13 +138,13 @@ PHPAPI php_url *php_url_parse_ex2(char const *str, size_t length, bool *has_port
147138
}
148139

149140
ret->scheme = zend_string_init(s, (e-s), 0);
150-
php_str_to_utf8(ZSTR_VAL(ret->scheme), ZSTR_LEN(ret->scheme));
141+
php_str_to_utf8(ret->scheme);
151142

152143
s = e + 1;
153144
goto just_path;
154145
} else {
155146
ret->scheme = zend_string_init(s, (e-s), 0);
156-
php_str_to_utf8(ZSTR_VAL(ret->scheme), ZSTR_LEN(ret->scheme));
147+
php_str_to_utf8(ret->scheme);
157148

158149
if (e + 2 < ue && *(e + 2) == '/') {
159150
s = e + 3;
@@ -219,14 +210,14 @@ PHPAPI php_url *php_url_parse_ex2(char const *str, size_t length, bool *has_port
219210
if ((p = zend_memrchr(s, '@', (e-s)))) {
220211
if ((pp = memchr(s, ':', (p-s)))) {
221212
ret->user = zend_string_init(s, (pp-s), 0);
222-
php_str_to_utf8(ZSTR_VAL(ret->user), ZSTR_LEN(ret->user));
213+
php_str_to_utf8(ret->user);
223214

224215
pp++;
225216
ret->pass = zend_string_init(pp, (p-pp), 0);
226-
php_str_to_utf8(ZSTR_VAL(ret->pass), ZSTR_LEN(ret->pass));
217+
php_str_to_utf8(ret->pass);
227218
} else {
228219
ret->user = zend_string_init(s, (p-s), 0);
229-
php_str_to_utf8(ZSTR_VAL(ret->user), ZSTR_LEN(ret->user));
220+
php_str_to_utf8(ret->user);
230221
}
231222

232223
s = p + 1;
@@ -275,7 +266,7 @@ PHPAPI php_url *php_url_parse_ex2(char const *str, size_t length, bool *has_port
275266
}
276267

277268
ret->host = zend_string_init(s, (p-s), 0);
278-
php_str_to_utf8(ZSTR_VAL(ret->host), ZSTR_LEN(ret->host));
269+
php_str_to_utf8(ret->host);
279270

280271
if (e == ue) {
281272
return ret;
@@ -291,7 +282,7 @@ PHPAPI php_url *php_url_parse_ex2(char const *str, size_t length, bool *has_port
291282
p++;
292283
if (p < e) {
293284
ret->fragment = zend_string_init(p, (e - p), 0);
294-
php_str_to_utf8(ZSTR_VAL(ret->fragment), ZSTR_LEN(ret->fragment));
285+
php_str_to_utf8(ret->fragment);
295286
} else {
296287
ret->fragment = ZSTR_EMPTY_ALLOC();
297288
}
@@ -303,7 +294,7 @@ PHPAPI php_url *php_url_parse_ex2(char const *str, size_t length, bool *has_port
303294
p++;
304295
if (p < e) {
305296
ret->query = zend_string_init(p, (e - p), 0);
306-
php_str_to_utf8(ZSTR_VAL(ret->query), ZSTR_LEN(ret->query));
297+
php_str_to_utf8(ret->query);
307298
} else {
308299
ret->query = ZSTR_EMPTY_ALLOC();
309300
}
@@ -312,7 +303,7 @@ PHPAPI php_url *php_url_parse_ex2(char const *str, size_t length, bool *has_port
312303

313304
if (s < e || s == ue) {
314305
ret->path = zend_string_init(s, (e - s), 0);
315-
php_str_to_utf8(ZSTR_VAL(ret->path), ZSTR_LEN(ret->path));
306+
php_str_to_utf8(ret->path);
316307
}
317308

318309
return ret;

0 commit comments

Comments
 (0)