commit bash-20171124 snapshot

This commit is contained in:
Chet Ramey
2017-12-01 12:09:12 -05:00
parent 5af34ee8a3
commit 03e8e2f9c8
12 changed files with 212 additions and 13 deletions
+74 -1
View File
@@ -13348,7 +13348,7 @@ doc/{bash.1,bashref.texi}
---
lib/readline/display.c
- update_line: completely rewrote the code that handles line wrapping
in the presence of multibyte/double-width characters; punts toa
in the presence of multibyte/double-width characters; punts to a
dumb update in cases where the number of screen positions doesn't
match
- update_line: in one case, where we are deleting characters from the
@@ -14458,3 +14458,76 @@ subst.c
overflow when allocating large pieces of memory. Report and fix
from Siteshwar Vashisht <svashisht@redhat.com>, originally based on
http://lists.gnu.org/archive/html/bug-bash/2017-11/msg00047.html
11/24
-----
lib/readline/bind.c
- rl_empty_keymap: new public function, returns non-zero if there are
no keys bound in the keymap passed as an argument
lib/readline/readline.h
- rl_empty_keymap: new public extern declaration
lib/readline/doc/rltech.texi
- rl_empty_keymap: document new function
lib/readline/bind.c
- rl_generic_bind: keep track of the previous keymap and previous
index in a multi-key key sequence so we can remove an empty terminal
keymap and remove a previous override to ANYOTHERKEY. Right now,
this only works for one previous keymap level. Inspired by a report
from Clark Wang <dearvoid@gmail.com>
11/25
-----
lib/readline/display.c
- _rl_update_final: make sure that computing the length of the visible
bottom line (botline_length) takes any invisible characters in the
prompt into account (woff). This value is used as part of the check
whether or not we want to remove the line-wrapping indicator on
terminals like xterm
- _rl_update_final: when removing the line-wrapping indicator on xterm,
make sure we take invisible characters in the prompt (woff) into
account when computing the character in the rightmost physical
screen position. Fixes cosmetic line-wrapping issue reported by
Egmont Koblinger <egmont@gmail.com>
11/27
-----
lib/sh/ufuncs.c
- fsleep: if using select to implement sleep, use restart after
a signal interrupts the select and handle pending signals. If
pselect is available, use that instead and block SIGCHLD while
pselect is executing.
Fixes report from Thiruvadi Rajaraman <trajaraman@mvista.com>
11/28
-----
lib/readline/signals.c
- rl_check_signals: new public function: a wrapper for RL_CHECK_SIGNALS
that can be used by applications that install a wrapper for
rl_getc (rl_getc_function) so they can respond to signals that
arrive while waiting for input in the same way as rl_getc. The app
can use rl_pending_signal() to get the most recently-received
signal. From a discussion about Gnuplot initiated by
Rin Okuyama <rokuyama@rk.phys.keio.ac.jp>
lib/readline/readline.h
- rl_check_signals: new extern declaration
lib/readline/doc/rltech.texi
- rl_check_signals: document new public function
variables.c
- set_pwd: test for and force an inherited OLDPWD to be a directory
if OLDPWD_CHECK_DIRECTORY is defined in config-top.h (it is by
default). Issue raised by Mikulas Patocka <mikulas@twibright.com>
config-top.h
- OLDPWD_CHECK_DIRECTORY: new define, defined to 1 by default
11/29
-----
Makefile.in
- pathexp.o: add dependencies on libintl.h. Reported by
Ross Burton <ross@burtonini.com>
+1
View File
@@ -1293,6 +1293,7 @@ mailcheck.o: bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
make_cmd.o: bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
nojobs.o: bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
y.tab.o: bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
pathexp.o: bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
pcomplete.o: bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
pcomplib.o: bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
print_cmd.o: bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
+4
View File
@@ -165,3 +165,7 @@
/* Define to use libc mktemp/mkstemp instead of replacements in lib/sh/tmpfile.c */
#define USE_MKTEMP
#define USE_MKSTEMP
/* Define to force the value of OLDPWD inherited from the environment to be a
directory */
#define OLDPWD_CHECK_DIRECTORY 1
+34 -2
View File
@@ -325,9 +325,10 @@ int
rl_generic_bind (int type, const char *keyseq, char *data, Keymap map)
{
char *keys;
int keys_len;
int keys_len, prevkey;
register int i;
KEYMAP_ENTRY k;
Keymap prevmap;
k.function = 0;
@@ -350,12 +351,17 @@ rl_generic_bind (int type, const char *keyseq, char *data, Keymap map)
return -1;
}
prevmap = map;
prevkey = keys[0];
/* Bind keys, making new keymaps as necessary. */
for (i = 0; i < keys_len; i++)
{
unsigned char uc = keys[i];
int ic;
prevkey = ic;
ic = uc;
if (ic < 0 || ic >= KEYMAP_SIZE)
{
@@ -367,7 +373,10 @@ rl_generic_bind (int type, const char *keyseq, char *data, Keymap map)
{
ic = UNMETA (ic);
if (map[ESC].type == ISKMAP)
map = FUNCTION_TO_KEYMAP (map, ESC);
{
prevmap = map;
map = FUNCTION_TO_KEYMAP (map, ESC);
}
}
if ((i + 1) < keys_len)
@@ -386,6 +395,7 @@ rl_generic_bind (int type, const char *keyseq, char *data, Keymap map)
map[ic].type = ISKMAP;
map[ic].function = KEYMAP_TO_FUNCTION (rl_make_bare_keymap());
}
prevmap = map;
map = FUNCTION_TO_KEYMAP (map, ic);
/* The dispatch code will return this function if no matching
key sequence is found in the keymap. This (with a little
@@ -405,6 +415,7 @@ rl_generic_bind (int type, const char *keyseq, char *data, Keymap map)
xfree ((char *)map[ic].function);
else if (map[ic].type == ISKMAP)
{
prevmap = map;
map = FUNCTION_TO_KEYMAP (map, ic);
ic = ANYOTHERKEY;
/* If we're trying to override a keymap with a null function
@@ -421,7 +432,28 @@ rl_generic_bind (int type, const char *keyseq, char *data, Keymap map)
}
rl_binding_keymap = map;
}
/* If we unbound a key (type == ISFUNC, data == 0), and the prev keymap
points to the keymap where we unbound the key (sanity check), and the
current binding keymap is empty (rl_empty_keymap() returns non-zero),
and the binding keymap has ANYOTHERKEY set with type == ISFUNC
(overridden function), delete the now-empty keymap, take the previously-
overridden function and remove the override. */
/* Right now, this only works one level back. */
if (type == ISFUNC && data == 0 &&
prevmap[prevkey].type == ISKMAP &&
(FUNCTION_TO_KEYMAP(prevmap, prevkey) == rl_binding_keymap) &&
rl_binding_keymap[ANYOTHERKEY].type == ISFUNC &&
rl_empty_keymap (rl_binding_keymap))
{
prevmap[prevkey].type = rl_binding_keymap[ANYOTHERKEY].type;
prevmap[prevkey].function = rl_binding_keymap[ANYOTHERKEY].function;
rl_discard_keymap (rl_binding_keymap);
rl_binding_keymap = prevmap;
}
xfree (keys);
return 0;
}
+12 -5
View File
@@ -2938,7 +2938,7 @@ delete_chars (int count)
void
_rl_update_final (void)
{
int full_lines;
int full_lines, woff, botline_length;
full_lines = 0;
/* If the cursor is the only thing on an otherwise-blank last line,
@@ -2950,16 +2950,23 @@ _rl_update_final (void)
full_lines = 1;
}
_rl_move_vert (_rl_vis_botlin);
woff = W_OFFSET(_rl_vis_botlin, wrap_offset);
botline_length = VIS_LLEN(_rl_vis_botlin) - woff;
/* If we've wrapped lines, remove the final xterm line-wrap flag. */
if (full_lines && _rl_term_autowrap && (VIS_LLEN(_rl_vis_botlin) == _rl_screenwidth))
if (full_lines && _rl_term_autowrap && botline_length == _rl_screenwidth)
{
char *last_line;
last_line = &visible_line[vis_lbreaks[_rl_vis_botlin]];
/* LAST_LINE includes invisible characters, so if you want to get the
last character of the first line, you have to take WOFF into account.
This needs to be done for both calls to _rl_move_cursor_relative,
which takes a buffer position as the first argument, and any direct
subscripts of LAST_LINE. */
last_line = &visible_line[vis_lbreaks[_rl_vis_botlin]]; /* = VIS_CHARS(_rl_vis_botlin); */
cpos_buffer_position = -1; /* don't know where we are in buffer */
_rl_move_cursor_relative (_rl_screenwidth - 1, last_line); /* XXX */
_rl_move_cursor_relative (_rl_screenwidth - 1 + woff, last_line); /* XXX */
_rl_clear_to_eol (0);
putc (last_line[_rl_screenwidth - 1], rl_outstream);
putc (last_line[_rl_screenwidth - 1 + woff], rl_outstream);
}
_rl_vis_botlin = 0;
rl_crlf ();
+18
View File
@@ -694,6 +694,11 @@ Free all storage associated with @var{keymap}. This calls
@code{rl_discard_keymap} to free subordindate keymaps and macros.
@end deftypefun
@deftypefun int rl_empty_keymap (Keymap keymap)
Return non-zero if there are no keys bound to functions in @var{keymap};
zero if there are any keys bound.
@end deftypefun
Readline has several internal keymaps. These functions allow you to
change which keymap is active.
@@ -1685,6 +1690,19 @@ handlers, depending on the values of @code{rl_catch_signals} and
@code{rl_catch_sigwinch}.
@end deftypefun
If an application wants to force Readline to handle any signals that
have arrived while it has been executing, @code{rl_check_signals()}
will call Readline's internal signal handler if there are any pending
signals. This is primarily intended for those applications that use
a custom @code{rl_getc_function} (@pxref{Readline Variables}) and wish
to handle signals received while waiting for input.
@deftypefun void rl_check_signals (void)
If there are any pending signals, call Readline's internal signal handling
functions to process them. @code{rl_pending_signal()} can be used independently
to determine whether or not there are any pending signals.
@end deftypefun
If an application does not wish Readline to catch @code{SIGWINCH}, it may
call @code{rl_resize_terminal()} or @code{rl_set_screen_size()} to force
Readline to update its idea of the terminal size when a @code{SIGWINCH}
+3 -3
View File
@@ -4,7 +4,7 @@ Copyright (C) 1988-2017 Free Software Foundation, Inc.
@set EDITION 7.0
@set VERSION 7.0
@set UPDATED 8 October 2017
@set UPDATED-MONTH October 2017
@set UPDATED 28 November 2017
@set UPDATED-MONTH November 2017
@set LASTCHANGE Sun Oct 8 11:44:33 EDT 2017
@set LASTCHANGE Tue Nov 28 10:14:48 PST 2017
+15
View File
@@ -77,6 +77,21 @@ rl_make_bare_keymap (void)
return (keymap);
}
/* A convenience function that returns 1 if there are no keys bound to
functions in KEYMAP */
int
rl_empty_keymap (Keymap keymap)
{
int i;
for (i = 0; i < ANYOTHERKEY; i++)
{
if (keymap[i].type != ISFUNC || keymap[i].function)
return 0;
}
return 1;
}
/* Return a new keymap which is a copy of MAP. Just copies pointers, does
not copy text of macros or descend into child keymaps. */
Keymap
+2
View File
@@ -346,6 +346,7 @@ extern int rl_parse_and_bind PARAMS((char *));
/* Functions for manipulating keymaps. */
extern Keymap rl_make_bare_keymap PARAMS((void));
extern int rl_empty_keymap PARAMS((Keymap));
extern Keymap rl_copy_keymap PARAMS((Keymap));
extern Keymap rl_make_keymap PARAMS((void));
extern void rl_discard_keymap PARAMS((Keymap));
@@ -447,6 +448,7 @@ extern void rl_reset_after_signal PARAMS((void));
extern void rl_free_line_state PARAMS((void));
extern int rl_pending_signal PARAMS((void));
extern void rl_check_signals PARAMS((void));
extern void rl_echo_signal_char PARAMS((int));
+6
View File
@@ -595,6 +595,12 @@ rl_pending_signal (void)
{
return (_rl_caught_signal);
}
void
rl_check_signals (void)
{
RL_CHECK_SIGNALS ();
}
#endif /* HANDLE_SIGNALS */
/* **************************************************************** */
+39 -2
View File
@@ -37,8 +37,16 @@
#include <unistd.h>
#endif
#include <errno.h>
#if !defined (errno)
extern int errno;
#endif /* !errno */
#if defined (HAVE_SELECT)
# include "posixselect.h"
# include "quit.h"
# include "trap.h"
# include "stat-time.h"
#endif
/* A version of `alarm' using setitimer if it's available. */
@@ -84,17 +92,46 @@ falarm (secs, usecs)
/* A version of sleep using fractional seconds and select. I'd like to use
`usleep', but it's already taken */
#if defined (HAVE_TIMEVAL) && defined (HAVE_SELECT)
#if defined (HAVE_TIMEVAL) && (defined (HAVE_SELECT) || defined (HAVE_PSELECT))
int
fsleep(sec, usec)
unsigned int sec, usec;
{
int e, r;
#if defined (HAVE_PSELECT)
sigset_t blocked_sigs;
struct timespec ts;
#else
struct timeval tv;
#endif
#if defined (HAVE_PSELECT)
sigemptyset (&blocked_sigs);
# if defined (SIGCHLD)
sigaddset (&blocked_sigs, SIGCHLD);
# endif
ts.tv_sec = sec;
ts.tv_nsec = usec * 1000;
#else
tv.tv_sec = sec;
tv.tv_usec = usec;
#endif /* !HAVE_PSELECT */
return select(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &tv);
do
{
#if defined (HAVE_PSELECT)
r = pselect(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &ts, &blocked_sigs);
#else
r = select(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &tv);
#endif
e = errno;
if (r < 0 && errno == EINTR)
QUIT; /* just signals, no traps */
errno = e;
}
while (r < 0 && errno == EINTR);
return r;
}
#else /* !HAVE_TIMEVAL || !HAVE_SELECT */
int
+4
View File
@@ -886,7 +886,11 @@ set_pwd ()
don't find OLDPWD in the environment, or it doesn't name a directory,
make a dummy invisible variable for OLDPWD, and mark it as exported. */
temp_var = find_variable ("OLDPWD");
#if defined (OLDPWD_CHECK_DIRECTORY)
if (temp_var == 0 || value_cell (temp_var) == 0 || file_isdir (value_cell (temp_var)) == 0)
#else
if (temp_var == 0 || value_cell (temp_var) == 0)
#endif
{
temp_var = bind_variable ("OLDPWD", (char *)NULL, 0);
VSETATTR (temp_var, (att_exported | att_invisible));