#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);
}
}
}
}