]> granicus.if.org Git - php/commitdiff
Optimized trim for what_len == 1
authorXinchen Hui <laruence@php.net>
Mon, 19 Jan 2015 12:45:30 +0000 (07:45 -0500)
committerXinchen Hui <laruence@php.net>
Mon, 19 Jan 2015 12:45:30 +0000 (07:45 -0500)
ext/standard/string.c

index f746a242fce788cf89591bbc6b6f0639973c2c41..a9b4cfe8d0bd6b60220123e56c62fd1a3ee5af16 100644 (file)
@@ -797,29 +797,55 @@ PHPAPI zend_string *php_trim(zend_string *str, char *what, size_t what_len, int
        char mask[256];
 
        if (what) {
-               php_charmask((unsigned char*)what, what_len, mask);
-
-               if (mode & 1) {
-                       for (i = 0; i < len; i++) {
-                               if (mask[(unsigned char)c[i]]) {
-                                       trimmed++;
-                               } else {
-                                       break;
+               if (what_len == 1) {
+                       if (mode & 1) {
+                               for (i = 0; i < len; i++) {
+                                       if (c[i] == *what) {
+                                               trimmed++;
+                                       } else {
+                                               break;
+                                       }
                                }
+                               len -= trimmed;
+                               c += trimmed;
                        }
-                       len -= trimmed;
-                       c += trimmed;
-               }
-               if (mode & 2) {
-                       if (len > 0) {
-                               i = len - 1;
-                               do {
+                       if (mode & 2) {
+                               if (len > 0) {
+                                       i = len - 1;
+                                       do {
+                                               if (c[i] == *what) {
+                                                       len--;
+                                               } else {
+                                                       break;
+                                               }
+                                       } while (i-- != 0);
+                               }
+                       }
+               } else {
+                       php_charmask((unsigned char*)what, what_len, mask);
+
+                       if (mode & 1) {
+                               for (i = 0; i < len; i++) {
                                        if (mask[(unsigned char)c[i]]) {
-                                               len--;
+                                               trimmed++;
                                        } else {
                                                break;
                                        }
-                               } while (i-- != 0);
+                               }
+                               len -= trimmed;
+                               c += trimmed;
+                       }
+                       if (mode & 2) {
+                               if (len > 0) {
+                                       i = len - 1;
+                                       do {
+                                               if (mask[(unsigned char)c[i]]) {
+                                                       len--;
+                                               } else {
+                                                       break;
+                                               }
+                                       } while (i-- != 0);
+                               }
                        }
                }
        } else {