#define _ITEST_U 0x01 /* upper */ #define _ITEST_L 0x02 /* lower */ #define _ITEST_D 0x04 /* digit */ #define _ITEST_C 0x08 /* cntrl */ #define _ITEST_P 0x10 /* punct */ #define _ITEST_S 0x20 /* white space (space/lf/tab) */ #define _ITEST_X 0x40 /* hex digit */ #define _ITEST_SP 0x80 /* hard space (0x20) */ const unsigned char itest_ctype[] = { _ITEST_C,_ITEST_C,_ITEST_C,_ITEST_C,_ITEST_C,_ITEST_C,_ITEST_C,_ITEST_C, /* 0-7 */ _ITEST_C, _ITEST_C|_ITEST_S, _ITEST_C|_ITEST_S, _ITEST_C|_ITEST_S, _ITEST_C|_ITEST_S, _ITEST_C|_ITEST_S, _ITEST_C, _ITEST_C, /* 8-15 */ _ITEST_C,_ITEST_C,_ITEST_C,_ITEST_C,_ITEST_C,_ITEST_C,_ITEST_C,_ITEST_C, /* 16-23 */ _ITEST_C,_ITEST_C,_ITEST_C,_ITEST_C,_ITEST_C,_ITEST_C,_ITEST_C,_ITEST_C, /* 24-31 */ _ITEST_S|_ITEST_SP,_ITEST_P,_ITEST_P,_ITEST_P,_ITEST_P,_ITEST_P,_ITEST_P,_ITEST_P, /* 32-39 */ _ITEST_P,_ITEST_P,_ITEST_P,_ITEST_P,_ITEST_P,_ITEST_P,_ITEST_P,_ITEST_P, /* 40-47 */ _ITEST_D,_ITEST_D,_ITEST_D,_ITEST_D,_ITEST_D,_ITEST_D,_ITEST_D,_ITEST_D, /* 48-55 */ _ITEST_D,_ITEST_D,_ITEST_P,_ITEST_P,_ITEST_P,_ITEST_P,_ITEST_P,_ITEST_P, /* 56-63 */ _ITEST_P, _ITEST_U|_ITEST_X, _ITEST_U|_ITEST_X, _ITEST_U|_ITEST_X, _ITEST_U|_ITEST_X, _ITEST_U|_ITEST_X, _ITEST_U|_ITEST_X, _ITEST_U, /* 64-71 */ _ITEST_U,_ITEST_U,_ITEST_U,_ITEST_U,_ITEST_U,_ITEST_U,_ITEST_U,_ITEST_U, /* 72-79 */ _ITEST_U,_ITEST_U,_ITEST_U,_ITEST_U,_ITEST_U,_ITEST_U,_ITEST_U,_ITEST_U, /* 80-87 */ _ITEST_U,_ITEST_U,_ITEST_U,_ITEST_P,_ITEST_P,_ITEST_P,_ITEST_P,_ITEST_P, /* 88-95 */ _ITEST_P, _ITEST_L|_ITEST_X, _ITEST_L|_ITEST_X, _ITEST_L|_ITEST_X, _ITEST_L|_ITEST_X, _ITEST_L|_ITEST_X, _ITEST_L|_ITEST_X, _ITEST_L, /* 96-103 */ _ITEST_L,_ITEST_L,_ITEST_L,_ITEST_L,_ITEST_L,_ITEST_L,_ITEST_L,_ITEST_L, /* 104-111 */ _ITEST_L,_ITEST_L,_ITEST_L,_ITEST_L,_ITEST_L,_ITEST_L,_ITEST_L,_ITEST_L, /* 112-119 */ _ITEST_L,_ITEST_L,_ITEST_L,_ITEST_P,_ITEST_P,_ITEST_P,_ITEST_P,_ITEST_C, /* 120-127 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 128-143 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 144-159 */ _ITEST_S|_ITEST_SP, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, /* 160-175 */ _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, /* 176-191 */ _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U, /* 192-207 */ _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_P, _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_L, /* 208-223 */ _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L, /* 224-239 */ _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_P, _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L /* 240-255 */ }; #define itest_ismask(x) (itest_ctype[(int)(unsigned char)(x)]) #define itest_isalnum(c) ((itest_ismask(c)&(_ITEST_U|_ITEST_L|_ITEST_D)) != 0) #define itest_isalpha(c) ((itest_ismask(c)&(_ITEST_U|_ITEST_L)) != 0) #define itest_iscntrl(c) ((itest_ismask(c)&(_ITEST_C)) != 0) #define itest_isdigit(c) ((itest_ismask(c)&(_ITEST_D)) != 0) #define itest_isgraph(c) ((itest_ismask(c)&(_ITEST_P|_ITEST_U|_ITEST_L|_ITEST_D)) != 0) #define itest_islower(c) ((itest_ismask(c)&(_ITEST_L)) != 0) #define itest_isprint(c) ((itest_ismask(c)&(_ITEST_P|_ITEST_U|_ITEST_L|_ITEST_D|_ITEST_SP)) != 0) #define itest_ispunct(c) ((itest_ismask(c)&(_ITEST_P)) != 0) #define itest_isspace(c) ((itest_ismask(c)&(_ITEST_S)) != 0) #define itest_isupper(c) ((itest_ismask(c)&(_ITEST_U)) != 0) #define itest_isxdigit(c) ((itest_ismask(c)&(_ITEST_D|_ITEST_X)) != 0) #define itest_tolower(c) (itest_isupper((c)) ? ((c) + 'a' - 'A') : (c)) #define itest_toupper(c) (itest_islower((c)) ? ((c) + 'A' - 'a') : (c))
int main(int argc, char** argv) { const char* demo_string = "abcd123AB"; char* ptr = (char*)demo_string; for (int i = 0; i < strlen(demo_string); i++,ptr++) { if (itest_isdigit(*ptr)) { printf("%c is digit\n",*ptr); } else if (itest_isprint(*ptr)) { if (itest_islower(*ptr)) { printf("%c is lower\n",*ptr); } else if (itest_isupper(*ptr)) { printf("%c is isupper\n",*ptr); } } } }