| #ifndef SANE_CTYPE_H | |
| #define SANE_CTYPE_H | |
| /* | |
| * Explicitly include <ctype.h> so that its header guards kick in from here on. | |
| * This ensures that the file won't get included after "sane-ctype.h", as that | |
| * would otherwise lead to a compiler error because the function declarations | |
| * for `int isascii(int c)` et al would be mangled by our macros with the same | |
| * name. | |
| */ | |
| #include <ctype.h> | |
| /* Sane ctype - no locale, and works with signed chars */ | |
| #undef isascii | |
| #undef isspace | |
| #undef isdigit | |
| #undef isalpha | |
| #undef isalnum | |
| #undef isprint | |
| #undef islower | |
| #undef isupper | |
| #undef tolower | |
| #undef toupper | |
| #undef iscntrl | |
| #undef ispunct | |
| #undef isxdigit | |
| extern const unsigned char sane_ctype[256]; | |
| extern const signed char hexval_table[256]; | |
| #define GIT_SPACE 0x01 | |
| #define GIT_DIGIT 0x02 | |
| #define GIT_ALPHA 0x04 | |
| #define GIT_GLOB_SPECIAL 0x08 | |
| #define GIT_REGEX_SPECIAL 0x10 | |
| #define GIT_PATHSPEC_MAGIC 0x20 | |
| #define GIT_CNTRL 0x40 | |
| #define GIT_PUNCT 0x80 | |
| #define sane_istest(x,mask) ((sane_ctype[(unsigned char)(x)] & (mask)) != 0) | |
| #define isascii(x) (((x) & ~0x7f) == 0) | |
| #define isspace(x) sane_istest(x,GIT_SPACE) | |
| #define isdigit(x) sane_istest(x,GIT_DIGIT) | |
| #define isalpha(x) sane_istest(x,GIT_ALPHA) | |
| #define isalnum(x) sane_istest(x,GIT_ALPHA | GIT_DIGIT) | |
| #define isprint(x) ((x) >= 0x20 && (x) <= 0x7e) | |
| #define islower(x) sane_iscase(x, 1) | |
| #define isupper(x) sane_iscase(x, 0) | |
| #define is_glob_special(x) sane_istest(x,GIT_GLOB_SPECIAL) | |
| #define is_regex_special(x) sane_istest(x,GIT_GLOB_SPECIAL | GIT_REGEX_SPECIAL) | |
| #define iscntrl(x) (sane_istest(x,GIT_CNTRL)) | |
| #define ispunct(x) sane_istest(x, GIT_PUNCT | GIT_REGEX_SPECIAL | \ | |
| GIT_GLOB_SPECIAL | GIT_PATHSPEC_MAGIC) | |
| #define isxdigit(x) (hexval_table[(unsigned char)(x)] != -1) | |
| #define tolower(x) sane_case((unsigned char)(x), 0x20) | |
| #define toupper(x) sane_case((unsigned char)(x), 0) | |
| #define is_pathspec_magic(x) sane_istest(x,GIT_PATHSPEC_MAGIC) | |
| static inline int sane_case(int x, int high) | |
| { | |
| if (sane_istest(x, GIT_ALPHA)) | |
| x = (x & ~0x20) | high; | |
| return x; | |
| } | |
| static inline int sane_iscase(int x, int is_lower) | |
| { | |
| if (!sane_istest(x, GIT_ALPHA)) | |
| return 0; | |
| if (is_lower) | |
| return (x & 0x20) != 0; | |
| else | |
| return (x & 0x20) == 0; | |
| } | |
| #endif |