diff options
-rw-r--r-- | server/util.c | 42 |
1 files changed, 16 insertions, 26 deletions
diff --git a/server/util.c b/server/util.c index d3f3ac63c0..c59f15d124 100644 --- a/server/util.c +++ b/server/util.c @@ -3454,7 +3454,7 @@ AP_DECLARE(int) ap_array_str_contains(const apr_array_header_t *array, * octets (such as extended latin alphabetics) are never case-folded. * NOTE: Other than Alpha A-Z/a-z, each code point is unique! */ -static const short ucharmap[] = { +static const unsigned char ucharmap[256] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, @@ -3501,7 +3501,7 @@ static const short ucharmap[] = { * * NOTE: Other than Alpha A-Z/a-z, each code point is unique! */ -static const short ucharmap[] = { +static const unsigned char ucharmap[256] = { 0x00, 0x01, 0x02, 0x03, 0x9C, 0x09, 0x86, 0x7F, 0x97, 0x8D, 0x8E, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x9D, 0x85, 0x08, 0x87, @@ -3539,35 +3539,25 @@ static const short ucharmap[] = { AP_DECLARE(int) ap_cstr_casecmp(const char *s1, const char *s2) { - const unsigned char *str1 = (const unsigned char *)s1; - const unsigned char *str2 = (const unsigned char *)s2; - for (;;) - { - const int c1 = (int)(*str1); - const int c2 = (int)(*str2); - const int cmp = ucharmap[c1] - ucharmap[c2]; - /* Not necessary to test for !c2, this is caught by cmp */ - if (cmp || !c1) - return cmp; - str1++; - str2++; + apr_size_t i = 0; + for (;; ++i) { + const int c1 = ucharmap[(unsigned char)s1[i]]; + const int c2 = ucharmap[(unsigned char)s2[i]]; + /* Not necessary to test for !c2, this is caught by c1 != c2 */ + if (c1 != c2 || !c1) + return c1 - c2; } } AP_DECLARE(int) ap_cstr_casecmpn(const char *s1, const char *s2, apr_size_t n) { - const unsigned char *str1 = (const unsigned char *)s1; - const unsigned char *str2 = (const unsigned char *)s2; - while (n--) - { - const int c1 = (int)(*str1); - const int c2 = (int)(*str2); - const int cmp = ucharmap[c1] - ucharmap[c2]; - /* Not necessary to test for !c2, this is caught by cmp */ - if (cmp || !c1) - return cmp; - str1++; - str2++; + apr_size_t i = 0; + for (; i < n; ++i) { + const int c1 = ucharmap[(unsigned char)s1[i]]; + const int c2 = ucharmap[(unsigned char)s2[i]]; + /* Not necessary to test for !c2, this is caught by c1 != c2 */ + if (c1 != c2 || !c1) + return c1 - c2; } return 0; } |