summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2021-03-22 17:37:11 +0300
committerDmitry Stogov <dmitry@zend.com>2021-03-22 17:37:11 +0300
commit550a662f67f83504b306969c16e637759796e758 (patch)
tree5b69a83e32d615fd15877608bddbf14705bf268c
parent79a9f809eebdd4370b3dfb5cdb80f6a20e591bdc (diff)
downloadphp-git-550a662f67f83504b306969c16e637759796e758.tar.gz
strtr() optimization
-rw-r--r--ext/standard/string.c45
1 files changed, 21 insertions, 24 deletions
diff --git a/ext/standard/string.c b/ext/standard/string.c
index 6414ec60cf..e09780a307 100644
--- a/ext/standard/string.c
+++ b/ext/standard/string.c
@@ -2708,16 +2708,16 @@ PHPAPI char *php_strtr(char *str, size_t len, const char *str_from, const char *
}
}
} else {
- unsigned char xlat[256], j = 0;
+ unsigned char xlat[256];
- do { xlat[j] = j; } while (++j != 0);
+ memset(xlat, 0, sizeof(xlat));
for (i = 0; i < trlen; i++) {
- xlat[(size_t)(unsigned char) str_from[i]] = str_to[i];
+ xlat[(size_t)(unsigned char) str_from[i]] = str_to[i] - str_from[i];
}
for (i = 0; i < len; i++) {
- str[i] = xlat[(size_t)(unsigned char) str[i]];
+ str[i] += xlat[(size_t)(unsigned char) str[i]];
}
}
@@ -2742,41 +2742,38 @@ static zend_string *php_strtr_ex(zend_string *str, const char *str_from, const c
new_str = zend_string_alloc(ZSTR_LEN(str), 0);
memcpy(ZSTR_VAL(new_str), ZSTR_VAL(str), i);
ZSTR_VAL(new_str)[i] = ch_to;
- break;
+ i++;
+ for (; i < ZSTR_LEN(str); i++) {
+ ZSTR_VAL(new_str)[i] = (ZSTR_VAL(str)[i] != ch_from) ? ZSTR_VAL(str)[i] : ch_to;
+ }
+ ZSTR_VAL(new_str)[i] = 0;
+ return new_str;
}
}
- for (; i < ZSTR_LEN(str); i++) {
- ZSTR_VAL(new_str)[i] = (ZSTR_VAL(str)[i] != ch_from) ? ZSTR_VAL(str)[i] : ch_to;
- }
} else {
- unsigned char xlat[256], j = 0;
+ unsigned char xlat[256];
- do { xlat[j] = j; } while (++j != 0);
+ memset(xlat, 0, sizeof(xlat));;
for (i = 0; i < trlen; i++) {
- xlat[(size_t)(unsigned char) str_from[i]] = str_to[i];
+ xlat[(size_t)(unsigned char) str_from[i]] = str_to[i] - str_from[i];
}
for (i = 0; i < ZSTR_LEN(str); i++) {
- if (ZSTR_VAL(str)[i] != xlat[(size_t)(unsigned char) ZSTR_VAL(str)[i]]) {
+ if (xlat[(size_t)(unsigned char) ZSTR_VAL(str)[i]]) {
new_str = zend_string_alloc(ZSTR_LEN(str), 0);
memcpy(ZSTR_VAL(new_str), ZSTR_VAL(str), i);
- ZSTR_VAL(new_str)[i] = xlat[(size_t)(unsigned char) ZSTR_VAL(str)[i]];
- break;
+ do {
+ ZSTR_VAL(new_str)[i] = ZSTR_VAL(str)[i] + xlat[(size_t)(unsigned char) ZSTR_VAL(str)[i]];
+ i++;
+ } while (i < ZSTR_LEN(str));
+ ZSTR_VAL(new_str)[i] = 0;
+ return new_str;
}
}
-
- for (;i < ZSTR_LEN(str); i++) {
- ZSTR_VAL(new_str)[i] = xlat[(size_t)(unsigned char) ZSTR_VAL(str)[i]];
- }
}
- if (!new_str) {
- return zend_string_copy(str);
- }
-
- ZSTR_VAL(new_str)[ZSTR_LEN(new_str)] = 0;
- return new_str;
+ return zend_string_copy(str);
}
/* }}} */