mirror of https://github.com/flysand7/ciabatta.git
128 lines
2.5 KiB
C
128 lines
2.5 KiB
C
|
|
||
|
#include <wctype.h>
|
||
|
#include <string.h>
|
||
|
|
||
|
#include "unicode.h"
|
||
|
|
||
|
static inline int char_cat(wint_t wc) {
|
||
|
#define X(code, cat, l, u) case code: return cat;
|
||
|
switch(wc) {
|
||
|
UNI_TAB
|
||
|
}
|
||
|
#undef X
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
int iswctype(wint_t wc, wctype_t desc) {
|
||
|
return desc(wc);
|
||
|
}
|
||
|
|
||
|
wctype_t wctype(const char *property) {
|
||
|
if(!strcmp(property, "alnum")) return iswalnum;
|
||
|
if(!strcmp(property, "alpha")) return iswalpha;
|
||
|
if(!strcmp(property, "blank")) return iswblank;
|
||
|
if(!strcmp(property, "cntrl")) return iswcntrl;
|
||
|
if(!strcmp(property, "digit")) return iswdigit;
|
||
|
if(!strcmp(property, "graph")) return iswgraph;
|
||
|
if(!strcmp(property, "lower")) return iswlower;
|
||
|
if(!strcmp(property, "print")) return iswprint;
|
||
|
if(!strcmp(property, "punct")) return iswpunct;
|
||
|
if(!strcmp(property, "space")) return iswspace;
|
||
|
if(!strcmp(property, "upper")) return iswupper;
|
||
|
if(!strcmp(property, "xdigit")) return iswxdigit;
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
wint_t towctrans(wint_t wc, wctrans_t desc) {
|
||
|
return desc(wc);
|
||
|
}
|
||
|
|
||
|
wctrans_t wctrans(const char *property) {
|
||
|
if(!strcmp(property, "tolower")) return towlower;
|
||
|
if(!strcmp(property, "toupper")) return towupper;
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
int iswalnum(wint_t wc) {
|
||
|
return iswalpha(wc) || iswdigit(wc);
|
||
|
}
|
||
|
|
||
|
int iswalpha(wint_t wc) {
|
||
|
return iswupper(wc) || iswlower(wc);
|
||
|
}
|
||
|
|
||
|
int iswblank(wint_t wc) {
|
||
|
return wc == ' ' || wc == '\t';
|
||
|
}
|
||
|
|
||
|
int iswcntrl(wint_t wc) {
|
||
|
return char_cat(wc) == Cc;
|
||
|
}
|
||
|
|
||
|
int iswdigit(wint_t wc) {
|
||
|
return '0' <= wc && wc <= '9';
|
||
|
}
|
||
|
|
||
|
int iswgraph(wint_t wc) {
|
||
|
return iswprint(wc) && !iswspace(wc);
|
||
|
}
|
||
|
|
||
|
int iswlower(wint_t wc) {
|
||
|
return char_cat(wc) == Ll;
|
||
|
}
|
||
|
|
||
|
int iswprint(wint_t wc) {
|
||
|
switch(char_cat(wc)) {
|
||
|
case Cc:
|
||
|
case Cf:
|
||
|
case Co:
|
||
|
case Cs:
|
||
|
return 0;
|
||
|
}
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
int iswpunct(wint_t wc) {
|
||
|
switch(char_cat(wc)) {
|
||
|
case Pc:
|
||
|
case Pd:
|
||
|
case Pe:
|
||
|
case Pf:
|
||
|
case Pi:
|
||
|
case Po:
|
||
|
case Ps:
|
||
|
return 1;
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
int iswspace(wint_t wc) {
|
||
|
return char_cat(wc) == Zs;
|
||
|
}
|
||
|
|
||
|
int iswupper(wint_t wc) {
|
||
|
return char_cat(wc) == Lu;
|
||
|
}
|
||
|
|
||
|
int iswxdigit(wint_t wc) {
|
||
|
return iswdigit(wc) || ('a'<=wc && wc<='f') || ('A'<= wc && wc<='F');
|
||
|
}
|
||
|
|
||
|
wint_t towlower(wint_t wc) {
|
||
|
#define X(code, cat, l, u) case code: return l;
|
||
|
switch(wc) {
|
||
|
UNI_TAB
|
||
|
}
|
||
|
#undef X
|
||
|
return wc;
|
||
|
}
|
||
|
|
||
|
wint_t towupper(wint_t wc) {
|
||
|
#define X(code, cat, l, u) case code: return u;
|
||
|
switch(wc) {
|
||
|
UNI_TAB
|
||
|
}
|
||
|
#undef X
|
||
|
return wc;
|
||
|
}
|