From: Chet Ramey Date: Wed, 13 Jan 2016 20:22:04 +0000 (-0500) Subject: commit readline-20160108 snapshot X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2262e1a92a9a02d3d3647dfca53b93a06ba10192;p=thirdparty%2Freadline.git commit readline-20160108 snapshot --- diff --git a/bind.c b/bind.c index f88e5aa..77c594a 100644 --- a/bind.c +++ b/bind.c @@ -74,8 +74,13 @@ Keymap rl_binding_keymap; static int _rl_skip_to_delim PARAMS((char *, int, int)); +#if defined (USE_VARARGS) && defined (PREFER_STDARG) +static void _rl_init_file_error (const char *, ...) __attribute__((__format__ (printf, 1, 2))); +#else +static void _rl_init_file_error (); +#endif + static char *_rl_read_file PARAMS((char *, size_t *)); -static void _rl_init_file_error PARAMS((const char *)); static int _rl_read_init_file PARAMS((const char *, int)); static int glean_key_from_name PARAMS((char *)); @@ -989,14 +994,35 @@ _rl_read_init_file (filename, include_level) } static void -_rl_init_file_error (msg) - const char *msg; +#if defined (PREFER_STDARG) +_rl_init_file_error (const char *format, ...) +#else +_rl_init_file_error (va_alist) + va_dcl +#endif { + va_list args; +#if defined (PREFER_VARARGS) + char *format; +#endif + +#if defined (PREFER_STDARG) + va_start (args, format); +#else + va_start (args); + format = va_arg (args, char *); +#endif + + fprintf (stderr, "readline: "); if (currently_reading_init_file) - _rl_errmsg ("%s: line %d: %s\n", current_readline_init_file, - current_readline_init_lineno, msg); - else - _rl_errmsg ("%s", msg); + fprintf (stderr, "%s: line %d: ", current_readline_init_file, + current_readline_init_lineno); + + vfprintf (stderr, format, args); + fprintf (stderr, "\n"); + fflush (stderr); + + va_end (args); } /* **************************************************************** */ @@ -1216,7 +1242,7 @@ handle_parser_directive (statement) } /* display an error message about the unknown parser directive */ - _rl_init_file_error ("unknown parser directive"); + _rl_init_file_error ("%s: unknown parser directive", directive); return (1); } @@ -1262,7 +1288,7 @@ rl_parse_and_bind (string) { char *funname, *kname; register int c, i; - int key, equivalency; + int key, equivalency, foundmod; while (string && whitespace (*string)) string++; @@ -1292,7 +1318,7 @@ rl_parse_and_bind (string) /* If we didn't find a closing quote, abort the line. */ if (string[i] == '\0') { - _rl_init_file_error ("no closing `\"' in key binding"); + _rl_init_file_error ("%s: no closing `\"' in key binding", string); return 1; } else @@ -1449,11 +1475,24 @@ remove_trailing: key = glean_key_from_name (kname); /* Add in control and meta bits. */ + foundmod = 0; if (substring_member_of_array (string, _rl_possible_control_prefixes)) - key = CTRL (_rl_to_upper (key)); + { + key = CTRL (_rl_to_upper (key)); + foundmod = 1; + } if (substring_member_of_array (string, _rl_possible_meta_prefixes)) - key = META (key); + { + key = META (key); + foundmod = 1; + } + + if (foundmod == 0 && kname != string) + { + _rl_init_file_error ("%s: unknown key modifier", string); + return 1; + } /* Temporary. Handle old-style keyname with macro-binding. */ if (*funname == '\'' || *funname == '"') @@ -1480,6 +1519,7 @@ remove_trailing: #endif /* PREFIX_META_HACK */ else rl_bind_key (key, rl_named_function (funname)); + return 0; } @@ -1681,10 +1721,14 @@ rl_variable_bind (name, value) i = find_string_var (name); - /* For the time being, unknown variable names or string names without a - handler function are simply ignored. */ + /* For the time being, string names without a handler function are simply + ignored. */ if (i < 0 || string_varlist[i].set_func == 0) - return 0; + { + if (i < 0) + _rl_init_file_error ("%s: unknown variable name", name); + return 0; + } v = (*string_varlist[i].set_func) (value); return v; diff --git a/display.c b/display.c index 2ad30fc..f261933 100644 --- a/display.c +++ b/display.c @@ -1,6 +1,6 @@ /* display.c -- readline redisplay facility. */ -/* Copyright (C) 1987-2013 Free Software Foundation, Inc. +/* Copyright (C) 1987-2015 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. diff --git a/doc/hsuser.texi b/doc/hsuser.texi index dcd8dae..c45001b 100644 --- a/doc/hsuser.texi +++ b/doc/hsuser.texi @@ -102,7 +102,7 @@ associated with each history entry is written to the history file, marked with the history comment character. When the history file is read, lines beginning with the history comment character followed immediately by a digit are interpreted -as timestamps for the previous history line. +as timestamps for the following history entry. The builtin command @code{fc} may be used to list or edit and re-execute a portion of the history list. diff --git a/doc/rluser.texi b/doc/rluser.texi index 6465895..a8f7d45 100644 --- a/doc/rluser.texi +++ b/doc/rluser.texi @@ -608,8 +608,9 @@ Acceptable @code{keymap} names are @code{vi-move}, @code{vi-command}, and @code{vi-insert}. -@code{vi} is equivalent to @code{vi-command}; @code{emacs} is -equivalent to @code{emacs-standard}. The default value is @code{emacs}. +@code{vi} is equivalent to @code{vi-command} (@code{vi-move} is also a +synonym); @code{emacs} is equivalent to @code{emacs-standard}. +The default value is @code{emacs}. The value of the @code{editing-mode} variable also affects the default keymap. diff --git a/histexpand.c b/histexpand.c index fc13303..fdecebc 100644 --- a/histexpand.c +++ b/histexpand.c @@ -1,6 +1,6 @@ /* histexpand.c -- history expansion. */ -/* Copyright (C) 1989-2012 Free Software Foundation, Inc. +/* Copyright (C) 1989-2015 Free Software Foundation, Inc. This file contains the GNU History Library (History), a set of routines for managing the text of previously typed lines. diff --git a/histfile.c b/histfile.c index 860653f..30d44a8 100644 --- a/histfile.c +++ b/histfile.c @@ -107,9 +107,19 @@ extern int errno; # define PATH_MAX 1024 /* default */ #endif +extern void _hs_append_history_line PARAMS((int, const char *)); + +/* history file version; currently unused */ +int history_file_version = 1; + /* If non-zero, we write timestamps to the history file in history_do_write() */ int history_write_timestamps = 0; +/* If non-zero, we assume that a history file that starts with a timestamp + uses timestamp-delimited entries and can include multi-line history + entries. Used by read_history_range */ +int history_multiline_entries = 0; + /* Immediately after a call to read_history() or read_history_range(), this will return the number of lines just read from the history file in that call. */ @@ -259,7 +269,7 @@ read_history_range (filename, from, to) { register char *line_start, *line_end, *p; char *input, *buffer, *bufend, *last_ts; - int file, current_line, chars_read; + int file, current_line, chars_read, has_timestamps, reset_comment_char; struct stat finfo; size_t file_size; #if defined (EFBIG) @@ -336,6 +346,19 @@ read_history_range (filename, from, to) bufend = buffer + chars_read; current_line = 0; + /* Heuristic: the history comment character rarely changes, so assume we + have timestamps if the buffer starts with `#[:digit:]' and temporarily + set history_comment_char so timestamp parsing works right */ + reset_comment_char = 0; + if (history_comment_char == '\0' && buffer[0] == '#' && isdigit ((unsigned char)buffer[1])) + { + history_comment_char = '#'; + reset_comment_char = 1; + } + + has_timestamps = HIST_TIMESTAMP_START (buffer); + history_multiline_entries += has_timestamps && history_write_timestamps; + /* Skip lines until we are at FROM. */ for (line_start = line_end = buffer; line_end < bufend && current_line < from; line_end++) if (*line_end == '\n') @@ -362,7 +385,10 @@ read_history_range (filename, from, to) { if (HIST_TIMESTAMP_START(line_start) == 0) { - add_history (line_start); + if (last_ts == NULL && history_multiline_entries) + _hs_append_history_line (history_length - 1, line_start); + else + add_history (line_start); if (last_ts) { add_history_time (last_ts); @@ -385,6 +411,8 @@ read_history_range (filename, from, to) } history_lines_read_from_file = current_line; + if (reset_comment_char) + history_comment_char = '\0'; FREE (input); #ifndef HISTORY_USE_MMAP diff --git a/history.c b/history.c index 216b2a5..3b8dbc5 100644 --- a/history.c +++ b/history.c @@ -1,6 +1,6 @@ /* history.c -- standalone history library */ -/* Copyright (C) 1989-2011 Free Software Foundation, Inc. +/* Copyright (C) 1989-2015 Free Software Foundation, Inc. This file contains the GNU History Library (History), a set of routines for managing the text of previously typed lines. @@ -407,6 +407,30 @@ replace_history_entry (which, line, data) return (old_value); } +/* Append LINE to the history line at offset WHICH, adding a newline to the + end of the current line first. This can be used to construct multi-line + history entries while reading lines from the history file. */ +void +_hs_append_history_line (which, line) + int which; + const char *line; +{ + HIST_ENTRY *hent; + size_t newlen, curlen; + char *newline; + + hent = the_history[which]; + curlen = strlen (hent->line); + newlen = curlen + strlen (line) + 2; + newline = realloc (hent->line, newlen); + if (newline) + { + hent->line = newline; + hent->line[curlen++] = '\n'; + strcpy (hent->line + curlen, line); + } +} + /* Replace the DATA in the specified history entries, replacing OLD with NEW. WHICH says which one(s) to replace: WHICH == -1 means to replace all of the history entries where entry->data == OLD; WHICH == -2 means diff --git a/history.h b/history.h index b79e51f..8ce7c80 100644 --- a/history.h +++ b/history.h @@ -1,6 +1,6 @@ /* history.h -- the names of functions that you can call in history. */ -/* Copyright (C) 1989-2009 Free Software Foundation, Inc. +/* Copyright (C) 1989-2015 Free Software Foundation, Inc. This file contains the GNU History Library (History), a set of routines for managing the text of previously typed lines. @@ -263,6 +263,10 @@ extern int history_quotes_inhibit_expansion; extern int history_write_timestamps; +/* These two are undocumented; the second is reserved for future use */ +extern int history_multiline_entries; +extern int history_file_version; + /* Backwards compatibility */ extern int max_input_history; diff --git a/isearch.c b/isearch.c index 0eb5259..819fcbc 100644 --- a/isearch.c +++ b/isearch.c @@ -6,7 +6,7 @@ /* */ /* **************************************************************** */ -/* Copyright (C) 1987-2012 Free Software Foundation, Inc. +/* Copyright (C) 1987-2015 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. diff --git a/util.c b/util.c index aec4af5..4589c61 100644 --- a/util.c +++ b/util.c @@ -1,6 +1,6 @@ /* util.c -- readline utility functions */ -/* Copyright (C) 1987-2012 Free Software Foundation, Inc. +/* Copyright (C) 1987-2015 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.