]> granicus.if.org Git - php/commitdiff
Move invariant code out of loop
authorDmitry Stogov <dmitry@zend.com>
Thu, 18 Jan 2018 22:29:37 +0000 (01:29 +0300)
committerDmitry Stogov <dmitry@zend.com>
Thu, 18 Jan 2018 22:29:37 +0000 (01:29 +0300)
ext/standard/url.c

index 43f48f3d8ccf7040ac92b552276ad3dd73827ec1..58c5c4b91dce6904e5226ff581e896584dbe3aa0 100644 (file)
@@ -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;