1#include <string.h>
2#include <wctype.h>
3
4#define WCTYPE_ALNUM 1
5#define WCTYPE_ALPHA 2
6#define WCTYPE_BLANK 3
7#define WCTYPE_CNTRL 4
8#define WCTYPE_DIGIT 5
9#define WCTYPE_GRAPH 6
10#define WCTYPE_LOWER 7
11#define WCTYPE_PRINT 8
12#define WCTYPE_PUNCT 9
13#define WCTYPE_SPACE 10
14#define WCTYPE_UPPER 11
15#define WCTYPE_XDIGIT 12
16
17int iswctype(wint_t wc, wctype_t type) {
18    switch (type) {
19    case WCTYPE_ALNUM:
20        return iswalnum(wc);
21    case WCTYPE_ALPHA:
22        return iswalpha(wc);
23    case WCTYPE_BLANK:
24        return iswblank(wc);
25    case WCTYPE_CNTRL:
26        return iswcntrl(wc);
27    case WCTYPE_DIGIT:
28        return iswdigit(wc);
29    case WCTYPE_GRAPH:
30        return iswgraph(wc);
31    case WCTYPE_LOWER:
32        return iswlower(wc);
33    case WCTYPE_PRINT:
34        return iswprint(wc);
35    case WCTYPE_PUNCT:
36        return iswpunct(wc);
37    case WCTYPE_SPACE:
38        return iswspace(wc);
39    case WCTYPE_UPPER:
40        return iswupper(wc);
41    case WCTYPE_XDIGIT:
42        return iswxdigit(wc);
43    }
44    return 0;
45}
46
47wctype_t wctype(const char* s) {
48    int i;
49    const char* p;
50    /* order must match! */
51    static const char names[] = "alnum\0"
52                                "alpha\0"
53                                "blank\0"
54                                "cntrl\0"
55                                "digit\0"
56                                "graph\0"
57                                "lower\0"
58                                "print\0"
59                                "punct\0"
60                                "space\0"
61                                "upper\0"
62                                "xdigit";
63    for (i = 1, p = names; *p; i++, p += 6)
64        if (*s == *p && !strcmp(s, p))
65            return i;
66    return 0;
67}
68