summaryrefslogtreecommitdiff
path: root/ext/mbstring/php_unicode.c
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2017-07-20 13:57:18 +0200
committerNikita Popov <nikita.ppv@gmail.com>2017-07-20 13:58:40 +0200
commit17da862b51caf0875d47e87040336cf3fcd429d1 (patch)
tree465c75c310e680301fca47c4d312cb8040cf7255 /ext/mbstring/php_unicode.c
parentba383b82399f408da3fdb62d90d74a4314f9c689 (diff)
downloadphp-git-17da862b51caf0875d47e87040336cf3fcd429d1.tar.gz
Optimize php_unicode_tolower/upper for ASCII
Diffstat (limited to 'ext/mbstring/php_unicode.c')
-rw-r--r--ext/mbstring/php_unicode.c61
1 files changed, 22 insertions, 39 deletions
diff --git a/ext/mbstring/php_unicode.c b/ext/mbstring/php_unicode.c
index 5d6ccbfdd5..47607ac331 100644
--- a/ext/mbstring/php_unicode.c
+++ b/ext/mbstring/php_unicode.c
@@ -47,19 +47,6 @@
ZEND_EXTERN_MODULE_GLOBALS(mbstring)
-/*
- * A simple array of 32-bit masks for lookup.
- */
-static unsigned long masks32[32] = {
- 0x00000001, 0x00000002, 0x00000004, 0x00000008, 0x00000010, 0x00000020,
- 0x00000040, 0x00000080, 0x00000100, 0x00000200, 0x00000400, 0x00000800,
- 0x00001000, 0x00002000, 0x00004000, 0x00008000, 0x00010000, 0x00020000,
- 0x00040000, 0x00080000, 0x00100000, 0x00200000, 0x00400000, 0x00800000,
- 0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000, 0x20000000,
- 0x40000000, 0x80000000
-};
-
-
static int prop_lookup(unsigned long code, unsigned long n)
{
long l, r, m;
@@ -151,27 +138,22 @@ static unsigned long case_lookup(unsigned long code, long l, long r, int field)
return code;
}
-MBSTRING_API unsigned long php_turkish_toupper(unsigned long code, long l, long r, int field)
-{
- if (code == 0x0069L) {
- return 0x0130L;
- }
- return case_lookup(code, l, r, field);
-}
-
-MBSTRING_API unsigned long php_turkish_tolower(unsigned long code, long l, long r, int field)
-{
- if (code == 0x0049L) {
- return 0x0131L;
- }
- return case_lookup(code, l, r, field);
-}
-
MBSTRING_API unsigned long php_unicode_toupper(unsigned long code, enum mbfl_no_encoding enc)
{
int field;
long l, r;
+ if (code < 0x80) {
+ /* Fast path for ASCII */
+ if (code >= 0x61 && code <= 0x7A) {
+ if (enc == mbfl_no_encoding_8859_9 && code == 0x0069L) {
+ return 0x0130L;
+ }
+ return code - 0x20;
+ }
+ return code;
+ }
+
if (php_unicode_is_upper(code))
return code;
@@ -182,11 +164,6 @@ MBSTRING_API unsigned long php_unicode_toupper(unsigned long code, enum mbfl_no_
field = 2;
l = _uccase_len[0];
r = (l + _uccase_len[1]) - 3;
-
- if (enc == mbfl_no_encoding_8859_9) {
- return php_turkish_toupper(code, l, r, field);
- }
-
} else {
/*
* The character is title case.
@@ -203,6 +180,17 @@ MBSTRING_API unsigned long php_unicode_tolower(unsigned long code, enum mbfl_no_
int field;
long l, r;
+ if (code < 0x80) {
+ /* Fast path for ASCII */
+ if (code >= 0x41 && code <= 0x5A) {
+ if (enc == mbfl_no_encoding_8859_9 && code == 0x0049L) {
+ return 0x0131L;
+ }
+ return code + 0x20;
+ }
+ return code;
+ }
+
if (php_unicode_is_lower(code))
return code;
@@ -213,11 +201,6 @@ MBSTRING_API unsigned long php_unicode_tolower(unsigned long code, enum mbfl_no_
field = 1;
l = 0;
r = _uccase_len[0] - 3;
-
- if (enc == mbfl_no_encoding_8859_9) {
- return php_turkish_tolower(code, l, r, field);
- }
-
} else {
/*
* The character is title case.