On 2026-06-24T12:32:31+0800, Kevin J. McCarthy wrote: > Wide-char functions have been standardized for a long time now, > between C99 and POSIX.1(2001/2008). > > The only possible exception is wcwidth, so keep the backup function > defined in wcwidth.c. Otherwise, assume wchar.h and wctype.h exist, > and all their standardized functions exist. > --- > > While doing this, I noticed INSTALL also mentions configure option > enable-locales-fix, which seems to be another ripe target for removal. > I wonder what you all think about pulling that out. > > .builds/alpine.yml | 4 - > .builds/archlinux.yml | 4 - > .builds/build | 6 - > .builds/debian.yml | 4 - > .builds/freebsd.yml | 4 - > .builds/openbsd.yml | 4 - > INSTALL | 17 -- > Makefile.am | 2 +- > configure.ac | 81 +------- > main.c | 6 +- > mbyte.c | 425 +----------------------------------------- > mbyte.h | 44 +---- > mutt.h | 16 +- > protos.h | 3 - > regex.c | 64 +------ > utf8.c | 81 -------- > wcwidth.c | 4 +- > 17 files changed, 23 insertions(+), 746 deletions(-) > delete mode 100644 utf8.c
Lovely! Acked-by: Alejandro Colomar <[email protected]> Cheers, Alex > > diff --git a/.builds/alpine.yml b/.builds/alpine.yml > index c6b31402..ec43716b 100644 > --- a/.builds/alpine.yml > +++ b/.builds/alpine.yml > @@ -28,10 +28,6 @@ tasks: > cd mutt > ./.builds/build default > > -- without-wc-funcs: | > - cd mutt > - ./.builds/build without_wc_funcs > - > - original: | > cd mutt > ./.builds/build original > diff --git a/.builds/archlinux.yml b/.builds/archlinux.yml > index 6721e6a2..cad5c182 100644 > --- a/.builds/archlinux.yml > +++ b/.builds/archlinux.yml > @@ -28,10 +28,6 @@ tasks: > cd mutt > ./.builds/build default > > -- without-wc-funcs: | > - cd mutt > - ./.builds/build without_wc_funcs > - > - original: | > cd mutt > ./.builds/build original > diff --git a/.builds/build b/.builds/build > index 5907a3ee..fb9510aa 100755 > --- a/.builds/build > +++ b/.builds/build > @@ -95,12 +95,6 @@ tcc() > CC=tcc ./configure > } > > -without_wc_funcs() > -{ > - ./configure \ > - --without-wc-funcs > -} > - > # If no arguments were passed, get all the above function names (except _die) > # and drop the parentheses. > # shellcheck disable=SC2046 > diff --git a/.builds/debian.yml b/.builds/debian.yml > index f3a9dad9..87679bd1 100644 > --- a/.builds/debian.yml > +++ b/.builds/debian.yml > @@ -29,10 +29,6 @@ tasks: > cd mutt > ./.builds/build default > > -- without-wc-funcs: | > - cd mutt > - ./.builds/build without_wc_funcs > - > - original: | > cd mutt > ./.builds/build original > diff --git a/.builds/freebsd.yml b/.builds/freebsd.yml > index 15a44406..eb7cb76c 100644 > --- a/.builds/freebsd.yml > +++ b/.builds/freebsd.yml > @@ -30,10 +30,6 @@ tasks: > cd mutt > ./.builds/build default > > -- without-wc-funcs: | > - cd mutt > - ./.builds/build without_wc_funcs > - > - original_freebsd: | > cd mutt > ./.builds/build original_freebsd > diff --git a/.builds/openbsd.yml b/.builds/openbsd.yml > index defb3ec9..aaa3740d 100644 > --- a/.builds/openbsd.yml > +++ b/.builds/openbsd.yml > @@ -32,10 +32,6 @@ tasks: > cd mutt > ./.builds/build default > > -- without-wc-funcs: | > - cd mutt > - ./.builds/build without_wc_funcs > - > - original_freebsd: | > cd mutt > ./.builds/build original_freebsd > diff --git a/INSTALL b/INSTALL > index 608aa2ae..445adb3f 100644 > --- a/INSTALL > +++ b/INSTALL > @@ -126,10 +126,6 @@ options are: > you leave it unset, Mutt will attempt to use isprint() if either > of the environment variables LANG, LC_ALL or LC_CTYPE is set, > and will revert to the ISO-8859-* range if they aren't. > - If you need --enable-locales-fix then you will probably need > - --without-wc-funcs too. However, on a correctly configured > - modern system you shouldn't need either (try setting LANG, > - LC_ALL or LC_CTYPE instead). > > --enable-exact-address > By default, Mutt will rewrite all addresses in the form > @@ -205,19 +201,6 @@ options are: > support them. Almost all systems nowadays should have no need > for this option. > > ---without-wc-funcs > - by default Mutt uses the functions mbrtowc(), wctomb() and > - wcwidth() provided by the system, when they are available. > - With this option Mutt will use its own version of those > - functions, which should work with 8-bit display charsets, UTF-8, > - euc-jp or shift_jis, even if the system doesn't normally support > - those multibyte charsets. > - > - If you find Mutt is displaying non-ascii characters as octal > - escape sequences (e.g. \243), even though you have set LANG and > - LC_CTYPE correctly, then you might find you can solve the problem > - with either or both of --enable-locales-fix and --without-wc-funcs. > - > --with-exec-shell=SHELL > on some versions of unix, /bin/sh has a bug that makes using emacs > with mutt very difficult. If you have the problem that whenever > diff --git a/Makefile.am b/Makefile.am > index c4b62e49..3a483498 100644 > --- a/Makefile.am > +++ b/Makefile.am > @@ -71,7 +71,7 @@ EXTRA_mutt_SOURCES = account.c bcache.c compress.c > crypt-gpgme.c crypt-mod-pgp-c > mutt_ssl_gnutls.c \ > mutt_tunnel.c pgp.c pgpinvoke.c pgpkey.c pgplib.c pgpmicalg.c \ > pgppacket.c pop.c pop_auth.c pop_lib.c remailer.c resize.c sha1.c \ > - sidebar.c smime.c smtp.c utf8.c wcwidth.c mutt_zstrm.c \ > + sidebar.c smime.c smtp.c wcwidth.c mutt_zstrm.c \ > bcache.h browser.h hcache.h mbyte.h monitor.h mutt_idna.h remailer.h > url.h \ > mutt_lisp.h mutt_random.h > > diff --git a/configure.ac b/configure.ac > index 1b864dcd..4817674f 100644 > --- a/configure.ac > +++ b/configure.ac > @@ -1505,85 +1505,12 @@ fi > > dnl -- locales -- > > -AC_CHECK_HEADERS(wchar.h) > +AC_CHECK_FUNC(iswprint, [], > + AC_MSG_ERROR([A libc with widechar support is required])) > > -AC_CACHE_CHECK([for wchar_t], mutt_cv_wchar_t, > - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ > -#include <stddef.h> > -#include <stdlib.h> > -#ifdef HAVE_WCHAR_H > -#include <wchar.h> > -#endif > - ]], [[ wchar_t wc; return 0; > ]])],[mutt_cv_wchar_t=yes],[mutt_cv_wchar_t=no])) > +dnl We still support a system without wcwidth > +AC_CHECK_FUNCS(wcwidth,,[MUTT_LIB_OBJECTS="$MUTT_LIB_OBJECTS wcwidth.o"]) > > -if test "$mutt_cv_wchar_t" = no; then > - AC_DEFINE(wchar_t,int,[ Define to 'int' if system headers don't > define. ]) > -fi > - > -AC_CACHE_CHECK([for wint_t], mutt_cv_wint_t, > - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ > -#include <stddef.h> > -#include <stdlib.h> > -#ifdef HAVE_WCHAR_H > -#include <wchar.h> > -#endif > - ]], [[ wint_t wc; return 0; > ]])],[mutt_cv_wint_t=yes],[mutt_cv_wint_t=no])) > - > -if test "$mutt_cv_wint_t" = no; then > - AC_DEFINE(wint_t,int,[ Define to 'int' if system headers don't > define. ]) > -fi > - > -AC_CHECK_HEADERS(wctype.h) > -AC_CHECK_FUNCS(iswalnum iswalpha iswblank iswcntrl iswdigit) > -AC_CHECK_FUNCS(iswgraph iswlower iswprint iswpunct iswspace iswupper) > -AC_CHECK_FUNCS(iswxdigit towupper towlower) > - > -AC_CACHE_CHECK([for mbstate_t], mutt_cv_mbstate_t, > - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ > -#include <stddef.h> > -#include <stdlib.h> > -#ifdef HAVE_WCHAR_H > -#include <wchar.h> > -#endif > - ]], [[ mbstate_t s; return 0; > ]])],[mutt_cv_mbstate_t=yes],[mutt_cv_mbstate_t=no])) > - > -if test "$mutt_cv_mbstate_t" = no; then > - AC_DEFINE(mbstate_t,int,[ Define to 'int' if system headers don't > define. ]) > -fi > - > -wc_funcs=maybe > -AC_ARG_WITH(wc-funcs, AS_HELP_STRING([--without-wc-funcs],[Do not use the > system's wchar_t functions]), > - wc_funcs=$withval) > - > -if test "$wc_funcs" = no; then > - AC_MSG_WARN([--without-wc-funcs is deprecated and will be removed in > mutt 2.5.0]) > -fi > - > -if test "$wc_funcs" != yes && test "$wc_funcs" != no; then > - AC_CACHE_CHECK([for wchar_t functions], mutt_cv_wc_funcs, > - mutt_cv_wc_funcs=no > - AC_LINK_IFELSE([AC_LANG_PROGRAM([[ > -#define _XOPEN_SOURCE 600 > -#include <stddef.h> > -#include <stdlib.h> > -#ifdef HAVE_WCHAR_H > -#include <wchar.h> > -#endif > -#ifdef HAVE_WCTYPE_H > -#include <wctype.h> > -#endif]], [[mbrtowc(0, 0, 0, 0); wctomb(0, 0); wcwidth(0); iswblank(0); > - iswprint(0); iswspace(0); towlower(0); towupper(0); > iswalnum(0)]])],[mutt_cv_wc_funcs=yes],[])) > - wc_funcs=$mutt_cv_wc_funcs > - if test "$wc_funcs" = no; then > - AC_MSG_WARN([This system is missing needed wchar_t functions. > Starting with mutt 2.5.0 this system may no longer be able to compile mutt.]) > - fi > -fi > - > -if test $wc_funcs = yes; then > - AC_DEFINE(HAVE_WC_FUNCS,1,[ Define if you are using the system's > wchar_t functions. ]) > -else > - MUTT_LIB_OBJECTS="$MUTT_LIB_OBJECTS utf8.o wcwidth.o" > -fi > > AC_CACHE_CHECK([for nl_langinfo and CODESET], mutt_cv_langinfo_codeset, > [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <langinfo.h>]], [[char* cs = > nl_langinfo(CODESET);]])],[mutt_cv_langinfo_codeset=yes],[mutt_cv_langinfo_codeset=no])]) > diff --git a/main.c b/main.c > index 15507467..9c47f122 100644 > --- a/main.c > +++ b/main.c > @@ -477,10 +477,10 @@ static void show_version(void) > "-LOCALES_HACK " > #endif > > -#ifdef HAVE_WC_FUNCS > - "+HAVE_WC_FUNCS " > +#ifdef HAVE_WCWIDTH > + "+HAVE_WCWIDTH " > #else > - "-HAVE_WC_FUNCS " > + "-HAVE_WCWIDTH " > #endif > > #ifdef HAVE_LANGINFO_CODESET > diff --git a/mbyte.c b/mbyte.c > index b3f6c65a..8e8b8719 100644 > --- a/mbyte.c > +++ b/mbyte.c > @@ -37,10 +37,8 @@ > #endif > > int Charset_is_utf8 = 0; > -#ifndef HAVE_WC_FUNCS > +#ifndef HAVE_WCWIDTH > static int charset_is_ja = 0; > -static iconv_t charset_to_utf8 = (iconv_t)(-1); > -static iconv_t charset_from_utf8 = (iconv_t)(-1); > #endif > > void mutt_set_charset(char *charset) > @@ -50,36 +48,17 @@ void mutt_set_charset(char *charset) > mutt_canonical_charset(buffer, sizeof(buffer), charset); > > Charset_is_utf8 = 0; > -#ifndef HAVE_WC_FUNCS > +#ifndef HAVE_WCWIDTH > charset_is_ja = 0; > - if (charset_to_utf8 != (iconv_t)(-1)) > - { > - iconv_close(charset_to_utf8); > - charset_to_utf8 = (iconv_t)(-1); > - } > - if (charset_from_utf8 != (iconv_t)(-1)) > - { > - iconv_close(charset_from_utf8); > - charset_from_utf8 = (iconv_t)(-1); > - } > #endif > > if (mutt_is_utf8(buffer)) > Charset_is_utf8 = 1; > -#ifndef HAVE_WC_FUNCS > +#ifndef HAVE_WCWIDTH > else if (!ascii_strcasecmp(buffer, "euc-jp") || !ascii_strcasecmp(buffer, > "shift_jis") > || !ascii_strcasecmp(buffer, "cp932") || > !ascii_strcasecmp(buffer, "eucJP-ms")) > { > charset_is_ja = 1; > - > - /* Note flags=0 to skip charset-hooks: User masters the $charset > - * name, and we are sure of our "utf-8" constant. So there is no > - * possibility of wrong name that we would want to try to correct > - * with a charset-hook. Or rather: If $charset was wrong, we would > - * want to try to correct... $charset directly. > - */ > - charset_to_utf8 = mutt_iconv_open("utf-8", charset, 0); > - charset_from_utf8 = mutt_iconv_open(charset, "utf-8", 0); > } > #endif > > @@ -88,317 +67,13 @@ void mutt_set_charset(char *charset) > #endif > } > > -#ifndef HAVE_WC_FUNCS > - > -/* > - * For systems that don't have them, we provide here our own > - * implementations of wcrtomb(), mbrtowc(), iswprint() and wcwidth(). > - * Instead of using the locale, as these functions normally would, > - * we use Mutt's Charset variable. We support 3 types of charset: > - * (1) For 8-bit charsets, wchar_t uses the same encoding as char. > - * (2) For UTF-8, wchar_t uses UCS. > - * (3) For stateless Japanese encodings, we use UCS and convert > - * via UTF-8 using iconv. > - * Unfortunately, we can't handle non-stateless encodings. > - */ > - > -static size_t wcrtomb_iconv(char *s, wchar_t wc, iconv_t cd) > -{ > - char buf[MB_LEN_MAX+1]; > - ICONV_CONST char *ib; > - char *ob; > - size_t ibl, obl; > - > - if (s) > - { > - ibl = mutt_wctoutf8(buf, wc, sizeof(buf)); > - if (ibl == (size_t)(-1)) > - return (size_t)(-1); > - ib = buf; > - ob = s; > - obl = MB_LEN_MAX; > - iconv(cd, &ib, &ibl, &ob, &obl); > - } > - else > - { > - ib = ""; > - ibl = 1; > - ob = buf; > - obl = sizeof(buf); > - iconv(cd, &ib, &ibl, &ob, &obl); > - } > - return ob - s; > -} > - > -size_t wcrtomb(char *s, wchar_t wc, mbstate_t *ps) > -{ > - /* We only handle stateless encodings, so we can ignore ps. */ > - > - if (Charset_is_utf8) > - return mutt_wctoutf8(s, wc, MB_LEN_MAX); > - else if (charset_from_utf8 != (iconv_t)(-1)) > - return wcrtomb_iconv(s, wc, charset_from_utf8); > - else > - { > - if (!s) > - return 1; > - if (wc < 0x100) > - { > - *s = wc; > - return 1; > - } > - errno = EILSEQ; > - return (size_t)(-1); > - } > -} > - > -size_t mbrtowc_iconv(wchar_t *pwc, const char *s, size_t n, > - mbstate_t *ps, iconv_t cd) > -{ > - static mbstate_t mbstate; > - ICONV_CONST char *ib, *ibmax; > - char *ob, *t; > - size_t ibl, obl, k, r; > - char bufi[8], bufo[6]; > - > - if (!n) > - return (size_t)(-2); > - > - t = memchr(ps, 0, sizeof(*ps)); > - k = t ? (t - (char *)ps) : sizeof(*ps); > - if (k > sizeof(bufi)) > - k = 0; > - if (k) > - { > - /* use the buffer for input */ > - memcpy(bufi, ps, k); > - ib = bufi; > - ibmax = bufi + (k + n < sizeof(bufi) ? k + n : sizeof(bufi)); > - memcpy(bufi + k, s, ibmax - bufi - k); > - } > - else > - { > - /* use the real input */ > - ib = (ICONV_CONST char*) s; > - ibmax = (ICONV_CONST char*) s + n; > - } > - > - ob = bufo; > - obl = sizeof(bufo); > - ibl = 1; > - > - for (;;) > - { > - r = iconv(cd, &ib, &ibl, &ob, &obl); > - if (ob > bufo && (!k || ib > bufi + k)) > - { > - /* we have a character */ > - memset(ps, 0, sizeof(*ps)); > - utf8rtowc(pwc, bufo, ob - bufo, &mbstate); > - return (pwc && *pwc) ? (ib - (k ? bufi + k : s)) : 0; > - } > - else if (!r || (r == (size_t)(-1) && errno == EINVAL)) > - { > - if (ib + ibl < ibmax) > - /* try using more input */ > - ++ibl; > - else if (k && ib > bufi + k && bufi + k + n > ibmax) > - { > - /* switch to using real input */ > - ib = (ICONV_CONST char*) s + (ib - bufi - k); > - ibmax = (ICONV_CONST char*) s + n; > - k = 0; > - ++ibl; > - } > - else > - { > - /* save the state and give up */ > - memset(ps, 0, sizeof(*ps)); > - if (ibl <= sizeof(mbstate_t)) /* need extra condition here! */ > - memcpy(ps, ib, ibl); > - return (size_t)(-2); > - } > - } > - else > - { > - /* bad input */ > - errno = EILSEQ; > - return (size_t)(-1); > - } > - } > -} > - > -size_t mbrtowc(wchar_t *pwc, const char *s, size_t n, mbstate_t *ps) > -{ > - static mbstate_t mbstate; > - > - if (!ps) > - ps = &mbstate; > - > - if (Charset_is_utf8) > - return utf8rtowc(pwc, s, n, ps); > - else if (charset_to_utf8 != (iconv_t)(-1)) > - return mbrtowc_iconv(pwc, s, n, ps, charset_to_utf8); > - else > - { > - if (!s) > - { > - memset(ps, 0, sizeof(*ps)); > - return 0; > - } > - if (!n) > - return (size_t)-2; > - if (pwc) > - *pwc = (wchar_t)(unsigned char)*s; > - return (*s != 0); > - } > -} > - > -int iswprint(wint_t wc) > -{ > - if (Charset_is_utf8 || charset_is_ja) > - return ((0x20 <= wc && wc < 0x7f) || 0xa0 <= wc); > - else > - return (0 <= wc && wc < 256) ? IsPrint(wc) : 0; > -} > - > -int iswspace(wint_t wc) > -{ > - if (Charset_is_utf8 || charset_is_ja) > - return IS_ASCII_WS(wc); > - else > - return (0 <= wc && wc < 256) ? isspace(wc) : 0; /* > __SAFE_ISSPACE_CHECKED__ */ > -} > - > -int iswblank(wint_t wc) > -{ > - if (Charset_is_utf8 || charset_is_ja) > - return wc == 9 || wc == 32; > - else > - return (0 <= wc && wc < 256) ? isblank(wc) : 0; > -} > - > -static wint_t towupper_ucs(wint_t x) > -{ > - /* Only works for x < 0x130 */ > - if ((0x60 < x && x < 0x7b) || (0xe0 <= x && x < 0xff && x != 0xf7)) > - return x - 32; > - else if (0x100 <= x && x < 0x130) > - return x & ~1; > - else if (x == 0xb5) > - return 0x39c; > - else if (x == 0xff) > - return 0x178; > - else > - return x; > -} > - > -static int iswupper_ucs(wint_t x) > -{ > - /* Only works for x < 0x130 */ > - if ((0x60 < x && x < 0x7b) || (0xe0 <= x && x < 0xff && x != 0xf7)) > - return 0; > - else if ((0x40 < x && x < 0x5b) || (0xbf < x && x < 0xde)) > - return 1; > - else if (0x100 <= x && x < 0x130) > - return 1; > - else if (x == 0xb5) > - return 1; > - else if (x == 0xff) > - return 0; > - else > - return 0; > -} > - > -static wint_t towlower_ucs(wint_t x) > -{ > - /* Only works for x < 0x130 */ > - if ((0x40 < x && x < 0x5b) || (0xc0 <= x && x < 0xdf && x != 0xd7)) > - return x + 32; > - else if (0x100 <= x && x < 0x130) > - return x | 1; > - else > - return x; > -} > - > -static int iswalnum_ucs(wint_t wc) > -{ > - /* Only works for x < 0x220 */ > - if (wc >= 0x100) > - return 1; > - else if (wc < 0x30) > - return 0; > - else if (wc < 0x3a) > - return 1; > - else if (wc < 0xa0) > - return (0x40 < (wc & ~0x20) && (wc & ~0x20) < 0x5b); > - else if (wc < 0xc0) > - return (wc == 0xaa || wc == 0xb5 || wc == 0xba); > - else > - return !(wc == 0xd7 || wc == 0xf7); > -} > - > -static int iswalpha_ucs(wint_t wc) > -{ > - /* Only works for x < 0x220 */ > - if (wc >= 0x100) > - return 1; > - else if (wc < 0x3a) > - return 0; > - else if (wc < 0xa0) > - return (0x40 < (wc & ~0x20) && (wc & ~0x20) < 0x5b); > - else if (wc < 0xc0) > - return (wc == 0xaa || wc == 0xb5 || wc == 0xba); > - else > - return !(wc == 0xd7 || wc == 0xf7); > -} > - > -wint_t towupper(wint_t wc) > -{ > - if (Charset_is_utf8 || charset_is_ja) > - return towupper_ucs(wc); > - else > - return (0 <= wc && wc < 256) ? toupper(wc) : wc; > -} > - > -wint_t towlower(wint_t wc) > -{ > - if (Charset_is_utf8 || charset_is_ja) > - return towlower_ucs(wc); > - else > - return (0 <= wc && wc < 256) ? tolower(wc) : wc; > -} > - > -int iswalnum(wint_t wc) > -{ > - if (Charset_is_utf8 || charset_is_ja) > - return iswalnum_ucs(wc); > - else > - return (0 <= wc && wc < 256) ? isalnum(wc) : 0; > -} > - > -int iswalpha(wint_t wc) > -{ > - if (Charset_is_utf8 || charset_is_ja) > - return iswalpha_ucs(wc); > - else > - return (0 <= wc && wc < 256) ? isalpha(wc) : 0; > -} > - > -int iswupper(wint_t wc) > -{ > - if (Charset_is_utf8 || charset_is_ja) > - return iswupper_ucs(wc); > - else > - return (0 <= wc && wc < 256) ? isupper(wc) : 0; > -} > - > +#ifndef HAVE_WCWIDTH > /* > * l10n for Japanese: > * Symbols, Greek and Cyrillic in JIS X 0208, Japanese Kanji > * Character Set, have a column width of 2. > */ > -int wcwidth_ja(wchar_t ucs) > +static int wcwidth_ja(wchar_t ucs) > { > if (ucs >= 0x3021) > return -1; /* continue with the normal check */ > @@ -438,95 +113,7 @@ int wcwidth(wchar_t wc) > } > return wcwidth_ucs(wc); > } > - > -size_t utf8rtowc(wchar_t *pwc, const char *s, size_t n, mbstate_t *_ps) > -{ > - static wchar_t mbstate; > - wchar_t *ps = (wchar_t *)_ps; > - size_t k = 1; > - unsigned char c; > - wchar_t wc; > - int count; > - > - if (!ps) > - ps = &mbstate; > - > - if (!s) > - { > - *ps = 0; > - return 0; > - } > - if (!n) > - return (size_t)-2; > - > - if (!*ps) > - { > - c = (unsigned char)*s; > - if (c < 0x80) > - { > - if (pwc) > - *pwc = c; > - return (c != 0); > - } > - else if (c < 0xc2) > - { > - errno = EILSEQ; > - return (size_t)-1; > - } > - else if (c < 0xe0) > - wc = ((c & 0x1f) << 6) + (count = 0); > - else if (c < 0xf0) > - wc = ((c & 0x0f) << 12) + (count = 1); > - else if (c < 0xf8) > - wc = ((c & 0x07) << 18) + (count = 2); > - else if (c < 0xfc) > - wc = ((c & 0x03) << 24) + (count = 3); > - else if (c < 0xfe) > - wc = ((c & 0x01) << 30) + (count = 4); > - else > - { > - errno = EILSEQ; > - return (size_t)-1; > - } > - ++s, --n, ++k; > - } > - else > - { > - wc = *ps & 0x7fffffff; > - count = wc & 7; /* if count > 4 it will be caught below */ > - } > - > - for (; n; ++s, --n, ++k) > - { > - c = (unsigned char)*s; > - if (0x80 <= c && c < 0xc0) > - { > - wc |= (c & 0x3f) << (6 * count); > - if (!count) > - { > - if (pwc) > - *pwc = wc; > - *ps = 0; > - return wc ? k : 0; > - } > - --count, --wc; > - if (!(wc >> (11+count*5))) > - { > - errno = count < 4 ? EILSEQ : EINVAL; > - return (size_t)-1; > - } > - } > - else > - { > - errno = EILSEQ; > - return (size_t)-1; > - } > - } > - *ps = wc; > - return (size_t)-2; > -} > - > -#endif /* !HAVE_WC_FUNCS */ > +#endif /* !HAVE_WCWIDTH */ > > wchar_t replacement_char(void) > { > diff --git a/mbyte.h b/mbyte.h > index c17ec1df..9822d573 100644 > --- a/mbyte.h > +++ b/mbyte.h > @@ -1,52 +1,12 @@ > #ifndef _MBYTE_H > # define _MBYTE_H > > -# ifndef HAVE_WC_FUNCS > -#ifdef towupper > -# undef towupper > -#endif > -#ifdef towlower > -# undef towlower > -#endif > -#ifdef iswprint > -# undef iswprint > -#endif > -#ifdef iswspace > -# undef iswspace > -#endif > -#ifdef iswblank > -# undef iswblank > -#endif > -#ifdef iswalnum > -# undef iswalnum > -#endif > -#ifdef iswalpha > -# undef iswalpha > -#endif > -#ifdef iswupper > -# undef iswupper > -#endif > -#ifdef wcwidth > -# undef wcwidth > -#endif > - > -size_t wcrtomb(char *s, wchar_t wc, mbstate_t *ps); > -size_t mbrtowc(wchar_t *pwc, const char *s, size_t n, mbstate_t *ps); > -int iswprint(wint_t wc); > -int iswspace(wint_t wc); > -int iswblank(wint_t wc); > -int iswalnum(wint_t wc); > -int iswalpha(wint_t wc); > -int iswupper(wint_t wc); > -wint_t towupper(wint_t wc); > -wint_t towlower(wint_t wc); > +# ifndef HAVE_WCWIDTH > int wcwidth(wchar_t wc); > -# endif /* !HAVE_WC_FUNCS */ > - > +# endif /* !HAVE_WCWIDTH */ > > void mutt_set_charset(char *charset); > extern int Charset_is_utf8; > -size_t utf8rtowc(wchar_t *pwc, const char *s, size_t n, mbstate_t *_ps); > wchar_t replacement_char(void); > int is_display_corrupting_utf8(wchar_t wc); > > diff --git a/mutt.h b/mutt.h > index 764d8c17..cc3b0baa 100644 > --- a/mutt.h > +++ b/mutt.h > @@ -38,12 +38,9 @@ > #ifdef __APPLE_CC__ > #define _DONT_USE_CTYPE_INLINE_ > #endif > -#ifdef HAVE_WCHAR_H > -# include <wchar.h> > -#endif > -#if defined(HAVE_WCTYPE_H) && defined(HAVE_WC_FUNCS) > -# include <wctype.h> > -#endif > + > +#include <wchar.h> > +#include <wctype.h> > > #ifndef _POSIX_PATH_MAX > #include <limits.h> > @@ -63,13 +60,6 @@ > #include "buffer.h" > #include "color.h" > > -#ifndef HAVE_WC_FUNCS > -# ifdef MB_LEN_MAX > -# undef MB_LEN_MAX > -# endif > -# define MB_LEN_MAX 16 > -#endif > - > #ifdef HAVE_FGETS_UNLOCKED > # ifdef fgets > # undef fgets > diff --git a/protos.h b/protos.h > index a9ec6031..4958aa0e 100644 > --- a/protos.h > +++ b/protos.h > @@ -448,9 +448,6 @@ int mutt_from_base64(char*, const char*, size_t); > void mutt_buffer_to_base64(BUFFER *, const unsigned char *, size_t); > int mutt_buffer_from_base64(BUFFER *, const char *); > > -/* utf8.c */ > -int mutt_wctoutf8(char *s, unsigned int c, size_t buflen); > - > #ifdef LOCALES_HACK > #define IsPrint(c) (isprint((unsigned char)(c)) || \ > ((unsigned char)(c) >= 0xa0)) > diff --git a/regex.c b/regex.c > index a0ea9ee2..bba0daaa 100644 > --- a/regex.c > +++ b/regex.c > @@ -80,12 +80,8 @@ > > /* For platform which support the ISO C amendment 1 functionality we > support user defined character classes. */ > -#ifdef HAVE_WCHAR_H > -# include <wchar.h> > -#endif > -#if defined(HAVE_WCTYPE_H) && defined(HAVE_WC_FUNCS) > -# include <wctype.h> > -#endif > +#include <wchar.h> > +#include <wctype.h> > > /* This is for other GNU distributions with internationalized messages. */ > #if HAVE_LIBINTL_H || defined (_LIBC) > @@ -1691,16 +1687,10 @@ typedef struct > } \ > } > > -#if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H) > /* The GNU C library provides support for user-defined character classes > and the functions from ISO C amendment 1. */ > # ifdef CHARCLASS_NAME_MAX > # define CHAR_CLASS_MAX_LENGTH CHARCLASS_NAME_MAX > -# else > -/* This shouldn't happen but some implementation might still have this > - problem. Use a reasonable default value. */ > -# define CHAR_CLASS_MAX_LENGTH 256 > -# endif > > # define IS_CHAR_CLASS(string) wctype (string) > #else > @@ -2191,7 +2181,6 @@ regex_compile (pattern, size, syntax, bufp) > the leading `:' and `[' (but set bits for them). */ > if (c == ':' && *p == ']') > { > -#if defined _LIBC || (defined HAVE_WC_FUNCS && defined HAVE_WCTYPE_H && > defined HAVE_WCHAR_H) > boolean is_lower = STREQ (str, "lower"); > boolean is_upper = STREQ (str, "upper"); > wctype_t wt; > @@ -2219,55 +2208,6 @@ regex_compile (pattern, size, syntax, bufp) > } > > had_char_class = true; > -#else > - int ch; > - boolean is_alnum = STREQ (str, "alnum"); > - boolean is_alpha = STREQ (str, "alpha"); > - boolean is_blank = STREQ (str, "blank"); > - boolean is_cntrl = STREQ (str, "cntrl"); > - boolean is_digit = STREQ (str, "digit"); > - boolean is_graph = STREQ (str, "graph"); > - boolean is_lower = STREQ (str, "lower"); > - boolean is_print = STREQ (str, "print"); > - boolean is_punct = STREQ (str, "punct"); > - boolean is_space = STREQ (str, "space"); > - boolean is_upper = STREQ (str, "upper"); > - boolean is_xdigit = STREQ (str, "xdigit"); > - > - if (!IS_CHAR_CLASS (str)) > - FREE_STACK_RETURN (REG_ECTYPE); > - > - /* Throw away the ] at the end of the character > - class. */ > - PATFETCH (c); > - > - if (p == pend) FREE_STACK_RETURN (REG_EBRACK); > - > - for (ch = 0; ch < 1 << BYTEWIDTH; ch++) > - { > - /* This was split into 3 if's to > - avoid an arbitrary limit in some compiler. */ > - if ( (is_alnum && ISALNUM (ch)) > - || (is_alpha && ISALPHA (ch)) > - || (is_blank && ISBLANK (ch)) > - || (is_cntrl && ISCNTRL (ch))) > - SET_LIST_BIT (ch); > - if ( (is_digit && ISDIGIT (ch)) > - || (is_graph && ISGRAPH (ch)) > - || (is_lower && ISLOWER (ch)) > - || (is_print && ISPRINT (ch))) > - SET_LIST_BIT (ch); > - if ( (is_punct && ISPUNCT (ch)) > - || (is_space && ISSPACE (ch)) > - || (is_upper && ISUPPER (ch)) > - || (is_xdigit && ISXDIGIT (ch))) > - SET_LIST_BIT (ch); > - if ( translate && (is_upper || is_lower) > - && (ISUPPER (ch) || ISLOWER (ch))) > - SET_LIST_BIT (ch); > - } > - had_char_class = true; > -#endif /* libc || wctype.h */ > } > else > { > diff --git a/utf8.c b/utf8.c > deleted file mode 100644 > index f979e7ef..00000000 > --- a/utf8.c > +++ /dev/null > @@ -1,81 +0,0 @@ > -#if HAVE_CONFIG_H > -# include "config.h" > -#endif > - > -#ifndef HAVE_WC_FUNCS > - > -#include <sys/types.h> > -#include <errno.h> > - > -#ifndef EILSEQ > -#define EILSEQ EINVAL > -#endif > - > -int mutt_wctoutf8(char *s, unsigned int c, size_t buflen) > -{ > - if (c < (1 << 7)) > - { > - if (s && buflen >= 1) > - *s++ = c; > - return 1; > - } > - else if (c < (1 << 11)) > - { > - if (s && buflen >= 2) > - { > - *s++ = 0xc0 | (c >> 6); > - *s++ = 0x80 | (c & 0x3f); > - } > - return 2; > - } > - else if (c < (1 << 16)) > - { > - if (s && buflen >= 3) > - { > - *s++ = 0xe0 | (c >> 12); > - *s++ = 0x80 | ((c >> 6) & 0x3f); > - *s++ = 0x80 | (c & 0x3f); > - } > - return 3; > - } > - else if (c < (1 << 21)) > - { > - if (s && buflen >= 4) > - { > - *s++ = 0xf0 | (c >> 18); > - *s++ = 0x80 | ((c >> 12) & 0x3f); > - *s++ = 0x80 | ((c >> 6) & 0x3f); > - *s++ = 0x80 | (c & 0x3f); > - } > - return 4; > - } > - else if (c < (1 << 26)) > - { > - if (s && buflen >= 5) > - { > - *s++ = 0xf8 | (c >> 24); > - *s++ = 0x80 | ((c >> 18) & 0x3f); > - *s++ = 0x80 | ((c >> 12) & 0x3f); > - *s++ = 0x80 | ((c >> 6) & 0x3f); > - *s++ = 0x80 | (c & 0x3f); > - } > - return 5; > - } > - else if (c < (1 << 31)) > - { > - if (s && buflen >= 6) > - { > - *s++ = 0xfc | (c >> 30); > - *s++ = 0x80 | ((c >> 24) & 0x3f); > - *s++ = 0x80 | ((c >> 18) & 0x3f); > - *s++ = 0x80 | ((c >> 12) & 0x3f); > - *s++ = 0x80 | ((c >> 6) & 0x3f); > - *s++ = 0x80 | (c & 0x3f); > - } > - return 6; > - } > - errno = EILSEQ; > - return -1; > -} > - > -#endif /* !HAVE_WC_FUNCS */ > diff --git a/wcwidth.c b/wcwidth.c > index 75e1b9a8..a8167992 100644 > --- a/wcwidth.c > +++ b/wcwidth.c > @@ -24,7 +24,7 @@ > # include "config.h" > #endif > > -#ifndef HAVE_WC_FUNCS > +#ifndef HAVE_WCWIDTH > > #include "mutt.h" > #include "mbyte.h" > @@ -168,7 +168,7 @@ int wcwidth_ucs(wchar_t ucs) > (ucs >= 0x30000 && ucs <= 0x3fffd))); > } > > -#endif /* !HAVE_WC_FUNCS */ > +#endif /* !HAVE_WCWIDTH */ > > #if 0 /* original */ > int wcswidth(const wchar_t *pwcs, size_t n) > -- > 2.54.0 > -- <https://www.alejandro-colomar.es>
signature.asc
Description: PGP signature
