]> git.ipfire.org Git - thirdparty/bash.git/commitdiff
commit bash-20070613 snapshot
authorChet Ramey <chet.ramey@case.edu>
Wed, 7 Dec 2011 14:09:21 +0000 (09:09 -0500)
committerChet Ramey <chet.ramey@case.edu>
Wed, 7 Dec 2011 14:09:21 +0000 (09:09 -0500)
CWRU/CWRU.chlog
CWRU/CWRU.chlog~
builtins.h
builtins.h~ [new file with mode: 0644]
builtins/exec.def
builtins/exec.def~
builtins/mkbuiltins.c
builtins/mkbuiltins.c~
lib/readline/display.c
lib/readline/display.c~
support/shobj-conf

index b4e572686fcf9cd63fde27490b394fc5eb19f113..2e7f5c150a7014163d285e4780cf7f5e744f7ac8 100644 (file)
@@ -14724,4 +14724,38 @@ jobs.c
          the controlling terminal.  If it's not, try to open /dev/tty and
          assign it to shell_tty.  Fixes problems reported by Derek Fawcus
          <dfawcus@cisco.com>
-         
+
+                                  6/13
+                                  ----
+support/shobj-conf
+       - changes to support shared object and shared library creation on AIX
+         5.x and later versions.  From Niklas Edmundsson <nikke@acc.umu.se>
+
+                                  6/17
+                                  ----
+builtins/mkbuiltins.c
+       - new array of builtins, posix_builtins, containing builtins listed
+         as special to the command search order by POSIX
+       - add POSIX_BUILTIN to the builtin flags if the builtin name is one
+         that's special to the posix command search order
+
+builtins.h
+       - new define, POSIX_BUILTIN, means that a builtin is special to the
+         posix command search order
+
+                                  6/22
+                                  ----
+lib/readline/display.c
+       - new macro, WRAP_OFFSET, intended to replace W_OFFSET.  Takes prompt
+         strings longer than one physical line with invisible characters on
+         the second line into account when calculating the number of
+         invisible characters on the current screen line
+       - use WRAP_OFFSET where appropriate (update_line, _rl_move_cursor_relative)
+       - change update_line to deal with adjusting _rl_last_c_pos in a
+         multibyte environment when the prompt has invisible chars on the
+         second line and redisplay has output the invisible characters
+       - change _rl_move_cursor_relative to adjust _rl_last_c_pos in a
+         multibyte environment when the prompt has invisible chars on the
+         second line and the redisplay draws the invisible character.  Fixes
+         redisplay bug reported by Andreas Schwab <schwab@suse.de>
+
index 07b3b86366ebf8acbefa203a3bbf7315223b20c3..4539215023acc81b883a35e471fb7ba544dbabc2 100644 (file)
@@ -14719,3 +14719,43 @@ jobs.c
          fail, for subsequent error messages
        - change initialize_job_control to turn off job control if the terminal
          pgrp == -1 or is not equal to shell_pgrp (with an error message)
+       - in initialize_job_control, if the shell has been forced interactive
+         with -i, make sure stderr is hooked to a tty before using it as
+         the controlling terminal.  If it's not, try to open /dev/tty and
+         assign it to shell_tty.  Fixes problems reported by Derek Fawcus
+         <dfawcus@cisco.com>
+
+                                  6/13
+                                  ----
+support/shobj-conf
+       - changes to support shared object and shared library creation on AIX
+         5.x and later versions.  From Niklas Edmundsson <nikke@acc.umu.se>
+
+                                  6/17
+                                  ----
+builtins/mkbuiltins.c
+       - new array of builtins, posix_builtins, containing builtins listed
+         as special to the command search order by POSIX
+       - add POSIX_BUILTIN to the builtin flags if the builtin name is one
+         that's special to the posix command search order
+
+builtins.h
+       - new define, POSIX_BUILTIN, means that a builtin is special to the
+         posix command search order
+
+                                  6/22
+                                  ----
+lib/readline/display.c
+       - new macro, WRAP_OFFSET, intended to replace W_OFFSET.  Takes prompt
+         strings longer than one physical line with invisible characters on
+         the second line into account when calculating the number of
+         invisible characters on the current screen line
+       - use WRAP_OFFSET where appropriate (update_line, _rl_move_cursor_relative)
+       - change update_line to deal with adjusting _rl_last_c_pos in a
+         multibyte environment when the prompt has invisible chars on the
+         second line and redisplay has output the invisible characters
+       - change _rl_move_cursor_relative to adjust _rl_last_c_pos in a
+         multibyte environment when the prompt has invisible chars on the
+         second line and the redisplay draws the invisible character.  Fixes
+         bug reported by Andreas Schwab <schwab@suse.de>
+
index f75e5038bdb61005a8e73989858ea1d0f8ee8858..ebab0dc81198c09c2624e7220cffeb366c051070 100644 (file)
@@ -1,6 +1,6 @@
 /* builtins.h -- What a builtin looks like, and where to find them. */
 
-/* Copyright (C) 1987,1991 Free Software Foundation, Inc.
+/* Copyright (C) 1987-2007 Free Software Foundation, Inc.
 
    This file is part of GNU Bash, the Bourne Again SHell.
 
 #endif
 
 /* Flags describing various things about a builtin. */
-#define BUILTIN_ENABLED 0x   /* This builtin is enabled. */
-#define BUILTIN_DELETED 0x   /* This has been deleted with enable -d. */
-#define STATIC_BUILTIN  0x   /* This builtin is not dynamically loaded. */
-#define SPECIAL_BUILTIN 0x   /* This is a Posix `special' builtin. */
+#define BUILTIN_ENABLED 0x01   /* This builtin is enabled. */
+#define BUILTIN_DELETED 0x02   /* This has been deleted with enable -d. */
+#define STATIC_BUILTIN  0x04   /* This builtin is not dynamically loaded. */
+#define SPECIAL_BUILTIN 0x08   /* This is a Posix `special' builtin. */
 #define ASSIGNMENT_BUILTIN 0x10        /* This builtin takes assignment statements. */
+#define POSIX_BUILTIN  0x20    /* This builtins is special in the Posix command search order. */
 
 #define BASE_INDENT    4
 
diff --git a/builtins.h~ b/builtins.h~
new file mode 100644 (file)
index 0000000..f75e503
--- /dev/null
@@ -0,0 +1,60 @@
+/* builtins.h -- What a builtin looks like, and where to find them. */
+
+/* Copyright (C) 1987,1991 Free Software Foundation, Inc.
+
+   This file is part of GNU Bash, the Bourne Again SHell.
+
+   Bash is free software; you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   Bash is distributed in the hope that it will be useful, but WITHOUT
+   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
+   License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with Bash; see the file COPYING.  If not, write to the Free
+   Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+
+#include "config.h"
+
+#if defined (HAVE_UNISTD_H)
+#  ifdef _MINIX
+#    include <sys/types.h>
+#  endif
+#  include <unistd.h>
+#endif
+
+#include "command.h"
+#include "general.h"
+
+#if defined (ALIAS)
+#include "alias.h"
+#endif
+
+/* Flags describing various things about a builtin. */
+#define BUILTIN_ENABLED 0x1    /* This builtin is enabled. */
+#define BUILTIN_DELETED 0x2    /* This has been deleted with enable -d. */
+#define STATIC_BUILTIN  0x4    /* This builtin is not dynamically loaded. */
+#define SPECIAL_BUILTIN 0x8    /* This is a Posix `special' builtin. */
+#define ASSIGNMENT_BUILTIN 0x10        /* This builtin takes assignment statements. */
+
+#define BASE_INDENT    4
+
+/* The thing that we build the array of builtins out of. */
+struct builtin {
+  char *name;                  /* The name that the user types. */
+  sh_builtin_func_t *function; /* The address of the invoked function. */
+  int flags;                   /* One of the #defines above. */
+  char * const *long_doc;      /* NULL terminated array of strings. */
+  const char *short_doc;       /* Short version of documenation. */
+  char *handle;                        /* for future use */
+};
+
+/* Found in builtins.c, created by builtins/mkbuiltins. */
+extern int num_shell_builtins; /* Number of shell builtins. */
+extern struct builtin static_shell_builtins[];
+extern struct builtin *shell_builtins;
+extern struct builtin *current_builtin;
index dd34ad53a40ce8f7a7d8405d551d765664ec2472..4d92a5696d2ba89c02f83294e564b78e4979864e 100644 (file)
@@ -1,7 +1,7 @@
 This file is exec.def, from which is created exec.c.
 It implements the builtin "exec" in Bash.
 
-Copyright (C) 1987-2003 Free Software Foundation, Inc.
+Copyright (C) 1987-2007 Free Software Foundation, Inc.
 
 This file is part of GNU Bash, the Bourne Again SHell.
 
@@ -23,15 +23,16 @@ $PRODUCES exec.c
 
 $BUILTIN exec
 $FUNCTION exec_builtin
-$SHORT_DOC exec [-cl] [-a name] file [redirection ...]
-Execute FILE, replacing this shell with the specified program.
-If FILE is not specified, the redirections take effect in this
-shell.  If the first argument is `-l', then place a dash in the
-zeroth arg passed to FILE, as login does.  If the `-c' option
-is supplied, FILE is executed with a null environment.  The `-a'
-option means set argv[0] of the executed process to NAME.
-If the file cannot be executed and the shell is not interactive,
-then the shell exits, unless the shell option `execfail' is set.
+$SHORT_DOC exec [-cl] [-a name] [command [arguments ...]]
+Execute COMMAND, replacing this shell with the specified program.
+ARGUMENTS become the arguments to COMMAND.  If COMMAND is not specified,
+any redirections take effect in the current shell.  If the `-l' option
+is supplied, the shell places a dash in the zeroth argument to the
+COMMAND, as login does.  If the `-c' option is supplied, COMMAND is
+executed with an empty environment.  The `-a' option causes the shell
+to pass NAME as the zeroth argument to COMMAND.  If the file cannot be
+executed, a non-interactive shell exits, unless the shell option `execfail'
+is set.
 $END
 
 #include <config.h>
index 0818a25e21cb6b9fad071e8c6ba055cc61b4410a..dd34ad53a40ce8f7a7d8405d551d765664ec2472 100644 (file)
@@ -24,12 +24,12 @@ $PRODUCES exec.c
 $BUILTIN exec
 $FUNCTION exec_builtin
 $SHORT_DOC exec [-cl] [-a name] file [redirection ...]
-Exec FILE, replacing this shell with the specified program.
+Execute FILE, replacing this shell with the specified program.
 If FILE is not specified, the redirections take effect in this
 shell.  If the first argument is `-l', then place a dash in the
 zeroth arg passed to FILE, as login does.  If the `-c' option
 is supplied, FILE is executed with a null environment.  The `-a'
-option means to make set argv[0] of the executed process to NAME.
+option means set argv[0] of the executed process to NAME.
 If the file cannot be executed and the shell is not interactive,
 then the shell exits, unless the shell option `execfail' is set.
 $END
index 8ebed4bad65e1f3109f305d6cccd3d4f5c35ec63..aef02807b7db46bef2ff76271f364f2178e10260 100644 (file)
@@ -71,6 +71,7 @@ extern char *strcpy ();
 /* Flag values that builtins can have. */
 #define BUILTIN_FLAG_SPECIAL   0x01
 #define BUILTIN_FLAG_ASSIGNMENT 0x02
+#define BUILTIN_FLAG_POSIX_BUILTIN 0x04
 
 #define BASE_INDENT    4
 
@@ -154,9 +155,18 @@ char *assignment_builtins[] =
   (char *)NULL
 };
 
+/* The builtin commands that are special to the POSIX search order. */
+char *posix_builtins[] =
+{
+  "alias", "bg", "cd", "command", "false", "fc", "fg", "getopts", "jobs",
+  "kill", "newgrp", "pwd", "read", "true", "umask", "unalias", "wait",
+  (char *)NULL
+};
+
 /* Forward declarations. */
 static int is_special_builtin ();
 static int is_assignment_builtin ();
+static int is_posix_builtin ();
 
 #if !defined (HAVE_RENAME)
 static int rename ();
@@ -800,6 +810,8 @@ builtin_handler (self, defs, arg)
     new->flags |= BUILTIN_FLAG_SPECIAL;
   if (is_assignment_builtin (name))
     new->flags |= BUILTIN_FLAG_ASSIGNMENT;
+  if (is_posix_builtin (name))
+    new->flags |= BUILTIN_FLAG_POSIX_BUILTIN;
 
   array_add ((char *)new, defs->builtins);
   building_builtin = 1;
@@ -1217,10 +1229,11 @@ write_builtins (defs, structfile, externfile)
                  else
                    fprintf (structfile, "(sh_builtin_func_t *)0x0, ");
 
-                 fprintf (structfile, "%s%s%s, %s_doc,\n",
+                 fprintf (structfile, "%s%s%s%s, %s_doc,\n",
                    "BUILTIN_ENABLED | STATIC_BUILTIN",
                    (builtin->flags & BUILTIN_FLAG_SPECIAL) ? " | SPECIAL_BUILTIN" : "",
                    (builtin->flags & BUILTIN_FLAG_ASSIGNMENT) ? " | ASSIGNMENT_BUILTIN" : "",
+                   (builtin->flags & BUILTIN_FLAG_POSIX_BUILTIN) ? " | POSIX_BUILTIN" : "",
                    document_name (builtin));
 
                  fprintf
@@ -1561,6 +1574,13 @@ is_assignment_builtin (name)
   return (_find_in_table (name, assignment_builtins));
 }
 
+static int
+is_posix_builtin (name)
+     char *name;
+{
+  return (_find_in_table (name, posix_builtins));
+}
+
 #if !defined (HAVE_RENAME)
 static int
 rename (from, to)
index 3923b8a06d67df1c22e46abfd5ca507a3fc0fabe..d213c8da63846531df49691a5f5ba981737ee0e2 100644 (file)
@@ -1,7 +1,7 @@
 /* mkbuiltins.c - Create builtins.c, builtext.h, and builtdoc.c from
    a single source file called builtins.def. */
 
-/* Copyright (C) 1987-2006 Free Software Foundation, Inc.
+/* Copyright (C) 1987-2007 Free Software Foundation, Inc.
 
 This file is part of GNU Bash, the Bourne Again SHell.
 
@@ -71,6 +71,7 @@ extern char *strcpy ();
 /* Flag values that builtins can have. */
 #define BUILTIN_FLAG_SPECIAL   0x01
 #define BUILTIN_FLAG_ASSIGNMENT 0x02
+#define BUILTIN_FLAG_POSIX_BUILTIN 0x04
 
 #define BASE_INDENT    4
 
@@ -154,9 +155,18 @@ char *assignment_builtins[] =
   (char *)NULL
 };
 
+/* The builtin commands that are special to the POSIX search order. */
+char *posix_builtins[] =
+{
+  "alias", "bg", "cd", "command", "false", "fc", "fg", "getopts", "jobs",
+  "kill", "newgrp", "pwd", "read", "true", "umask", "unalias", "wait",
+  (char *)NULL
+};
+
 /* Forward declarations. */
 static int is_special_builtin ();
 static int is_assignment_builtin ();
+static int is_posix_builtin ();
 
 #if !defined (HAVE_RENAME)
 static int rename ();
@@ -800,6 +810,11 @@ builtin_handler (self, defs, arg)
     new->flags |= BUILTIN_FLAG_SPECIAL;
   if (is_assignment_builtin (name))
     new->flags |= BUILTIN_FLAG_ASSIGNMENT;
+  if (is_posix_builtin (name))
+{
+fprintf(stderr, "%s: added BUILTIN_FLAG_POSIX_BUILTIN\n", name);
+    new->flags |= BUILTIN_FLAG_POSIX_BUILTIN;
+}
 
   array_add ((char *)new, defs->builtins);
   building_builtin = 1;
@@ -1080,7 +1095,7 @@ char *structfile_header[] = {
   "/* This file is manufactured by ./mkbuiltins, and should not be",
   "   edited by hand.  See the source to mkbuiltins for details. */",
   "",
-  "/* Copyright (C) 1987-2002 Free Software Foundation, Inc.",
+  "/* Copyright (C) 1987-2007 Free Software Foundation, Inc.",
   "",
   "   This file is part of GNU Bash, the Bourne Again SHell.",
   "",
@@ -1217,10 +1232,11 @@ write_builtins (defs, structfile, externfile)
                  else
                    fprintf (structfile, "(sh_builtin_func_t *)0x0, ");
 
-                 fprintf (structfile, "%s%s%s, %s_doc,\n",
+                 fprintf (structfile, "%s%s%s%s, %s_doc,\n",
                    "BUILTIN_ENABLED | STATIC_BUILTIN",
                    (builtin->flags & BUILTIN_FLAG_SPECIAL) ? " | SPECIAL_BUILTIN" : "",
                    (builtin->flags & BUILTIN_FLAG_ASSIGNMENT) ? " | ASSIGNMENT_BUILTIN" : "",
+                   (builtin->flags & BUILTIN_FLAG_POSIX_BUILTIN) ? " | POSIX_BUILTIN" : "",
                    document_name (builtin));
 
                  fprintf
@@ -1561,6 +1577,13 @@ is_assignment_builtin (name)
   return (_find_in_table (name, assignment_builtins));
 }
 
+static int
+is_posix_builtin (name)
+     char *name;
+{
+  return (_find_in_table (name, posix_builtins));
+}
+
 #if !defined (HAVE_RENAME)
 static int
 rename (from, to)
index 1fbd9e5910e9c55f16209b84020f725734c7cdc4..e37a4181c21c7bcc1c132f011cc2518ad4f12e61 100644 (file)
@@ -938,6 +938,9 @@ rl_redisplay ()
             second and subsequent lines start at inv_lbreaks[N], offset by
             OFFSET (which has already been calculated above).  */
 
+#define WRAP_OFFSET(line, offset)  ((line == 0) \
+                                       ? (offset ? prompt_invis_chars_first_line : 0) \
+                                       : ((line == prompt_last_screen_line) ? wrap_offset-prompt_invis_chars_first_line : 0))
 #define W_OFFSET(line, offset) ((line) == 0 ? offset : 0)
 #define VIS_LLEN(l)    ((l) > _rl_vis_botlin ? 0 : (vis_lbreaks[l+1] - vis_lbreaks[l]))
 #define INV_LLEN(l)    (inv_lbreaks[l+1] - inv_lbreaks[l])
@@ -973,6 +976,13 @@ rl_redisplay ()
                  _rl_last_c_pos > wrap_offset &&
                  o_cpos < prompt_last_invisible)
                _rl_last_c_pos -= wrap_offset;
+
+             else if (linenum == prompt_last_screen_line && prompt_physical_chars > _rl_screenwidth &&
+                       (MB_CUR_MAX > 1 && rl_byte_oriented == 0) &&
+                       cpos_adjusted == 0 &&
+                       _rl_last_c_pos != o_cpos &&
+                       _rl_last_c_pos > (prompt_last_invisible - _rl_screenwidth - (wrap_offset-prompt_invis_chars_first_line)))
+               _rl_last_c_pos -= (wrap_offset-prompt_invis_chars_first_line);
                  
              /* If this is the line with the prompt, we might need to
                 compensate for invisible characters in the new line. Do
@@ -992,6 +1002,19 @@ rl_redisplay ()
                  if (nleft)
                    _rl_clear_to_eol (nleft);
                }
+#if 0
+             /* This segment is intended to handle the case where the prompt
+                has invisible characters on the second line and the new line
+                to be displayed needs to clear the rest of the old characters
+                out (e.g., when printing the i-search prompt).  In general,
+                the case of the new line being shorter than the old.
+                Incomplete */
+             else if (linenum == prompt_last_screen_line &&
+                      prompt_physical_chars > _rl_screenwidth &&
+                      wrap_offset != prompt_invis_chars_first_line &&
+                      _rl_last_c_pos == out &&
+#endif
+
 
              /* Since the new first line is now visible, save its length. */
              if (linenum == 0)
@@ -1244,7 +1267,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
   if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
     temp = _rl_last_c_pos;
   else
-    temp = _rl_last_c_pos - W_OFFSET(_rl_last_v_pos, visible_wrap_offset);
+    temp = _rl_last_c_pos - WRAP_OFFSET (_rl_last_v_pos, visible_wrap_offset);
   if (temp == _rl_screenwidth && _rl_term_autowrap && !_rl_horizontal_scroll_mode
        && _rl_last_v_pos == current_line - 1)
     {
@@ -1805,7 +1828,7 @@ _rl_move_cursor_relative (new, data)
   int woff;                    /* number of invisible chars on current line */
   int cpos, dpos;              /* current and desired cursor positions */
 
-  woff = W_OFFSET (_rl_last_v_pos, wrap_offset);
+  woff = WRAP_OFFSET (_rl_last_v_pos, wrap_offset);
   cpos = _rl_last_c_pos;
 #if defined (HANDLE_MULTIBYTE)
   /* If we have multibyte characters, NEW is indexed by the buffer point in
@@ -1819,7 +1842,11 @@ _rl_move_cursor_relative (new, data)
       /* Use NEW when comparing against the last invisible character in the
         prompt string, since they're both buffer indices and DPOS is a
         desired display position. */
-      if (new > prompt_last_invisible)         /* XXX - don't use woff here */
+      if ((new > prompt_last_invisible) ||             /* XXX - don't use woff here */
+         (prompt_physical_chars > _rl_screenwidth &&
+          _rl_last_v_pos == prompt_last_screen_line &&
+          wrap_offset != woff &&
+          new > (prompt_last_invisible-_rl_screenwidth-wrap_offset)))
        {
          dpos -= woff;
          /* Since this will be assigned to _rl_last_c_pos at the end (more
index ce811709b17d3e18d63a136859482d1a8c3b2cfc..acd261e8c5bb187eb37e9b76e46ad20e7ddb912c 100644 (file)
@@ -938,6 +938,9 @@ rl_redisplay ()
             second and subsequent lines start at inv_lbreaks[N], offset by
             OFFSET (which has already been calculated above).  */
 
+#define WRAP_OFFSET(line, offset)  ((line == 0) \
+                                       ? (offset ? prompt_invis_chars_first_line : 0) \
+                                       : ((line == prompt_last_screen_line) ? wrap_offset-prompt_invis_chars_first_line : 0))
 #define W_OFFSET(line, offset) ((line) == 0 ? offset : 0)
 #define VIS_LLEN(l)    ((l) > _rl_vis_botlin ? 0 : (vis_lbreaks[l+1] - vis_lbreaks[l]))
 #define INV_LLEN(l)    (inv_lbreaks[l+1] - inv_lbreaks[l])
@@ -973,6 +976,13 @@ rl_redisplay ()
                  _rl_last_c_pos > wrap_offset &&
                  o_cpos < prompt_last_invisible)
                _rl_last_c_pos -= wrap_offset;
+
+             else if (linenum == prompt_last_screen_line && prompt_physical_chars > _rl_screenwidth &&
+                       (MB_CUR_MAX > 1 && rl_byte_oriented == 0) &&
+                       cpos_adjusted == 0 &&
+                       _rl_last_c_pos != o_cpos &&
+                       _rl_last_c_pos > (prompt_last_invisible - _rl_screenwidth - (wrap_offset-prompt_invis_chars_first_line)))
+               _rl_last_c_pos -= (wrap_offset-prompt_invis_chars_first_line);
                  
              /* If this is the line with the prompt, we might need to
                 compensate for invisible characters in the new line. Do
@@ -992,6 +1002,18 @@ rl_redisplay ()
                  if (nleft)
                    _rl_clear_to_eol (nleft);
                }
+#if 0
+             /* This segment is intended to handle the case where the prompt
+                has invisible characters on the second line and the new line
+                to be displayed needs to clear the rest of the old characters
+                out (e.g., when printing the i-search prompt).  In general,
+                the case of the new line being shorter than the old.
+                Incomplete */
+             else if (linenum == 1 && prompt_physical_chars > _rl_screenwidth &&
+                      wrap_offset != prompt_invis_chars_first_line &&
+                      _rl_last_c_pos == out &&
+#endif
+
 
              /* Since the new first line is now visible, save its length. */
              if (linenum == 0)
@@ -1244,7 +1266,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
   if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
     temp = _rl_last_c_pos;
   else
-    temp = _rl_last_c_pos - W_OFFSET(_rl_last_v_pos, visible_wrap_offset);
+    temp = _rl_last_c_pos - WRAP_OFFSET (_rl_last_v_pos, visible_wrap_offset);
   if (temp == _rl_screenwidth && _rl_term_autowrap && !_rl_horizontal_scroll_mode
        && _rl_last_v_pos == current_line - 1)
     {
@@ -1553,7 +1575,15 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
       if (lendiff < 0)
        {
          _rl_output_some_chars (nfd, temp);
-         _rl_last_c_pos += col_temp;
+         _rl_last_c_pos += _rl_col_width (nfd, 0, temp);
+         /* If nfd begins before any invisible characters in the prompt,
+            adjust _rl_last_c_pos to account for wrap_offset and set
+            cpos_adjusted to let the caller know. */
+         if (current_line == 0 && wrap_offset && ((nfd - new) <= prompt_last_invisible))
+           {
+             _rl_last_c_pos -= wrap_offset;
+             cpos_adjusted = 1;
+           }
          return;
        }
       /* Sometimes it is cheaper to print the characters rather than
@@ -1797,7 +1827,7 @@ _rl_move_cursor_relative (new, data)
   int woff;                    /* number of invisible chars on current line */
   int cpos, dpos;              /* current and desired cursor positions */
 
-  woff = W_OFFSET (_rl_last_v_pos, wrap_offset);
+  woff = WRAP_OFFSET (_rl_last_v_pos, wrap_offset);
   cpos = _rl_last_c_pos;
 #if defined (HANDLE_MULTIBYTE)
   /* If we have multibyte characters, NEW is indexed by the buffer point in
@@ -1811,7 +1841,10 @@ _rl_move_cursor_relative (new, data)
       /* Use NEW when comparing against the last invisible character in the
         prompt string, since they're both buffer indices and DPOS is a
         desired display position. */
-      if (new > prompt_last_invisible)         /* XXX - don't use woff here */
+      if ((new > prompt_last_invisible) ||             /* XXX - don't use woff here */
+         (prompt_physical_chars > _rl_screenwidth && _rl_last_v_pos == 1 &&
+          wrap_offset != woff &&
+          new > (prompt_last_invisible-_rl_screenwidth-wrap_offset)))
        {
          dpos -= woff;
          /* Since this will be assigned to _rl_last_c_pos at the end (more
index 21e4d2813f1d0b14743fd8ec8cc70602bad66adb..3f7b149369bffba64743101a9effc759c188ea84 100755 (executable)
@@ -10,7 +10,7 @@
 # Chet Ramey
 # chet@po.cwru.edu
 
-# Copyright (C) 1996-2002 Free Software Foundation, Inc.
+# Copyright (C) 1996-2007 Free Software Foundation, Inc.
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -247,7 +247,7 @@ osf*)
        SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
        ;;
 
-aix4.[2-9]*-*gcc*            # lightly tested by jik@cisco.com
+aix4.[2-9]*-*gcc*|aix[5-9].*-*gcc*)            # lightly tested by jik@cisco.com
        SHOBJ_CFLAGS=-fpic
        SHOBJ_LD='ld'
        SHOBJ_LDFLAGS='-bdynamic -bnoentry -bexpall'
@@ -258,7 +258,7 @@ aix4.[2-9]*-*gcc*)          # lightly tested by jik@cisco.com
        SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
        ;;
 
-aix4.[2-9]*)
+aix4.[2-9]*|aix[5-9].*)
        SHOBJ_CFLAGS=-K
        SHOBJ_LD='ld'
        SHOBJ_LDFLAGS='-bdynamic -bnoentry -bexpall'