]> git.ipfire.org Git - thirdparty/bash.git/commitdiff
commit bash-20110520 snapshot
authorChet Ramey <chet.ramey@case.edu>
Thu, 29 Dec 2011 18:08:27 +0000 (13:08 -0500)
committerChet Ramey <chet.ramey@case.edu>
Thu, 29 Dec 2011 18:08:27 +0000 (13:08 -0500)
16 files changed:
CWRU/CWRU.chlog
aclocal.m4
autom4te.cache/output.0
autom4te.cache/requests
autom4te.cache/traces.0
config.h.in
configure
expr.c
lib/readline/complete.c
lib/readline/display.c
lib/readline/isearch.c
lib/readline/mbutil.c
lib/readline/nls.c
lib/readline/rlmbutil.h
lib/readline/rlprivate.h
locale.c

index f436c35379324d362ed4f3e10d852b97171efdbf..209f5522729b20b52ce319dc9bae656a5e39b2f1 100644 (file)
@@ -11661,3 +11661,76 @@ lib/readline/display.c
          for UTF-8 combining characters.  Added workaround dependent on
          MACOSX.  Fixes problem pointed out by Thomas De Contes
          <d.l.tDecontes@free.fr>
+
+                                  5/16
+                                  ----
+lib/readline/rlmbutil.h
+       - WCWIDTH: wrapper for wcwidth that returns 0 for Unicode combining
+         characters on systems where wcwidth is broken (e.g., Mac OS X).
+
+lib/readline/{complete,display,mbutil}.c
+       - use WCWIDTH instead of wcwidth
+
+                                  5/17
+                                  ----
+lib/readline/display.c
+       - update_line: after computing ofd and nfd, see whether the next
+         character in ofd is a zero-width combining character.  If it is,
+         back ofd and nfd up one, so the base characters no longer compare
+         as equivalent.  Fixes problem reported by Keith Winstein
+         <keithw@mit.edu>
+
+lib/readline/nls.c
+       - _rl_utf8locale: new flag variable, set to non-zero if the current
+         locale is UTF-8
+       - utf8locale(): new function, returns 1 if the passed lspec (or the
+         current locale) indicates that the locale is UTF-8.  Called from
+         _rl_init_eightbit
+
+lib/readline/rlprivate.h
+       - extern declaration for _rl_utf8locale
+
+locale.c
+       - locale_utf8locale: new flag variable, set to non-zero if the current
+         locale is UTF-8 (currently unused)
+       - locale_isutf8(): new function, returns 1 if the passed lspec (or the
+         current locale) indicates that the locale is UTF-8.  Should be called
+         whenever the locale or LC_CTYPE value is modified
+
+aclocal.m4
+       - BASH_WCWIDTH_BROKEN: new test for whether or not wcwidth returns
+         zero-width characters like unicode combining characters as having
+         display length 1; define WCWIDTH_BROKEN in this case
+
+config.h.in
+       - WCWIDTH_BROKEN: new define
+
+lib/readline/rlmbutil.h
+       - change WCWIDTH macro to use _rl_utf8locale and the full range of
+         Unicode combining characters (U+0300-U+036F)
+
+                                  5/19
+                                  ----
+lib/readline/rlprivate.h
+       - _rl_search_context: new member, prevc, will hold character read
+         prior to lastc
+
+lib/readline/isearch.c
+       - _rl_isearch_dispatch: if the character causes us to index into
+         another keymap, save that character in cxt->prevc
+       - _rl_isearch_dispatch: if we index into another keymap, but don't
+         find a function that's special to i-search, and the character that
+         caused us to index into that keymap would have terminated the
+         search, push back cxt->prevc and cxt->lastc to make it appear as
+         if `prevc' terminated the search, and execute lastc as a command.
+         We have to push prevc back so we index into the same keymap before
+         we read lastc.  Fixes bug report from Davor Cubranic
+         <cubranic@stat.ubc.ca>
+
+                                  5/20
+                                  ----
+expr.c
+       - expr_bind_variable: pay attention to the return value from
+         bind_variable and check whether or not we should error out due to
+         a readonly or noassign variable.  Fixes bug reported by Eric
+         Blake <eblake@redhat.com>
index 00cfa75a6244a75699f255380524050a3a5dfc31..601feebdc9175f078465ff1dea2de6df851d4341 100644 (file)
@@ -1698,7 +1698,6 @@ AC_CHECK_FUNC(mbscmp, AC_DEFINE(HAVE_MBSCMP))
 AC_CHECK_FUNC(mbsnrtowcs, AC_DEFINE(HAVE_MBSNRTOWCS))
 AC_CHECK_FUNC(mbsrtowcs, AC_DEFINE(HAVE_MBSRTOWCS))
 
-
 AC_REPLACE_FUNCS(mbschr)
 
 AC_CHECK_FUNC(wcrtomb, AC_DEFINE(HAVE_WCRTOMB))
@@ -1763,6 +1762,33 @@ if test $bash_cv_type_wint_t = yes; then
         AC_DEFINE(HAVE_WINT_T, 1, [systems should define this type here])
 fi
 
+dnl check for broken wcwidth
+AC_CACHE_CHECK([for wcwidth broken with unicode combining characters],
+bash_cv_wcwidth_broken,
+[AC_TRY_RUN([
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <locale.h>
+#include <wchar.h>
+
+main(c, v)
+int     c;
+char    **v;
+{
+        int     w;
+
+        setlocale(LC_ALL, "en_US.UTF-8");
+        w = wcwidth (0x0301);
+        exit (w == 0);  /* exit 0 if wcwidth broken */
+}
+],
+bash_cv_wcwidth_broken=yes, bash_cv_wcwdith_broken=no)])
+if test $bash_cv_wcwidth_broken = yes; then
+        AC_DEFINE(WCWIDTH_BROKEN, 1, [wcwidth is usually not broken])
+fi
+
 if test "$am_cv_func_iconv" = yes; then
        OLDLIBS="$LIBS"
        LIBS="$LIBS $LIBICONV"
index 490eca457d9f0c1af2c22116773e22e6c80a448e..5a283c02173ee208a0ecde930c6516e2050d0356 100644 (file)
@@ -10787,7 +10787,6 @@ if test "x$ac_cv_func_mbsrtowcs" = xyes; then :
 fi
 
 
-
 ac_fn_c_check_func "$LINENO" "mbschr" "ac_cv_func_mbschr"
 if test "x$ac_cv_func_mbschr" = xyes; then :
   $as_echo "@%:@define HAVE_MBSCHR 1" >>confdefs.h
@@ -11038,6 +11037,57 @@ $as_echo "@%:@define HAVE_WINT_T 1" >>confdefs.h
 
 fi
 
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for wcwidth broken with unicode combining characters" >&5
+$as_echo_n "checking for wcwidth broken with unicode combining characters... " >&6; }
+if ${bash_cv_wcwidth_broken+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "$cross_compiling" = yes; then :
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run test program while cross compiling
+See \`config.log' for more details" "$LINENO" 5; }
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <locale.h>
+#include <wchar.h>
+
+main(c, v)
+int     c;
+char    **v;
+{
+        int     w;
+
+        setlocale(LC_ALL, "en_US.UTF-8");
+        w = wcwidth (0x0301);
+        exit (w == 0);  /* exit 0 if wcwidth broken */
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  bash_cv_wcwidth_broken=yes
+else
+  bash_cv_wcwdith_broken=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $bash_cv_wcwidth_broken" >&5
+$as_echo "$bash_cv_wcwidth_broken" >&6; }
+if test $bash_cv_wcwidth_broken = yes; then
+        
+$as_echo "@%:@define WCWIDTH_BROKEN 1" >>confdefs.h
+
+fi
+
 if test "$am_cv_func_iconv" = yes; then
        OLDLIBS="$LIBS"
        LIBS="$LIBS $LIBICONV"
index 3d36623d70be9e305d89f5062da5ccdcb8ec77da..d1d8824dae6cfe79a903e058f6e512d81464bc73 100644 (file)
                         'configure.in'
                       ],
                       {
-                        'AM_PROG_F77_C_O' => 1,
                         '_LT_AC_TAGCONFIG' => 1,
-                        'm4_pattern_forbid' => 1,
+                        'AM_PROG_F77_C_O' => 1,
                         'AC_INIT' => 1,
-                        'AC_CANONICAL_TARGET' => 1,
+                        'm4_pattern_forbid' => 1,
                         '_AM_COND_IF' => 1,
-                        'AC_CONFIG_LIBOBJ_DIR' => 1,
+                        'AC_CANONICAL_TARGET' => 1,
                         'AC_SUBST' => 1,
-                        'AC_CANONICAL_HOST' => 1,
+                        'AC_CONFIG_LIBOBJ_DIR' => 1,
                         'AC_FC_SRCEXT' => 1,
+                        'AC_CANONICAL_HOST' => 1,
                         'AC_PROG_LIBTOOL' => 1,
                         'AM_INIT_AUTOMAKE' => 1,
-                        'AC_CONFIG_SUBDIRS' => 1,
                         'AM_PATH_GUILE' => 1,
+                        'AC_CONFIG_SUBDIRS' => 1,
                         'AM_AUTOMAKE_VERSION' => 1,
                         'LT_CONFIG_LTDL_DIR' => 1,
-                        'AC_CONFIG_LINKS' => 1,
                         'AC_REQUIRE_AUX_FILE' => 1,
-                        'LT_SUPPORTED_TAG' => 1,
+                        'AC_CONFIG_LINKS' => 1,
                         'm4_sinclude' => 1,
+                        'LT_SUPPORTED_TAG' => 1,
                         'AM_MAINTAINER_MODE' => 1,
                         'AM_NLS' => 1,
                         'AM_GNU_GETTEXT_INTL_SUBDIR' => 1,
-                        '_m4_warn' => 1,
                         'AM_MAKEFILE_INCLUDE' => 1,
+                        '_m4_warn' => 1,
                         'AM_PROG_CXX_C_O' => 1,
-                        '_AM_COND_ENDIF' => 1,
                         '_AM_MAKEFILE_INCLUDE' => 1,
+                        '_AM_COND_ENDIF' => 1,
                         'AM_ENABLE_MULTILIB' => 1,
                         'AM_SILENT_RULES' => 1,
                         'AM_PROG_MOC' => 1,
                         'AC_CONFIG_FILES' => 1,
-                        'LT_INIT' => 1,
                         'include' => 1,
-                        'AM_GNU_GETTEXT' => 1,
+                        'LT_INIT' => 1,
                         'AM_PROG_AR' => 1,
+                        'AM_GNU_GETTEXT' => 1,
                         'AC_LIBSOURCE' => 1,
-                        'AC_CANONICAL_BUILD' => 1,
                         'AM_PROG_FC_C_O' => 1,
+                        'AC_CANONICAL_BUILD' => 1,
                         'AC_FC_FREEFORM' => 1,
                         'AH_OUTPUT' => 1,
-                        'AC_CONFIG_AUX_DIR' => 1,
                         '_AM_SUBST_NOTMAKE' => 1,
-                        'AM_PROG_CC_C_O' => 1,
-                        'm4_pattern_allow' => 1,
+                        'AC_CONFIG_AUX_DIR' => 1,
                         'sinclude' => 1,
-                        'AM_CONDITIONAL' => 1,
-                        'AC_CANONICAL_SYSTEM' => 1,
+                        'm4_pattern_allow' => 1,
+                        'AM_PROG_CC_C_O' => 1,
                         'AM_XGETTEXT_OPTION' => 1,
+                        'AC_CANONICAL_SYSTEM' => 1,
+                        'AM_CONDITIONAL' => 1,
                         'AC_CONFIG_HEADERS' => 1,
                         'AC_DEFINE_TRACE_LITERAL' => 1,
                         'AM_POT_TOOLS' => 1,
index 343ea49d52d4da381afb1cfcf94096b5d2c6277f..f55598506f3fd42b1d858772710b1e25c074b686 100644 (file)
@@ -580,7 +580,7 @@ m4trace:configure.in:513: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is ob
 You should run autoupdate.], [../../lib/autoconf/general.m4:2765: AC_TRY_RUN is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
-aclocal.m4:1780: RL_LIB_READLINE_VERSION is expanded from...
+aclocal.m4:1806: RL_LIB_READLINE_VERSION is expanded from...
 configure.in:513: the top level])
 m4trace:configure.in:513: -1- AC_DEFINE_TRACE_LITERAL([RL_READLINE_VERSION])
 m4trace:configure.in:513: -1- m4_pattern_allow([^RL_READLINE_VERSION$])
@@ -773,8 +773,8 @@ m4trace:configure.in:659: -1- AC_SUBST_TRACE([MSGMERGE])
 m4trace:configure.in:659: -1- m4_pattern_allow([^MSGMERGE$])
 m4trace:configure.in:659: -1- _m4_warn([obsolete], [The macro `AC_OUTPUT_COMMANDS' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/status.m4:1028: AC_OUTPUT_COMMANDS is expanded from...
-aclocal.m4:3681: AM_PO_SUBDIRS is expanded from...
-aclocal.m4:2085: AM_GNU_GETTEXT is expanded from...
+aclocal.m4:3707: AM_PO_SUBDIRS is expanded from...
+aclocal.m4:2111: AM_GNU_GETTEXT is expanded from...
 configure.in:659: the top level])
 m4trace:configure.in:659: -1- AC_DEFINE_TRACE_LITERAL([off_t])
 m4trace:configure.in:659: -1- m4_pattern_allow([^off_t$])
@@ -838,9 +838,9 @@ You should run autoupdate.], [../../lib/autoconf/general.m4:2765: AC_TRY_RUN is
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 ../../lib/autoconf/general.m4:2053: AC_CACHE_CHECK is expanded from...
-aclocal.m4:2587: gt_INTDIV0 is expanded from...
-aclocal.m4:2373: AM_INTL_SUBDIR is expanded from...
-aclocal.m4:2085: AM_GNU_GETTEXT is expanded from...
+aclocal.m4:2613: gt_INTDIV0 is expanded from...
+aclocal.m4:2399: AM_INTL_SUBDIR is expanded from...
+aclocal.m4:2111: AM_GNU_GETTEXT is expanded from...
 configure.in:659: the top level])
 m4trace:configure.in:659: -1- AC_DEFINE_TRACE_LITERAL([INTDIV0_RAISES_SIGFPE])
 m4trace:configure.in:659: -1- m4_pattern_allow([^INTDIV0_RAISES_SIGFPE$])
@@ -851,10 +851,10 @@ You should run autoupdate.], [../../lib/autoconf/general.m4:2615: AC_TRY_COMPILE
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 ../../lib/autoconf/general.m4:2053: AC_CACHE_CHECK is expanded from...
-aclocal.m4:2689: jm_AC_HEADER_INTTYPES_H is expanded from...
-aclocal.m4:3990: jm_AC_TYPE_UINTMAX_T is expanded from...
-aclocal.m4:2373: AM_INTL_SUBDIR is expanded from...
-aclocal.m4:2085: AM_GNU_GETTEXT is expanded from...
+aclocal.m4:2715: jm_AC_HEADER_INTTYPES_H is expanded from...
+aclocal.m4:4016: jm_AC_TYPE_UINTMAX_T is expanded from...
+aclocal.m4:2399: AM_INTL_SUBDIR is expanded from...
+aclocal.m4:2111: AM_GNU_GETTEXT is expanded from...
 configure.in:659: the top level])
 m4trace:configure.in:659: -1- AC_DEFINE_TRACE_LITERAL([HAVE_INTTYPES_H_WITH_UINTMAX])
 m4trace:configure.in:659: -1- m4_pattern_allow([^HAVE_INTTYPES_H_WITH_UINTMAX$])
@@ -866,10 +866,10 @@ You should run autoupdate.], [../../lib/autoconf/general.m4:2615: AC_TRY_COMPILE
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 ../../lib/autoconf/general.m4:2053: AC_CACHE_CHECK is expanded from...
-aclocal.m4:3960: jm_AC_HEADER_STDINT_H is expanded from...
-aclocal.m4:3990: jm_AC_TYPE_UINTMAX_T is expanded from...
-aclocal.m4:2373: AM_INTL_SUBDIR is expanded from...
-aclocal.m4:2085: AM_GNU_GETTEXT is expanded from...
+aclocal.m4:3986: jm_AC_HEADER_STDINT_H is expanded from...
+aclocal.m4:4016: jm_AC_TYPE_UINTMAX_T is expanded from...
+aclocal.m4:2399: AM_INTL_SUBDIR is expanded from...
+aclocal.m4:2111: AM_GNU_GETTEXT is expanded from...
 configure.in:659: the top level])
 m4trace:configure.in:659: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STDINT_H_WITH_UINTMAX])
 m4trace:configure.in:659: -1- m4_pattern_allow([^HAVE_STDINT_H_WITH_UINTMAX$])
@@ -881,10 +881,10 @@ You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 ../../lib/autoconf/general.m4:2053: AC_CACHE_CHECK is expanded from...
-aclocal.m4:4017: jm_AC_TYPE_UNSIGNED_LONG_LONG is expanded from...
-aclocal.m4:3990: jm_AC_TYPE_UINTMAX_T is expanded from...
-aclocal.m4:2373: AM_INTL_SUBDIR is expanded from...
-aclocal.m4:2085: AM_GNU_GETTEXT is expanded from...
+aclocal.m4:4043: jm_AC_TYPE_UNSIGNED_LONG_LONG is expanded from...
+aclocal.m4:4016: jm_AC_TYPE_UINTMAX_T is expanded from...
+aclocal.m4:2399: AM_INTL_SUBDIR is expanded from...
+aclocal.m4:2111: AM_GNU_GETTEXT is expanded from...
 configure.in:659: the top level])
 m4trace:configure.in:659: -1- AC_DEFINE_TRACE_LITERAL([HAVE_UNSIGNED_LONG_LONG])
 m4trace:configure.in:659: -1- m4_pattern_allow([^HAVE_UNSIGNED_LONG_LONG$])
@@ -904,9 +904,9 @@ You should run autoupdate.], [../../lib/autoconf/general.m4:2615: AC_TRY_COMPILE
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 ../../lib/autoconf/general.m4:2053: AC_CACHE_CHECK is expanded from...
-aclocal.m4:2662: gt_HEADER_INTTYPES_H is expanded from...
-aclocal.m4:2373: AM_INTL_SUBDIR is expanded from...
-aclocal.m4:2085: AM_GNU_GETTEXT is expanded from...
+aclocal.m4:2688: gt_HEADER_INTTYPES_H is expanded from...
+aclocal.m4:2399: AM_INTL_SUBDIR is expanded from...
+aclocal.m4:2111: AM_GNU_GETTEXT is expanded from...
 configure.in:659: the top level])
 m4trace:configure.in:659: -1- AC_DEFINE_TRACE_LITERAL([HAVE_INTTYPES_H])
 m4trace:configure.in:659: -1- m4_pattern_allow([^HAVE_INTTYPES_H$])
@@ -917,9 +917,9 @@ You should run autoupdate.], [../../lib/autoconf/general.m4:2615: AC_TRY_COMPILE
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 ../../lib/autoconf/general.m4:2053: AC_CACHE_CHECK is expanded from...
-aclocal.m4:2717: gt_INTTYPES_PRI is expanded from...
-aclocal.m4:2373: AM_INTL_SUBDIR is expanded from...
-aclocal.m4:2085: AM_GNU_GETTEXT is expanded from...
+aclocal.m4:2743: gt_INTTYPES_PRI is expanded from...
+aclocal.m4:2399: AM_INTL_SUBDIR is expanded from...
+aclocal.m4:2111: AM_GNU_GETTEXT is expanded from...
 configure.in:659: the top level])
 m4trace:configure.in:659: -1- AC_DEFINE_TRACE_LITERAL([PRI_MACROS_BROKEN])
 m4trace:configure.in:659: -1- m4_pattern_allow([^PRI_MACROS_BROKEN$])
@@ -996,20 +996,20 @@ You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 ../../lib/autoconf/general.m4:2053: AC_CACHE_CHECK is expanded from...
-aclocal.m4:2495: AM_ICONV_LINK is expanded from...
-aclocal.m4:2550: AM_ICONV is expanded from...
-aclocal.m4:2373: AM_INTL_SUBDIR is expanded from...
-aclocal.m4:2085: AM_GNU_GETTEXT is expanded from...
+aclocal.m4:2521: AM_ICONV_LINK is expanded from...
+aclocal.m4:2576: AM_ICONV is expanded from...
+aclocal.m4:2399: AM_INTL_SUBDIR is expanded from...
+aclocal.m4:2111: AM_GNU_GETTEXT is expanded from...
 configure.in:659: the top level])
 m4trace:configure.in:659: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 ../../lib/autoconf/general.m4:2053: AC_CACHE_CHECK is expanded from...
-aclocal.m4:2495: AM_ICONV_LINK is expanded from...
-aclocal.m4:2550: AM_ICONV is expanded from...
-aclocal.m4:2373: AM_INTL_SUBDIR is expanded from...
-aclocal.m4:2085: AM_GNU_GETTEXT is expanded from...
+aclocal.m4:2521: AM_ICONV_LINK is expanded from...
+aclocal.m4:2576: AM_ICONV is expanded from...
+aclocal.m4:2399: AM_INTL_SUBDIR is expanded from...
+aclocal.m4:2111: AM_GNU_GETTEXT is expanded from...
 configure.in:659: the top level])
 m4trace:configure.in:659: -1- AC_DEFINE_TRACE_LITERAL([HAVE_ICONV])
 m4trace:configure.in:659: -1- m4_pattern_allow([^HAVE_ICONV$])
@@ -1025,9 +1025,9 @@ m4trace:configure.in:659: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' i
 You should run autoupdate.], [../../lib/autoconf/general.m4:2615: AC_TRY_COMPILE is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
-aclocal.m4:2550: AM_ICONV is expanded from...
-aclocal.m4:2373: AM_INTL_SUBDIR is expanded from...
-aclocal.m4:2085: AM_GNU_GETTEXT is expanded from...
+aclocal.m4:2576: AM_ICONV is expanded from...
+aclocal.m4:2399: AM_INTL_SUBDIR is expanded from...
+aclocal.m4:2111: AM_GNU_GETTEXT is expanded from...
 configure.in:659: the top level])
 m4trace:configure.in:659: -1- AC_DEFINE_TRACE_LITERAL([ICONV_CONST])
 m4trace:configure.in:659: -1- m4_pattern_allow([^ICONV_CONST$])
@@ -1038,9 +1038,9 @@ You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 ../../lib/autoconf/general.m4:2053: AC_CACHE_CHECK is expanded from...
-aclocal.m4:2014: AM_LANGINFO_CODESET is expanded from...
-aclocal.m4:2373: AM_INTL_SUBDIR is expanded from...
-aclocal.m4:2085: AM_GNU_GETTEXT is expanded from...
+aclocal.m4:2040: AM_LANGINFO_CODESET is expanded from...
+aclocal.m4:2399: AM_INTL_SUBDIR is expanded from...
+aclocal.m4:2111: AM_GNU_GETTEXT is expanded from...
 configure.in:659: the top level])
 m4trace:configure.in:659: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LANGINFO_CODESET])
 m4trace:configure.in:659: -1- m4_pattern_allow([^HAVE_LANGINFO_CODESET$])
@@ -1051,9 +1051,9 @@ You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 ../../lib/autoconf/general.m4:2053: AC_CACHE_CHECK is expanded from...
-aclocal.m4:2784: AM_LC_MESSAGES is expanded from...
-aclocal.m4:2373: AM_INTL_SUBDIR is expanded from...
-aclocal.m4:2085: AM_GNU_GETTEXT is expanded from...
+aclocal.m4:2810: AM_LC_MESSAGES is expanded from...
+aclocal.m4:2399: AM_INTL_SUBDIR is expanded from...
+aclocal.m4:2111: AM_GNU_GETTEXT is expanded from...
 configure.in:659: the top level])
 m4trace:configure.in:659: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LC_MESSAGES])
 m4trace:configure.in:659: -1- m4_pattern_allow([^HAVE_LC_MESSAGES$])
@@ -1071,21 +1071,21 @@ You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 ../../lib/autoconf/general.m4:2053: AC_CACHE_CHECK is expanded from...
-aclocal.m4:2085: AM_GNU_GETTEXT is expanded from...
+aclocal.m4:2111: AM_GNU_GETTEXT is expanded from...
 configure.in:659: the top level])
 m4trace:configure.in:659: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 ../../lib/autoconf/general.m4:2053: AC_CACHE_CHECK is expanded from...
-aclocal.m4:2085: AM_GNU_GETTEXT is expanded from...
+aclocal.m4:2111: AM_GNU_GETTEXT is expanded from...
 configure.in:659: the top level])
 m4trace:configure.in:659: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 ../../lib/autoconf/general.m4:2053: AC_CACHE_CHECK is expanded from...
-aclocal.m4:2085: AM_GNU_GETTEXT is expanded from...
+aclocal.m4:2111: AM_GNU_GETTEXT is expanded from...
 configure.in:659: the top level])
 m4trace:configure.in:659: -1- AC_DEFINE_TRACE_LITERAL([ENABLE_NLS])
 m4trace:configure.in:659: -1- m4_pattern_allow([^ENABLE_NLS$])
@@ -1829,6 +1829,24 @@ m4trace:configure.in:811: -1- AC_DEFINE_TRACE_LITERAL([HAVE_WINT_T])
 m4trace:configure.in:811: -1- m4_pattern_allow([^HAVE_WINT_T$])
 m4trace:configure.in:811: -1- AH_OUTPUT([HAVE_WINT_T], [/* systems should define this type here */
 @%:@undef HAVE_WINT_T])
+m4trace:configure.in:811: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
+You should run autoupdate.], [../../lib/autoconf/general.m4:2765: AC_TRY_RUN is expanded from...
+../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
+../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
+../../lib/autoconf/general.m4:2053: AC_CACHE_CHECK is expanded from...
+aclocal.m4:1689: BASH_CHECK_MULTIBYTE is expanded from...
+configure.in:811: the top level])
+m4trace:configure.in:811: -1- _m4_warn([cross], [AC_RUN_IFELSE called without default to allow cross compiling], [../../lib/autoconf/general.m4:2749: AC_RUN_IFELSE is expanded from...
+../../lib/autoconf/general.m4:2765: AC_TRY_RUN is expanded from...
+../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
+../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
+../../lib/autoconf/general.m4:2053: AC_CACHE_CHECK is expanded from...
+aclocal.m4:1689: BASH_CHECK_MULTIBYTE is expanded from...
+configure.in:811: the top level])
+m4trace:configure.in:811: -1- AC_DEFINE_TRACE_LITERAL([WCWIDTH_BROKEN])
+m4trace:configure.in:811: -1- m4_pattern_allow([^WCWIDTH_BROKEN$])
+m4trace:configure.in:811: -1- AH_OUTPUT([WCWIDTH_BROKEN], [/* wcwidth is usually not broken */
+@%:@undef WCWIDTH_BROKEN])
 m4trace:configure.in:811: -1- AH_OUTPUT([HAVE_LOCALE_CHARSET], [/* Define to 1 if you have the `locale_charset\' function. */
 @%:@undef HAVE_LOCALE_CHARSET])
 m4trace:configure.in:811: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LOCALE_CHARSET])
@@ -2100,7 +2118,7 @@ m4trace:configure.in:892: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is ob
 You should run autoupdate.], [../../lib/autoconf/general.m4:2765: AC_TRY_RUN is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
-aclocal.m4:1894: BASH_FUNC_CTYPE_NONASCII is expanded from...
+aclocal.m4:1920: BASH_FUNC_CTYPE_NONASCII is expanded from...
 configure.in:892: the top level])
 m4trace:configure.in:892: -1- AC_DEFINE_TRACE_LITERAL([CTYPE_NON_ASCII])
 m4trace:configure.in:892: -1- m4_pattern_allow([^CTYPE_NON_ASCII$])
@@ -2320,7 +2338,7 @@ m4trace:configure.in:929: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is ob
 You should run autoupdate.], [../../lib/autoconf/general.m4:2765: AC_TRY_RUN is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
-aclocal.m4:4123: BASH_STRUCT_WEXITSTATUS_OFFSET is expanded from...
+aclocal.m4:4149: BASH_STRUCT_WEXITSTATUS_OFFSET is expanded from...
 configure.in:929: the top level])
 m4trace:configure.in:929: -1- AC_DEFINE_TRACE_LITERAL([WEXITSTATUS_OFFSET])
 m4trace:configure.in:929: -1- m4_pattern_allow([^WEXITSTATUS_OFFSET$])
@@ -2402,7 +2420,7 @@ You should run autoupdate.], [../../lib/autoconf/general.m4:2765: AC_TRY_RUN is
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 ../../lib/autoconf/general.m4:2053: AC_CACHE_CHECK is expanded from...
-aclocal.m4:4039: BASH_FUNC_SNPRINTF is expanded from...
+aclocal.m4:4065: BASH_FUNC_SNPRINTF is expanded from...
 configure.in:942: the top level])
 m4trace:configure.in:942: -1- AC_DEFINE_TRACE_LITERAL([HAVE_SNPRINTF])
 m4trace:configure.in:942: -1- m4_pattern_allow([^HAVE_SNPRINTF$])
@@ -2415,7 +2433,7 @@ You should run autoupdate.], [../../lib/autoconf/general.m4:2765: AC_TRY_RUN is
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 ../../lib/autoconf/general.m4:2053: AC_CACHE_CHECK is expanded from...
-aclocal.m4:4067: BASH_FUNC_VSNPRINTF is expanded from...
+aclocal.m4:4093: BASH_FUNC_VSNPRINTF is expanded from...
 configure.in:943: the top level])
 m4trace:configure.in:943: -1- AC_DEFINE_TRACE_LITERAL([HAVE_VSNPRINTF])
 m4trace:configure.in:943: -1- m4_pattern_allow([^HAVE_VSNPRINTF$])
@@ -2499,7 +2517,7 @@ m4trace:configure.in:971: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is ob
 You should run autoupdate.], [../../lib/autoconf/general.m4:2765: AC_TRY_RUN is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
-aclocal.m4:1938: BASH_CHECK_WCONTINUED is expanded from...
+aclocal.m4:1964: BASH_CHECK_WCONTINUED is expanded from...
 configure.in:971: the top level])
 m4trace:configure.in:971: -1- AC_DEFINE_TRACE_LITERAL([WCONTINUED_BROKEN])
 m4trace:configure.in:971: -1- m4_pattern_allow([^WCONTINUED_BROKEN$])
index 69846a65615b1c4021651ce4beafb867df41414f..e2539e34697fcebdb062834fa7d7c0e3ec8d10b3 100644 (file)
 /* Define if you have the wcwidth function.  */
 #undef HAVE_WCWIDTH
 
+/* and if it works */
+#undef WCWIDTH_BROKEN
+
 /* Presence of certain system include files. */
 
 /* Define if you have the <arpa/inet.h> header file. */
index 90b8e3dcaa6f188af09b71a1ba727ff3f78df205..84dce0fe000683750db458fea8fd5077e3ae11f7 100755 (executable)
--- a/configure
+++ b/configure
@@ -10787,7 +10787,6 @@ if test "x$ac_cv_func_mbsrtowcs" = xyes; then :
 fi
 
 
-
 ac_fn_c_check_func "$LINENO" "mbschr" "ac_cv_func_mbschr"
 if test "x$ac_cv_func_mbschr" = xyes; then :
   $as_echo "#define HAVE_MBSCHR 1" >>confdefs.h
@@ -11038,6 +11037,57 @@ $as_echo "#define HAVE_WINT_T 1" >>confdefs.h
 
 fi
 
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for wcwidth broken with unicode combining characters" >&5
+$as_echo_n "checking for wcwidth broken with unicode combining characters... " >&6; }
+if ${bash_cv_wcwidth_broken+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "$cross_compiling" = yes; then :
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run test program while cross compiling
+See \`config.log' for more details" "$LINENO" 5; }
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <locale.h>
+#include <wchar.h>
+
+main(c, v)
+int     c;
+char    **v;
+{
+        int     w;
+
+        setlocale(LC_ALL, "en_US.UTF-8");
+        w = wcwidth (0x0301);
+        exit (w == 0);  /* exit 0 if wcwidth broken */
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  bash_cv_wcwidth_broken=yes
+else
+  bash_cv_wcwdith_broken=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $bash_cv_wcwidth_broken" >&5
+$as_echo "$bash_cv_wcwidth_broken" >&6; }
+if test $bash_cv_wcwidth_broken = yes; then
+
+$as_echo "#define WCWIDTH_BROKEN 1" >>confdefs.h
+
+fi
+
 if test "$am_cv_func_iconv" = yes; then
        OLDLIBS="$LIBS"
        LIBS="$LIBS $LIBICONV"
diff --git a/expr.c b/expr.c
index 2177cfad1fd12a6fad54c6d6dcf234da11ede12b..f7329c39ecdcb3088ae13b85aa5784bb291d7bdd 100644 (file)
--- a/expr.c
+++ b/expr.c
@@ -309,7 +309,11 @@ static void
 expr_bind_variable (lhs, rhs)
      char *lhs, *rhs;
 {
-  (void)bind_int_variable (lhs, rhs);
+  SHELL_VAR *v;
+
+  v = bind_int_variable (lhs, rhs);
+  if (v && (readonly_p (v) || noassign_p (v)))
+    longjmp (evalbuf, 1);      /* variable assignment error */
   stupidly_hack_special_variables (lhs);
 }
 
index e67cfeb3b7fbc52d9d41e268a5058c6de2c91149..1b593969813daad092103bc58aa45c1008046cb7 100644 (file)
@@ -679,7 +679,7 @@ fnwidth (string)
          else
            {
              pos += clen;
-             w = wcwidth (wc);
+             w = WCWIDTH (wc);
              width += (w >= 0) ? w : 1;
            }
 #else
@@ -766,7 +766,7 @@ fnprint (to_print, prefix_bytes)
            break;
          else
            {
-             w = wcwidth (wc);
+             w = WCWIDTH (wc);
              width = (w >= 0) ? w : 1;
            }
          fwrite (s, 1, tlen, rl_outstream);
index 7cab86426924056518bcf0414c51ac4d84912ae9..655f90c9405f8edf48867a183e1745aa27ff7e1f 100644 (file)
@@ -766,7 +766,7 @@ rl_redisplay ()
            break;                      /* Found '\0' */
          else
            {
-             temp = wcwidth (wc);
+             temp = WCWIDTH (wc);
              wc_width = (temp >= 0) ? temp : 1;
            }
        }
@@ -1320,7 +1320,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
          else if (MB_NULLWCH (ret))
            tempwidth = 0;
          else
-           tempwidth = wcwidth (wc);
+           tempwidth = WCWIDTH (wc);
 
          if (tempwidth > 0)
            {
@@ -1377,6 +1377,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
       temp = (omax < nmax) ? omax : nmax;
       if (memcmp (old, new, temp) == 0)                /* adding at the end */
        {
+         new_offset = old_offset = temp;
          ofd = old + temp;
          nfd = new + temp;
        }
@@ -1387,6 +1388,8 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
 
          if (omax == nmax && STREQN (new, old, omax))
            {
+             old_offset = omax;
+             new_offset = nmax;
              ofd = old + omax;
              nfd = new + nmax;
            }
@@ -1399,6 +1402,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
                {
                  old_offset = _rl_find_next_mbchar (old, old_offset, 1, MB_FIND_ANY);
                  new_offset = _rl_find_next_mbchar (new, new_offset, 1, MB_FIND_ANY);
+
                  ofd = old + old_offset;
                  nfd = new + new_offset;
                }
@@ -1422,6 +1426,27 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
   if (ofd == oe && nfd == ne)
     return;
 
+#if defined (HANDLE_MULTIBYTE)
+  if (MB_CUR_MAX > 1 && rl_byte_oriented == 0 && _rl_utf8locale)
+    {
+      wchar_t wc;
+      mbstate_t ps = { 0 };
+      int t;
+
+      /* If the first character in the difference is a zero-width character,
+        assume it's a combining character and back one up so the two base
+        characters no longer compare equivalently. */
+      t = mbrtowc (&wc, ofd, MB_CUR_MAX, &ps);
+      if (t > 0 && UNICODE_COMBINING_CHAR (wc) && WCWIDTH (wc) == 0)
+       {
+         old_offset = _rl_find_prev_mbchar (old, ofd - old, MB_FIND_ANY);
+         new_offset = _rl_find_prev_mbchar (new, nfd - new, MB_FIND_ANY);
+         ofd = old + old_offset;       /* equal by definition */
+         nfd = new + new_offset;
+       }
+    }
+#endif
+
   wsatend = 1;                 /* flag for trailing whitespace */
 
 #if defined (HANDLE_MULTIBYTE)
@@ -1429,6 +1454,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
     {
       ols = old + _rl_find_prev_mbchar (old, oe - old, MB_FIND_ANY);
       nls = new + _rl_find_prev_mbchar (new, ne - new, MB_FIND_ANY);
+
       while ((ols > ofd) && (nls > nfd))
        {
          memset (&ps_old, 0, sizeof (mbstate_t));
@@ -2721,14 +2747,7 @@ _rl_ttymsg ("_rl_col_width: called with MB_CUR_MAX == 1");
        {
          point += tmp;
          max -= tmp;
-#if defined (MACOSX)
-         /* Mac OS X has a bug where wcwidth returns 1 for UTF-8 combining
-            characters */
-         if (wc >= 769 && wc <= 833)
-           tmp = 0;
-         else
-#endif
-         tmp = wcwidth(wc);
+         tmp = WCWIDTH(wc);
          width += (tmp >= 0) ? tmp : 1;
        }
     }
index 712b9ea8ece0eacaf135d338ff5be514a3a59868..de29e6163345baa6382fb02e0e5f0be88bb77c3e 100644 (file)
@@ -6,7 +6,7 @@
 /*                                                                 */
 /* **************************************************************** */
 
-/* Copyright (C) 1987-2009 Free Software Foundation, Inc.
+/* Copyright (C) 1987-2011 Free Software Foundation, Inc.
 
    This file is part of the GNU Readline Library (Readline), a library
    for reading lines of text with interactive input and history editing.      
@@ -110,7 +110,7 @@ _rl_scxt_alloc (type, flags)
   cxt->history_pos = 0;
   cxt->direction = 0;
 
-  cxt->lastc = 0;
+  cxt->prevc = cxt->lastc = 0;
 
   cxt->sline = 0;
   cxt->sline_len = cxt->sline_index = 0;
@@ -319,6 +319,9 @@ _rl_search_getchar (cxt)
   return c;
 }
 
+#define ENDSRCH_CHAR(c) \
+  ((CTRL_CHAR (c) || META_CHAR (c) || (c) == RUBOUT) && ((c) != CTRL ('G')))
+
 /* Process just-read character C according to isearch context CXT.  Return
    -1 if the caller should just free the context and return, 0 if we should
    break out of the loop, and 1 if we should continue to read characters. */
@@ -347,7 +350,10 @@ _rl_isearch_dispatch (cxt, c)
       cxt->keymap = FUNCTION_TO_KEYMAP (cxt->keymap, c);
       cxt->sflags |= SF_CHGKMAP;
       /* XXX - we should probably save this sequence, so we can do
-        something useful if this doesn't end up mapping to a command. */
+        something useful if this doesn't end up mapping to a command we
+        interpret here.  Right now we just save the most recent character
+        that caused the index into a new keymap. */
+      cxt->prevc = c;
       return 1;
     }
 
@@ -376,6 +382,18 @@ _rl_isearch_dispatch (cxt, c)
     {
       cxt->keymap = cxt->okeymap;
       cxt->sflags &= ~SF_CHGKMAP;
+      /* If we indexed into a new keymap, but didn't map to a command that
+        affects the search (lastc > 0), and the character that mapped to a
+        new keymap would have ended the search (ENDSRCH_CHAR(cxt->prevc)),
+        handle that now as if the previous char would have ended the search
+        and we would have read the current character. */
+      /* XXX - should we check cxt->mb? */
+      if (cxt->lastc > 0 && ENDSRCH_CHAR (cxt->prevc))
+       {
+         rl_stuff_char (cxt->lastc);
+         rl_execute_next (cxt->prevc);
+         return (0);
+       }
     }
 
   /* The characters in isearch_terminators (set from the user-settable
@@ -398,9 +416,6 @@ _rl_isearch_dispatch (cxt, c)
       return (0);
     }
 
-#define ENDSRCH_CHAR(c) \
-  ((CTRL_CHAR (c) || META_CHAR (c) || (c) == RUBOUT) && ((c) != CTRL ('G')))
-
 #if defined (HANDLE_MULTIBYTE)
   if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
     {
index eeb7e557f64a9b7bafc6ed46730560028281a339..8e6be2f129030792b772426c6fad012e7a0ff63f 100644 (file)
@@ -119,7 +119,7 @@ _rl_find_next_mbchar_internal (string, seed, count, find_non_zero)
          point += tmp;
          if (find_non_zero)
            {
-             if (wcwidth (wc) == 0)
+             if (WCWIDTH (wc) == 0)
                continue;
              else
                count--;
@@ -132,7 +132,7 @@ _rl_find_next_mbchar_internal (string, seed, count, find_non_zero)
   if (find_non_zero)
     {
       tmp = mbrtowc (&wc, string + point, strlen (string + point), &ps);
-      while (MB_NULLWCH (tmp) == 0 && MB_INVALIDCH (tmp) == 0 && wcwidth (wc) == 0)
+      while (MB_NULLWCH (tmp) == 0 && MB_INVALIDCH (tmp) == 0 && WCWIDTH (wc) == 0)
        {
          point += tmp;
          tmp = mbrtowc (&wc, string + point, strlen (string + point), &ps);
@@ -184,7 +184,7 @@ _rl_find_prev_mbchar_internal (string, seed, find_non_zero)
        {
          if (find_non_zero)
            {
-             if (wcwidth (wc) != 0)
+             if (WCWIDTH (wc) != 0)
                prev = point;
            }
          else
index e3599eb76f4295f3f8327632cee4c35170c2a1e6..a1f57bcfea70dac16ad88b75ec7b634cef3b2306 100644 (file)
 #  include <locale.h>
 #endif
 
+#if defined (HAVE_LANGINFO_CODESET)
+#  include <langinfo.h>
+#endif
+
 #include <ctype.h>
 
 #include "rldefs.h"
@@ -50,6 +54,8 @@
 #include "rlshell.h"
 #include "rlprivate.h"
 
+static int utf8locale PARAMS((char *));
+
 #if !defined (HAVE_SETLOCALE)    
 /* A list of legal values for the LANG or LC_CTYPE environment variables.
    If a locale name in this list is the value for the LC_ALL, LC_CTYPE,
@@ -72,9 +78,12 @@ static char *legal_lang_values[] =
 };
 
 static char *normalize_codeset PARAMS((char *));
-static char *find_codeset PARAMS((char *, size_t *));
 #endif /* !HAVE_SETLOCALE */
 
+static char *find_codeset PARAMS((char *, size_t *));
+
+int _rl_utf8locale = 0;
+
 static char *_rl_get_locale_var PARAMS((const char *));
 
 static char *
@@ -91,7 +100,26 @@ _rl_get_locale_var (v)
 
   return lspec;
 }
-  
+
+static int
+utf8locale (lspec)
+     char *lspec;
+{
+  char *cp;
+  size_t len;
+
+#if HAVE_LANGINFO_CODESET
+  cp = nl_langinfo (CODESET);
+  return (STREQ (cp, "UTF-8") || STREQ (cp, "utf8"));
+#else
+  cp = find_codeset (lspec, &len);
+
+  if (cp == 0 || len < 4 || len > 5)
+    return 0;
+  return ((len == 5) ? strncmp (cp. "UTF-8", len) == 0 : strncmp (cp, "utf8", 4) == 0);
+#endif
+}
+
 /* Check for LC_ALL, LC_CTYPE, and LANG and use the first with a value
    to decide the defaults for 8-bit character input and output.  Returns
    1 if we set eight-bit mode. */
@@ -116,6 +144,9 @@ _rl_init_eightbit ()
     lspec = "";
   t = setlocale (LC_CTYPE, lspec);
 
+  if (t && *t)
+    _rl_utf8locale = utf8locale (t);
+
   if (t && *t && (t[0] != 'C' || t[1]) && (STREQ (t, "POSIX") == 0))
     {
       _rl_meta_flag = 1;
@@ -197,6 +228,7 @@ normalize_codeset (codeset)
 
   return retval;
 }
+#endif /* !HAVE_SETLOCALE */
 
 /* Isolate codeset portion of locale specification. */
 static char *
@@ -249,4 +281,3 @@ find_codeset (name, lenp)
 
   return result;
 }
-#endif /* !HAVE_SETLOCALE */
index 7716a70cca12fe52b2bbfdcdd5322a43482a145b..06d85ab372fbe5d10260430a3ecbbd7afdff4413 100644 (file)
@@ -123,6 +123,15 @@ extern int _rl_walphabetic PARAMS((wchar_t));
 #define MB_INVALIDCH(x)                ((x) == (size_t)-1 || (x) == (size_t)-2)
 #define MB_NULLWCH(x)          ((x) == 0)
 
+/* Unicode combining characters range from U+0300 to U+036F */
+#define UNICODE_COMBINING_CHAR(x) ((x) >= 768 && (x) <= 879)
+
+#if defined (WCWIDTH_BROKEN)
+#  define WCWIDTH(wc)  ((_rl_utf8locale && UNICODE_COMBINING_CHAR(wc)) ? 0 : wcwidth(wc))
+#else
+#  define WCWIDTH(wc)  wcwidth(wc)
+#endif
+
 #else /* !HANDLE_MULTIBYTE */
 
 #undef MB_LEN_MAX
index 2e31ded0ab4ce56faeadccd9c63f855685df6e95..f39c462a66cd6e5450a16891b48dd660e33978ef 100644 (file)
@@ -1,7 +1,7 @@
 /* rlprivate.h -- functions and variables global to the readline library,
                  but not intended for use by applications. */
 
-/* Copyright (C) 1999-2010 Free Software Foundation, Inc.
+/* Copyright (C) 1999-2011 Free Software Foundation, Inc.
 
    This file is part of the GNU Readline Library (Readline), a library
    for reading lines of text with interactive input and history editing.      
@@ -86,6 +86,7 @@ typedef struct  __rl_search_context
   int history_pos;
   int direction;
 
+  int prevc;
   int lastc;
 #if defined (HANDLE_MULTIBYTE)
   char mb[MB_LEN_MAX];
@@ -443,6 +444,9 @@ extern int _rl_history_saved_point;
 
 extern _rl_arg_cxt _rl_argcxt;
 
+/* nls.c */
+extern int _rl_utf8locale;
+
 /* readline.c */
 extern int _rl_echoing_p;
 extern int _rl_horizontal_scroll_mode;
index 722a707813f62bf99f5d623ecc1f78e0170e0551..9b71f7ebb8a8e26fcfdf39ccb675b0faa28bf3f8 100644 (file)
--- a/locale.c
+++ b/locale.c
 #  include <unistd.h>
 #endif
 
+#if HAVE_LANGINFO_CODESET
+#  include <langinfo.h>
+#endif
+
 #include "bashintl.h"
 #include "bashansi.h"
 #include <stdio.h>
@@ -39,6 +43,8 @@
 extern int errno;
 #endif
 
+int locale_utf8locale; /* unused for now */
+
 extern int dump_translatable_strings, dump_po_strings;
 
 /* The current locale when the program begins */
@@ -61,6 +67,7 @@ static char *lang;
 static int reset_locale_vars __P((void));
 
 static void locale_setblanks __P((void));
+static int locale_isutf8 __P((char *));
 
 /* Set the value of default_locale and make the current locale the
    system default locale.  This should be called very early in main(). */
@@ -267,7 +274,7 @@ set_lang (var, value)
       lang = (char *)xmalloc (1);
       lang[0] = '\0';
     }
-    
+
   return ((lc_all == 0 || *lc_all == 0) ? reset_locale_vars () : 0);
 }
 
@@ -532,3 +539,18 @@ locale_setblanks ()
        sh_syntaxtab[x] &= ~(CSHBRK|CBLANK);
     }
 }
+
+static int
+locale_isutf8 (lspec)
+     char *lspec;
+{
+  char *cp;
+
+#if HAVE_LANGINFO_CODESET
+  cp = nl_langinfo (CODESET);
+  return (STREQ (cp, "UTF-8") || STREQ (cp, "utf8"));
+#else
+  /* Take a shot */
+  return (strstr (lspec, "UTF-8") || strstr (lspec, "utf8"));
+#endif
+}