diff options
-rw-r--r-- | ChangeLog | 2 | ||||
-rw-r--r-- | dfa.c | 67 |
2 files changed, 66 insertions, 3 deletions
@@ -2,6 +2,8 @@ * Makefile.am (distcleancheck_listfiles): Added, per advice from Stefano Lattarini <stefano.lattarini@gmail.com>. + * dfa.c: Additional faking of mbsupport for systems without it; + mainly VMS. 2011-10-21 Stefano Lattarini <stefano.lattarini@gmail.com> @@ -73,8 +73,13 @@ #define wint_t int #define mbstate_t int #define WEOF EOF -#define towupper toupper -#define towlower tolower +#define towupper toupper +#define towlower tolower +#define btowc(x) (x) +#define iswalnum isalnum +#define iswalpha isalpha +#define iswupper isupper +#define wcscoll strcmp #endif /* ! MBS_SUPPORT */ #endif /* GAWK */ @@ -88,7 +93,63 @@ is_blank (int c) { return (c == ' ' || c == '\t'); } -#endif + +#if ! MBS_SUPPORT +static const char *classes[] = { + "<dummy>", + "alnum", + "alpha", + "blank", + "cntrl", + "digit", + "graph", + "lower", + "print", + "punct", + "space", + "upper", + "xdigit", + NULL +}; + +static wctype_t wctype(const char *name) +{ + int i; + + for (i = 1; classes[i] != NULL; i++) + if (strcmp(name, classes[i]) == 0) + return i; + + return 0; +} + +static int iswctype(wint_t wc, wctype_t desc) +{ + int j = sizeof(classes) / sizeof(classes[0]); + + if (desc >= j || desc == 0) + return 0; + + switch (desc) { + case 1: return isalnum(wc); + case 2: return isalpha(wc); + case 3: return is_blank(wc); + case 4: return iscntrl(wc); + case 5: return isdigit(wc); + case 6: return isgraph(wc); + case 7: return islower(wc); + case 8: return isprint(wc); + case 9: return ispunct(wc); + case 10: return isspace(wc); + case 11: return isupper(wc); + case 12: return isxdigit(wc); + default: return 0; + } +} + +static +#endif /* ! MBS_SUPPORT */ +#endif /* GAWK */ /* HPUX, define those as macros in sys/param.h */ #ifdef setbit |