[rfa/readline] remove hacks for partial multibyte support

Michael Elizabeth Chastain mec.gnu@mindspring.com
Fri Dec 12 05:50:00 GMT 2003

This patch fixes a problem with multibyte support in readline.
The problem manifests on native *-*-hpux11.* and perhaps other

First, some background.  There are three possible levels of multibyte

  none:     no functions, no mbstate_t type
  partial:  multibyte functions, but no mbstate_t type
  full:     multibyte functions, mbstate_t type

linux 2.4.18 with glibc 2.2.93 has full multibyte support.  readline
works fine.

hpux 11.11 has partial multibyte support.  It has the multibyte
functions such as mbrtowc and mbsrtowcs, but the type mbstate_t is
defined only conditionally, depending on the compiler and preprocessor
flags given.  I read Single Unix Spec Version 3, and it looks to me like
this partial support allowed, maybe even required in some cases!

The readline library really needs full multibyte support and will not
work properly with partial multibyte support.  Currently, if the
platform has partial multibyte support, there are some funky macros
which define a fake mbstate_t and redefine some multibyte functions to
avoid the use of real mbstate_t types.

These funky macros don't even compile with gcc, due to some funky symbol
requirements in wchar.h.  The funky macros do compile with HP ansi c and
HP aCC, but this is actually even worse, because they won't work
properly any place where readline manipulates several strings at the
same time.

This patch removes support for partial multibyte platforms.  If a
platform has partial multibyte support, readline will treat it the same
as if it has no multibyte support.

I tested this on:

  native i686-pc-linux-gnu, with the test suite, gcc 2.95.3 and gcc
  3.3.2, dwarf-2 and stabs+.

  native hppa2.0w-hp-hpux11.11, just a build test, with gcc 3.3.2,
  HP ansi c, and HP aCC, and with/without -D_XOPEN_SOURCE=500.
  I also tested this patch against both gdb 6.0 and gdb HEAD.

  native ia64-hp-hpux11.23, same as native hppa2.0w-hp-hpux11.11

I would like to commit this to gdb and use it in gdb for a while before
sending it upstream to the readline maintainers.  Also, I started the
paper trail for a readline assignment.

OK to commit to gdb HEAD?

Michael C

2003-12-11  Michael Chastain  <mec.gnu@mindspring.com>

	* rlmbutil.h: Require HAVE_MBSTATE_T for HANDLE_MULTIBYTE.
	Revert requirement of HAVE_MBRTOWC.  Delete macro definitions
	that attempted to fake mbstate_t if HAVE_MBSRTOCWS is defined
	and HAVE_MBSTATE_T is not defined.


diff -u -r gdb-6.0/readline/rlmbutil.h gdb-6.0.mec/readline/rlmbutil.h
--- gdb-6.0/readline/rlmbutil.h	2003-03-03 13:52:27.000000000 -0500
+++ gdb-6.0.mec/readline/rlmbutil.h	2003-12-11 02:21:34.000000000 -0500
@@ -1,6 +1,6 @@
 /* rlmbutil.h -- utility functions for multibyte characters. */
-/* Copyright (C) 2001 Free Software Foundation, Inc.
+/* Copyright (C) 2001, 2003 Free Software Foundation, Inc.
    This file is part of the GNU Readline Library, a library for
    reading lines of text with interactive input and history editing.
@@ -30,27 +30,27 @@
 /* For platforms which support the ISO C amendement 1 functionality we
-   support user defined character classes.  */
+   support user defined character classes.
+   Some platforms have the multibyte functions such as mbsrtowcs but
+   are lacking the multitype type mbstate_t.  BeOS (unknown version)
+   and HP/UX 11.23 without _XOPEN_SOURCE=500 are like this.
+   We really need mbstate_t type to operate properly.  For example, see
+   compute_lcd_of_matches, where two mbstate_t's are active at the same
+   time.  So we require both the functions and the mbstate_t type in
+   order to enable multibyte support.  */
    /* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>.  */
 #if defined (HAVE_WCTYPE_H) && defined (HAVE_WCHAR_H)
 #  include <wchar.h>
 #  include <wctype.h>
-#  if defined (HAVE_MBRTOWC) && defined (HAVE_MBSRTOWCS)
+#  if defined (HAVE_MBSTATE_T) && defined (HAVE_MBSRTOWCS)
      /* system is supposed to support XPG5 */
 #    define HANDLE_MULTIBYTE      1
 #  endif
-/* Some systems, like BeOS, have multibyte encodings but lack mbstate_t.  */
-#  define wcsrtombs(dest, src, len, ps) (wcsrtombs) (dest, src, len, 0)
-#  define mbsrtowcs(dest, src, len, ps) (mbsrtowcs) (dest, src, len, 0)
-#  define wcrtomb(s, wc, ps) (wcrtomb) (s, wc, 0)
-#  define mbrtowc(pwc, s, n, ps) (mbrtowc) (pwc, s, n, 0)
-#  define mbrlen(s, n, ps) (mbrlen) (s, n, 0)
-#  define mbstate_t int
 /* Make sure MB_LEN_MAX is at least 16 on systems that claim to be able to
    handle multibyte chars (some systems define MB_LEN_MAX as 1) */

More information about the Gdb-patches mailing list