From 1fdec20f8fb1a4e1bc2eeb66831f9ad5c3455888 Mon Sep 17 00:00:00 2001 From: Nick Mathewson <nickm@torproject.org> Date: Wed, 1 Sep 2010 15:01:39 -0400 Subject: [PATCH] Stop using global arrays to implement the EVUTIL_ctype functions These apparently made libtool sad on win32, and the function call overhead here should be negligable anyway. --- evutil.c | 42 ++++++++++++++++++++++++++++++++---------- util-internal.h | 29 ++++++++++------------------- 2 files changed, 42 insertions(+), 29 deletions(-) diff --git a/evutil.c b/evutil.c index 16ac3449..18fb5619 100644 --- a/evutil.c +++ b/evutil.c @@ -1859,21 +1859,21 @@ evutil_sockaddr_cmp(const struct sockaddr *sa1, const struct sockaddr *sa2, * fails on non-ASCII platforms, but so does every other place where we * take a char and write it onto the network. **/ -const ev_uint32_t EVUTIL_ISALPHA_TABLE[8] = +static const ev_uint32_t EVUTIL_ISALPHA_TABLE[8] = { 0, 0, 0x7fffffe, 0x7fffffe, 0, 0, 0, 0 }; -const ev_uint32_t EVUTIL_ISALNUM_TABLE[8] = +static const ev_uint32_t EVUTIL_ISALNUM_TABLE[8] = { 0, 0x3ff0000, 0x7fffffe, 0x7fffffe, 0, 0, 0, 0 }; -const ev_uint32_t EVUTIL_ISSPACE_TABLE[8] = { 0x3e00, 0x1, 0, 0, 0, 0, 0, 0 }; -const ev_uint32_t EVUTIL_ISXDIGIT_TABLE[8] = +static const ev_uint32_t EVUTIL_ISSPACE_TABLE[8] = { 0x3e00, 0x1, 0, 0, 0, 0, 0, 0 }; +static const ev_uint32_t EVUTIL_ISXDIGIT_TABLE[8] = { 0, 0x3ff0000, 0x7e, 0x7e, 0, 0, 0, 0 }; -const ev_uint32_t EVUTIL_ISDIGIT_TABLE[8] = { 0, 0x3ff0000, 0, 0, 0, 0, 0, 0 }; -const ev_uint32_t EVUTIL_ISPRINT_TABLE[8] = +static const ev_uint32_t EVUTIL_ISDIGIT_TABLE[8] = { 0, 0x3ff0000, 0, 0, 0, 0, 0, 0 }; +static const ev_uint32_t EVUTIL_ISPRINT_TABLE[8] = { 0, 0xffffffff, 0xffffffff, 0x7fffffff, 0, 0, 0, 0x0 }; -const ev_uint32_t EVUTIL_ISUPPER_TABLE[8] = { 0, 0, 0x7fffffe, 0, 0, 0, 0, 0 }; -const ev_uint32_t EVUTIL_ISLOWER_TABLE[8] = { 0, 0, 0, 0x7fffffe, 0, 0, 0, 0 }; +static const ev_uint32_t EVUTIL_ISUPPER_TABLE[8] = { 0, 0, 0x7fffffe, 0, 0, 0, 0, 0 }; +static const ev_uint32_t EVUTIL_ISLOWER_TABLE[8] = { 0, 0, 0, 0x7fffffe, 0, 0, 0, 0 }; /* Upper-casing and lowercasing tables to map characters to upper/lowercase * equivalents. */ -const unsigned char EVUTIL_TOUPPER_TABLE[256] = { +static const unsigned char EVUTIL_TOUPPER_TABLE[256] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31, 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47, @@ -1891,7 +1891,7 @@ const unsigned char EVUTIL_TOUPPER_TABLE[256] = { 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255, }; -const unsigned char EVUTIL_TOLOWER_TABLE[256] = { +static const unsigned char EVUTIL_TOLOWER_TABLE[256] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31, 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47, @@ -1910,6 +1910,28 @@ const unsigned char EVUTIL_TOLOWER_TABLE[256] = { 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255, }; +#define IMPL_CTYPE_FN(name) \ + int EVUTIL_##name(char c) { \ + ev_uint8_t u = c; \ + return !!(EVUTIL_##name##_TABLE[(u >> 5) & 7] & (1 << (u & 31))); \ + } +IMPL_CTYPE_FN(ISALPHA) +IMPL_CTYPE_FN(ISALNUM) +IMPL_CTYPE_FN(ISSPACE) +IMPL_CTYPE_FN(ISDIGIT) +IMPL_CTYPE_FN(ISXDIGIT) +IMPL_CTYPE_FN(ISPRINT) +IMPL_CTYPE_FN(ISLOWER) +IMPL_CTYPE_FN(ISUPPER) + +char EVUTIL_TOLOWER(char c) +{ + return ((char)EVUTIL_TOLOWER_TABLE[(ev_uint8_t)c]); +} +char EVUTIL_TOUPPER(char c) +{ + return ((char)EVUTIL_TOUPPER_TABLE[(ev_uint8_t)c]); +} int evutil_ascii_strcasecmp(const char *s1, const char *s2) { diff --git a/util-internal.h b/util-internal.h index 36c12dc2..e7245b69 100644 --- a/util-internal.h +++ b/util-internal.h @@ -105,25 +105,16 @@ extern "C" { * when you care about ASCII's notion of character types, because you are about * to send those types onto the wire. */ -#define DECLARE_CTYPE_FN(name) \ - static int EVUTIL_##name(char c); \ - extern const ev_uint32_t EVUTIL_##name##_TABLE[]; \ - static inline int EVUTIL_##name(char c) { \ - ev_uint8_t u = c; \ - return !!(EVUTIL_##name##_TABLE[(u >> 5) & 7] & (1 << (u & 31))); \ - } -DECLARE_CTYPE_FN(ISALPHA) -DECLARE_CTYPE_FN(ISALNUM) -DECLARE_CTYPE_FN(ISSPACE) -DECLARE_CTYPE_FN(ISDIGIT) -DECLARE_CTYPE_FN(ISXDIGIT) -DECLARE_CTYPE_FN(ISPRINT) -DECLARE_CTYPE_FN(ISLOWER) -DECLARE_CTYPE_FN(ISUPPER) -extern const unsigned char EVUTIL_TOUPPER_TABLE[]; -extern const unsigned char EVUTIL_TOLOWER_TABLE[]; -#define EVUTIL_TOLOWER(c) ((char)EVUTIL_TOLOWER_TABLE[(ev_uint8_t)c]) -#define EVUTIL_TOUPPER(c) ((char)EVUTIL_TOUPPER_TABLE[(ev_uint8_t)c]) +int EVUTIL_ISALPHA(char c); +int EVUTIL_ISALNUM(char c); +int EVUTIL_ISSPACE(char c); +int EVUTIL_ISDIGIT(char c); +int EVUTIL_ISXDIGIT(char c); +int EVUTIL_ISPRINT(char c); +int EVUTIL_ISLOWER(char c); +int EVUTIL_ISUPPER(char c); +char EVUTIL_TOUPPER(char c); +char EVUTIL_TOLOWER(char c); /** Helper macro. If we know that a given pointer points to a field in a structure, return a pointer to the structure itself. Used to implement -- 2.40.0