diff options
author | Nick Mathewson <nickm@torproject.org> | 2009-01-20 21:33:56 +0000 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2009-01-20 21:33:56 +0000 |
commit | a87980c2eb8933e2d291e3a2dc009aa69e82e128 (patch) | |
tree | 1e936d62c9fb589981d1f35cc555e6f0c7b7dc2f | |
parent | d20ae4962f24098eba179064d5c9f971ee85d0e6 (diff) | |
download | tor-a87980c2eb8933e2d291e3a2dc009aa69e82e128.tar.gz tor-a87980c2eb8933e2d291e3a2dc009aa69e82e128.zip |
Add a better (non-locale-having) ctypes implementation to avoid protocol and parsing mismatches on different platforms.
svn:r18189
-rw-r--r-- | configure.in | 2 | ||||
-rw-r--r-- | src/common/compat.c | 55 | ||||
-rw-r--r-- | src/common/compat.h | 38 | ||||
-rw-r--r-- | src/common/container.c | 3 | ||||
-rw-r--r-- | src/common/util.c | 3 |
5 files changed, 77 insertions, 24 deletions
diff --git a/configure.in b/configure.in index 42b6dcd923..4daad23b20 100644 --- a/configure.in +++ b/configure.in @@ -322,7 +322,7 @@ dnl Make sure to enable support for large off_t if available. AC_SYS_LARGEFILE -AC_CHECK_HEADERS(unistd.h string.h signal.h ctype.h sys/stat.h sys/types.h fcntl.h sys/fcntl.h sys/time.h errno.h assert.h time.h, , AC_MSG_WARN(Some headers were not found, compilation may fail. If compilation succeeds, please send your orconfig.h to the developers so we can fix this warning.)) +AC_CHECK_HEADERS(unistd.h string.h signal.h sys/stat.h sys/types.h fcntl.h sys/fcntl.h sys/time.h errno.h assert.h time.h, , AC_MSG_WARN(Some headers were not found, compilation may fail. If compilation succeeds, please send your orconfig.h to the developers so we can fix this warning.)) AC_CHECK_HEADERS(netdb.h sys/ioctl.h sys/socket.h arpa/inet.h netinet/in.h pwd.h grp.h sys/un.h sys/uio.h) diff --git a/src/common/compat.c b/src/common/compat.c index 904d5308cb..c3bb3f10f6 100644 --- a/src/common/compat.c +++ b/src/common/compat.c @@ -345,6 +345,61 @@ tor_memmem(const void *_haystack, size_t hlen, #endif } +/* Tables to implement ctypes-replacement TOR_IS*() functions. Each table + * has 256 bits to look up whether a character is in some set or not. This + * fails on non-ASCII platforms, but it is hard to find a platform whose + * character set is not a superset of ASCII nowadays. */ +const uint32_t const TOR_ISALPHA_TABLE[8] = + { 0, 0, 0x7fffffe, 0x7fffffe, 0, 0, 0, 0 }; +const uint32_t const TOR_ISALNUM_TABLE[8] = + { 0, 0x3ff0000, 0x7fffffe, 0x7fffffe, 0, 0, 0, 0 }; +const uint32_t const TOR_ISSPACE_TABLE[8] = { 0x3e00, 0x1, 0, 0, 0, 0, 0, 0 }; +const uint32_t const TOR_ISXDIGIT_TABLE[8] = + { 0, 0x3ff0000, 0x7e, 0x7e, 0, 0, 0, 0 }; +const uint32_t const TOR_ISDIGIT_TABLE[8] = { 0, 0x3ff0000, 0, 0, 0, 0, 0, 0 }; +const uint32_t const TOR_ISPRINT_TABLE[8] = + { 0, 0xffffffff, 0xffffffff, 0x7fffffff, 0, 0, 0, 0x0 }; +const uint32_t const TOR_ISUPPER_TABLE[8] = { 0, 0, 0x7fffffe, 0, 0, 0, 0, 0 }; +const uint32_t const TOR_ISLOWER_TABLE[8] = { 0, 0, 0, 0x7fffffe, 0, 0, 0, 0 }; +/* Upper-casing and lowercasing tables to map characters to upper/lowercase + * equivalents. */ +const char const TOR_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, + 48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63, + 64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79, + 80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95, + 96,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79, + 80,81,82,83,84,85,86,87,88,89,90,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, + 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 char const TOR_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, + 48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63, + 64,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122,91,92,93,94,95, + 96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, + 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, +}; + #ifdef MS_WINDOWS /** Take a filename and return a pointer to its final element. This * function is called on __FILE__ to fix a MSVC nit where __FILE__ diff --git a/src/common/compat.h b/src/common/compat.h index d1a7b3d944..f077b88e05 100644 --- a/src/common/compat.h +++ b/src/common/compat.h @@ -31,9 +31,6 @@ #ifdef HAVE_STRING_H #include <string.h> #endif -#ifdef HAVE_CTYPE_H -#include <ctype.h> -#endif #ifdef HAVE_PTHREAD_H #include <pthread.h> #endif @@ -248,20 +245,27 @@ tor_memstr(const void *haystack, size_t hlen, const char *needle) return tor_memmem(haystack, hlen, needle, strlen(needle)); } -/* This cast-to-uchar, then-cast-to-int business is needed to compile and - * run properly on some Solarises. */ - -#define TOR_ISALPHA(c) isalpha((int)(unsigned char)(c)) -#define TOR_ISALNUM(c) isalnum((int)(unsigned char)(c)) -#define TOR_ISSPACE(c) isspace((int)(unsigned char)(c)) -#define TOR_ISXDIGIT(c) isxdigit((int)(unsigned char)(c)) -#define TOR_ISDIGIT(c) isdigit((int)(unsigned char)(c)) -#define TOR_ISPRINT(c) isprint((int)(unsigned char)(c)) -#define TOR_ISLOWER(c) islower((int)(unsigned char)(c)) -#define TOR_ISUPPER(c) isupper((int)(unsigned char)(c)) - -#define TOR_TOLOWER(c) ((char)tolower((int)(unsigned char)(c))) -#define TOR_TOUPPER(c) ((char)toupper((int)(unsigned char)(c))) +/* Much of the time when we're checking ctypes, we're doing spec compliance, + * which all assumes we're doing ASCII. */ +#define DECLARE_CTYPE_FN(name) \ + static int TOR_##name(char c); \ + extern const uint32_t const TOR_##name##_TABLE[]; \ + static INLINE int TOR_##name(char c) { \ + uint8_t u = c; \ + return !!(TOR_##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 char const TOR_TOUPPER_TABLE[]; +extern const char const TOR_TOLOWER_TABLE[]; +#define TOR_TOLOWER(c) (TOR_TOLOWER_TABLE[(uint8_t)c]) +#define TOR_TOUPPER(c) (TOR_TOUPPER_TABLE[(uint8_t)c]) #ifdef MS_WINDOWS #define _SHORT_FILE_ (tor_fix_source_file(__FILE__)) diff --git a/src/common/container.c b/src/common/container.c index 5c54e469bd..0a2cdd82e7 100644 --- a/src/common/container.c +++ b/src/common/container.c @@ -17,9 +17,6 @@ #include "container.h" #include "crypto.h" -#ifdef HAVE_CTYPE_H -#include <ctype.h> -#endif #include <stdlib.h> #include <string.h> #include <assert.h> diff --git a/src/common/util.c b/src/common/util.c index c383417fde..d9c0495ed9 100644 --- a/src/common/util.c +++ b/src/common/util.c @@ -30,9 +30,6 @@ #include <pwd.h> #endif -#ifdef HAVE_CTYPE_H -#include <ctype.h> -#endif #include <stdlib.h> #include <stdio.h> #include <string.h> |