]> granicus.if.org Git - php/commitdiff
Use ascii lowercase if locale is default C
authorXinchen Hui <laruence@gmail.com>
Tue, 28 Apr 2020 03:33:02 +0000 (11:33 +0800)
committerXinchen Hui <laruence@gmail.com>
Thu, 30 Apr 2020 10:43:09 +0000 (18:43 +0800)
ext/standard/string.c

index a3b743474bb252cfbe15ec1d3249107d453b2ced..c2e9fe3c276d81e50fc8b688c31fda13103a714d 100644 (file)
@@ -1462,29 +1462,33 @@ PHPAPI zend_string *php_string_tolower(zend_string *s)
        unsigned char *c;
        const unsigned char *e;
 
-       c = (unsigned char *)ZSTR_VAL(s);
-       e = c + ZSTR_LEN(s);
+       if (EXPECTED(!BG(locale_changed))) {
+               return zend_string_tolower(s);
+       } else {
+               c = (unsigned char *)ZSTR_VAL(s);
+               e = c + ZSTR_LEN(s);
 
-       while (c < e) {
-               if (isupper(*c)) {
-                       register unsigned char *r;
-                       zend_string *res = zend_string_alloc(ZSTR_LEN(s), 0);
+               while (c < e) {
+                       if (isupper(*c)) {
+                               register unsigned char *r;
+                               zend_string *res = zend_string_alloc(ZSTR_LEN(s), 0);
 
-                       if (c != (unsigned char*)ZSTR_VAL(s)) {
-                               memcpy(ZSTR_VAL(res), ZSTR_VAL(s), c - (unsigned char*)ZSTR_VAL(s));
-                       }
-                       r = c + (ZSTR_VAL(res) - ZSTR_VAL(s));
-                       while (c < e) {
-                               *r = tolower(*c);
-                               r++;
-                               c++;
+                               if (c != (unsigned char*)ZSTR_VAL(s)) {
+                                       memcpy(ZSTR_VAL(res), ZSTR_VAL(s), c - (unsigned char*)ZSTR_VAL(s));
+                               }
+                               r = c + (ZSTR_VAL(res) - ZSTR_VAL(s));
+                               while (c < e) {
+                                       *r = tolower(*c);
+                                       r++;
+                                       c++;
+                               }
+                               *r = '\0';
+                               return res;
                        }
-                       *r = '\0';
-                       return res;
+                       c++;
                }
-               c++;
+               return zend_string_copy(s);
        }
-       return zend_string_copy(s);
 }
 /* }}} */