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