summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--crypto/ctype.c45
-rw-r--r--include/crypto/ctype.h12
2 files changed, 47 insertions, 10 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);
}
diff --git a/include/crypto/ctype.h b/include/crypto/ctype.h
index 6deee3b947..22f6922183 100644
--- a/include/crypto/ctype.h
+++ b/include/crypto/ctype.h
@@ -22,6 +22,8 @@
# define OSSL_CRYPTO_CTYPE_H
# pragma once
+# include <openssl/e_os2.h>
+
# define CTYPE_MASK_lower 0x1
# define CTYPE_MASK_upper 0x2
# define CTYPE_MASK_digit 0x4
@@ -55,10 +57,15 @@ int ossl_fromascii(int c);
# define ossl_fromascii(c) (c)
# endif
int ossl_ctype_check(int c, unsigned int mask);
+
int ossl_tolower(int c);
int ossl_toupper(int c);
-int ossl_ascii_isdigit(const char inchar);
+int ossl_isdigit(int c);
+int ossl_islower(int c);
+int ossl_isupper(int c);
+
+int ossl_ascii_isdigit(int c);
# define ossl_isalnum(c) (ossl_ctype_check((c), CTYPE_MASK_alnum))
# define ossl_isalpha(c) (ossl_ctype_check((c), CTYPE_MASK_alpha))
@@ -69,13 +76,10 @@ int ossl_ascii_isdigit(const char inchar);
# endif
# define ossl_isblank(c) (ossl_ctype_check((c), CTYPE_MASK_blank))
# define ossl_iscntrl(c) (ossl_ctype_check((c), CTYPE_MASK_cntrl))
-# define ossl_isdigit(c) (ossl_ctype_check((c), CTYPE_MASK_digit))
# define ossl_isgraph(c) (ossl_ctype_check((c), CTYPE_MASK_graph))
-# define ossl_islower(c) (ossl_ctype_check((c), CTYPE_MASK_lower))
# define ossl_isprint(c) (ossl_ctype_check((c), CTYPE_MASK_print))
# define ossl_ispunct(c) (ossl_ctype_check((c), CTYPE_MASK_punct))
# define ossl_isspace(c) (ossl_ctype_check((c), CTYPE_MASK_space))
-# define ossl_isupper(c) (ossl_ctype_check((c), CTYPE_MASK_upper))
# define ossl_isxdigit(c) (ossl_ctype_check((c), CTYPE_MASK_xdigit))
# define ossl_isbase64(c) (ossl_ctype_check((c), CTYPE_MASK_base64))
# define ossl_isasn1print(c) (ossl_ctype_check((c), CTYPE_MASK_asn1print))