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>

Attachment: signature.asc
Description: PGP signature

Reply via email to