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>
+
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>
+
/* 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 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 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
--- /dev/null
+/* 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;
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.
$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>
$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
/* 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
(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 ();
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;
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
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)
/* 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.
/* 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
(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 ();
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;
"/* 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.",
"",
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
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)
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])
_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
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)
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)
{
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
/* 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
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])
_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
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)
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)
{
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
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
/* 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
# 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
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'
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'