From 5ac1c6f555cff38499e0a6ac80b338df4ebe3047 Mon Sep 17 00:00:00 2001 From: Stephane Chazelas Date: Wed, 16 May 2018 22:02:51 +0100 Subject: 42790: make [[:blank:]] match non-ASCII blanks --- ChangeLog | 3 +++ Doc/Zsh/expn.yo | 2 +- NEWS | 9 ++++++++- Src/pattern.c | 19 +++++++++++++++++-- configure.ac | 7 +++++++ 5 files changed, 36 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0d5a95d86..ac2acf349 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2018-05-17 Oliver Kiddle + * Stephane: 42790: Doc/Zsh/expn.yo, NEWS, Src/pattern.c, + configure.ac: make [[:blank:]] match non-ASCII blanks + * 42784: Completion/Zsh/Command/_typeset: complete -s and -x options to the functions builtin diff --git a/Doc/Zsh/expn.yo b/Doc/Zsh/expn.yo index 8b447e2c7..c79109700 100644 --- a/Doc/Zsh/expn.yo +++ b/Doc/Zsh/expn.yo @@ -2004,7 +2004,7 @@ The character is 7-bit, i.e. is a single-byte character without the top bit set. ) item(tt([:blank:]))( -The character is either space or tab +The character is a blank character ) item(tt([:cntrl:]))( The character is a control character diff --git a/NEWS b/NEWS index 1db9da6f3..17868979b 100644 --- a/NEWS +++ b/NEWS @@ -4,7 +4,14 @@ CHANGES FROM PREVIOUS VERSIONS OF ZSH Note also the list of incompatibilities in the README file. -Changes from %.5 to 5.5.1 +Changes from 5.5.1 to FIXME +--------------------------- + +In shell patterns, [[:blank:]] now honours the locale instead of +matching exclusively on space and tab, like for the other POSIX +character classes or for extended regular expressions. + +Changes from 5.5 to 5.5.1 ------------------------- Apart from a fix for a configuration problem finding singal names from diff --git a/Src/pattern.c b/Src/pattern.c index fc7c73739..737f5cdcb 100644 --- a/Src/pattern.c +++ b/Src/pattern.c @@ -3605,7 +3605,15 @@ mb_patmatchrange(char *range, wchar_t ch, int zmb_ind, wint_t *indptr, int *mtp) return 1; break; case PP_BLANK: - if (ch == L' ' || ch == L'\t') +#if !defined(HAVE_ISWBLANK) && !defined(iswblank) +/* + * iswblank() is GNU and C99. There's a remote chance that some + * systems still don't support it (but would support the other ones + * if MULTIBYTE_SUPPORT is enabled). + */ +#define iswblank(c) (c == L' ' || c == L'\t') +#endif + if (iswblank(ch)) return 1; break; case PP_CNTRL: @@ -3840,7 +3848,14 @@ patmatchrange(char *range, int ch, int *indptr, int *mtp) return 1; break; case PP_BLANK: - if (ch == ' ' || ch == '\t') +#if !defined(HAVE_ISBLANK) && !defined(isblank) +/* + * isblank() is GNU and C99. There's a remote chance that some + * systems still don't support it. + */ +#define isblank(c) (c == ' ' || c == '\t') +#endif + if (isblank(ch)) return 1; break; case PP_CNTRL: diff --git a/configure.ac b/configure.ac index 4329afb9e..00c731864 100644 --- a/configure.ac +++ b/configure.ac @@ -1304,6 +1304,7 @@ AC_CHECK_FUNCS(strftime strptime mktime timelocal \ memcpy memmove strstr strerror strtoul \ getrlimit getrusage \ setlocale \ + isblank iswblank \ uname \ signgam tgamma \ scalbn \ @@ -2564,6 +2565,12 @@ AC_HELP_STRING([--enable-multibyte], [support multibyte characters]), [AC_CACHE_VAL(zsh_cv_c_unicode_support, AC_MSG_NOTICE([checking for functions supporting multibyte characters]) [zfuncs_absent= +dnl +dnl Note that iswblank is not included and checked separately. +dnl As iswblank() was added to C long after the others, we still +dnl want to enabled unicode support even if iswblank is not available +dnl (we then just do the SPC+TAB approximation) +dnl for zfunc in iswalnum iswcntrl iswdigit iswgraph iswlower iswprint \ iswpunct iswspace iswupper iswxdigit mbrlen mbrtowc towupper towlower \ wcschr wcscpy wcslen wcsncmp wcsncpy wcrtomb wcwidth wmemchr wmemcmp \ -- cgit 1.4.1