From b8fb7b2d4287058c9d2fab1a871e9181840279be Mon Sep 17 00:00:00 2001 From: "Arnold D. Robbins" Date: Tue, 18 Oct 2011 12:21:39 +0200 Subject: Fix dfa.c yet againi for z/OS. --- dfa.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'dfa.c') diff --git a/dfa.c b/dfa.c index aecbbd76..19bbaa31 100644 --- a/dfa.c +++ b/dfa.c @@ -805,6 +805,7 @@ parse_bracket_exp (void) int invert; int c, c1, c2; charclass ccl; + wint_t wc1 = 0; /* Used to warn about [:space:]. Bit 0 = first character is a colon. @@ -849,7 +850,6 @@ parse_bracket_exp (void) else invert = 0; - wint_t wc1 = 0; colon_warning_state = (c == ':'); do { @@ -3429,10 +3429,11 @@ dfainit (struct dfa *d) static void dfaoptimize (struct dfa *d) { + unsigned int i; + if (!MBS_SUPPORT || !using_utf8()) return; - unsigned int i; for (i = 0; i < d->tindex; ++i) { switch(d->tokens[i]) -- cgit v1.2.3 From d45dee9add229d64ca875c11c78392e1a80dc100 Mon Sep 17 00:00:00 2001 From: "Arnold D. Robbins" Date: Tue, 18 Oct 2011 12:35:02 +0200 Subject: Another non-MBS fix in dfa.c. --- dfa.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'dfa.c') diff --git a/dfa.c b/dfa.c index 19bbaa31..a909f68f 100644 --- a/dfa.c +++ b/dfa.c @@ -616,7 +616,12 @@ setbit_c (int b, charclass c) } #else # define setbit_c setbit -static inline bool setbit_wc (wint_t wc, charclass c) { abort (); } +static inline bool setbit_wc (wint_t wc, charclass c) +{ + abort (); + /*NOTREACHED*/ + return false; +} #endif /* Like setbit_c, but if case is folded, set both cases of a letter. For -- cgit v1.2.3 From b8a1c347098ba746c5b2ba6201790f6cfc7eba44 Mon Sep 17 00:00:00 2001 From: "Arnold D. Robbins" Date: Fri, 21 Oct 2011 15:13:28 +0200 Subject: More faking of MBS support, mainly for VMS. --- dfa.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 64 insertions(+), 3 deletions(-) (limited to 'dfa.c') diff --git a/dfa.c b/dfa.c index a909f68f..96bba214 100644 --- a/dfa.c +++ b/dfa.c @@ -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[] = { + "", + "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 -- cgit v1.2.3 From fe18d21be4bb5d92eb45b10a5fe37b2d908c706f Mon Sep 17 00:00:00 2001 From: "Arnold D. Robbins" Date: Mon, 24 Oct 2011 05:53:12 +0200 Subject: Additional VMS fixes. --- dfa.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) (limited to 'dfa.c') diff --git a/dfa.c b/dfa.c index 96bba214..789c6b91 100644 --- a/dfa.c +++ b/dfa.c @@ -79,7 +79,6 @@ #define iswalnum isalnum #define iswalpha isalpha #define iswupper isupper -#define wcscoll strcmp #endif /* ! MBS_SUPPORT */ #endif /* GAWK */ @@ -147,7 +146,19 @@ static int iswctype(wint_t wc, wctype_t desc) } } -static +static int wcscoll(const wchar_t *ws1, const wchar_t *ws2) +{ + size_t i; + + for (i = 0; ws1[i] != 0 && ws2[i] != 0; i++) { + if (ws1[i] < ws2[i]) + return -1; + else if (ws1[i] > ws2[i]) + return 1; + } + + return (ws1[i] - ws2[i]); +} #endif /* ! MBS_SUPPORT */ #endif /* GAWK */ -- cgit v1.2.3