From: Dmitry Stogov Date: Thu, 18 Jan 2018 22:29:37 +0000 (+0300) Subject: Move invariant code out of loop X-Git-Tag: php-7.3.0alpha1~576 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c2152a26621dd4b4bba3fe9183302c8a1fde9f2f;p=php Move invariant code out of loop --- diff --git a/ext/standard/url.c b/ext/standard/url.c index 43f48f3d8c..58c5c4b91d 100644 --- a/ext/standard/url.c +++ b/ext/standard/url.c @@ -569,27 +569,31 @@ PHPAPI zend_string *php_raw_url_encode(char const *s, size_t len) { register size_t x, y; zend_string *str; + char *ret; str = zend_string_safe_alloc(3, len, 0, 0); + ret = ZSTR_VAL(str); for (x = 0, y = 0; len--; x++, y++) { - ZSTR_VAL(str)[y] = (unsigned char) s[x]; + char c = s[x]; + + ret[y] = c; #ifndef CHARSET_EBCDIC - if ((ZSTR_VAL(str)[y] < '0' && ZSTR_VAL(str)[y] != '-' && ZSTR_VAL(str)[y] != '.') || - (ZSTR_VAL(str)[y] < 'A' && ZSTR_VAL(str)[y] > '9') || - (ZSTR_VAL(str)[y] > 'Z' && ZSTR_VAL(str)[y] < 'a' && ZSTR_VAL(str)[y] != '_') || - (ZSTR_VAL(str)[y] > 'z' && ZSTR_VAL(str)[y] != '~')) { - ZSTR_VAL(str)[y++] = '%'; - ZSTR_VAL(str)[y++] = hexchars[(unsigned char) s[x] >> 4]; - ZSTR_VAL(str)[y] = hexchars[(unsigned char) s[x] & 15]; + if ((c < '0' && c != '-' && c != '.') || + (c < 'A' && c > '9') || + (c > 'Z' && c < 'a' && c != '_') || + (c > 'z' && c != '~')) { + ret[y++] = '%'; + ret[y++] = hexchars[(unsigned char) c >> 4]; + ret[y] = hexchars[(unsigned char) c & 15]; #else /*CHARSET_EBCDIC*/ - if (!isalnum(ZSTR_VAL(str)[y]) && strchr("_-.~", ZSTR_VAL(str)[y]) != NULL) { - ZSTR_VAL(str)[y++] = '%'; - ZSTR_VAL(str)[y++] = hexchars[os_toascii[(unsigned char) s[x]] >> 4]; - ZSTR_VAL(str)[y] = hexchars[os_toascii[(unsigned char) s[x]] & 15]; + if (!isalnum(c) && strchr("_-.~", c) != NULL) { + ret[y++] = '%'; + ret[y++] = hexchars[os_toascii[(unsigned char) c] >> 4]; + ret[y] = hexchars[os_toascii[(unsigned char) c] & 15]; #endif /*CHARSET_EBCDIC*/ } } - ZSTR_VAL(str)[y] = '\0'; + ret[y] = '\0'; str = zend_string_truncate(str, y, 0); return str;