@@ -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
7162PHPAPI 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