diff options
Diffstat (limited to 'crypto/ctype.c')
-rw-r--r-- | crypto/ctype.c | 45 |
1 files changed, 39 insertions, 6 deletions
diff --git a/crypto/ctype.c b/crypto/ctype.c index 2165213889..de2e836ff7 100644 --- a/crypto/ctype.c +++ b/crypto/ctype.c @@ -257,6 +257,36 @@ int ossl_ctype_check(int c, unsigned int mask) return a >= 0 && a < max && (ctype_char_map[a] & mask) != 0; } +/* + * Implement some of the simplier functions directly to avoid the overhead of + * accessing memory via ctype_char_map[]. + */ + +#define ASCII_IS_DIGIT(c) (c >= 0x30 && c <= 0x39) +#define ASCII_IS_UPPER(c) (c >= 0x41 && c <= 0x5A) +#define ASCII_IS_LOWER(c) (c >= 0x61 && c <= 0x7A) + +int ossl_isdigit(int c) +{ + int a = ossl_toascii(c); + + return ASCII_IS_DIGIT(a); +} + +int ossl_isupper(int c) +{ + int a = ossl_toascii(c); + + return ASCII_IS_UPPER(a); +} + +int ossl_islower(int c) +{ + int a = ossl_toascii(c); + + return ASCII_IS_LOWER(a); +} + #if defined(CHARSET_EBCDIC) && !defined(CHARSET_EBCDIC_TEST) static const int case_change = 0x40; #else @@ -265,16 +295,19 @@ static const int case_change = 0x20; int ossl_tolower(int c) { - return ossl_isupper(c) ? c ^ case_change : c; + int a = ossl_toascii(c); + + return ASCII_IS_UPPER(a) ? c ^ case_change : c; } int ossl_toupper(int c) { - return ossl_islower(c) ? c ^ case_change : c; + int a = ossl_toascii(c); + + return ASCII_IS_LOWER(a) ? c ^ case_change : c; } -int ossl_ascii_isdigit(const char inchar) { - if (inchar > 0x2F && inchar < 0x3A) - return 1; - return 0; +int ossl_ascii_isdigit(int c) +{ + return ASCII_IS_DIGIT(c); } |