lib/sh/{clktck,fpurge,inet_aton,mailstat,oslib,pathcanon,pathphys,spell,strerror}.c
- make inclusion of <sys/param.h> dependent on HAVE_SYS_PARAM_H
consistently
+
+ 8/6
+ ---
+lib/readline/histexpand.c
+ - history_expand_internal: now takes an additional argument saying
+ whether the history expansion occurs within a quoted string, set to
+ the open quote character
+ - history_expand_internal: use new argument instead of checking prev
+ char and initializing quoted_search_delimiter, pass qc directly to
+ get_history_event, where it allows a matching quote to terminate a
+ string defining an event
+ - history_expand: change single-quote handling code so that if
+ history_quotes_inhibit_expansion is 0, single quotes are treated
+ like double quotes
+ - history_expand: change call to history_expand_internal to pass new
+ argument of `"' if double-quoted string, `'' if single-quoted string;
+ this lets history_expand decide what is a quoted string and what
+ is not
+
+ 8/7
+ ---
+configure.in
+ - AC_CANONICAL_BUILD: invoke for later use
+
+lib/readline/macro.c
+ - _rl_prev_macro_key: new function, inverse of _rl_next_macro_key:
+ backs up the index into the current macro by 1
+
+lib/readline/rlprivate.h
+ - _rl_prev_macro_key: extern declaration
+
+
+lib/readline/readline.c
+ - _rl_dispatch_subseq, _rl_subseq_result: don't call _rl_unget_char
+ if we're currently reading from a macro; call _rl_prev_macro_key
+ instead. Fixes bug reported by Clark Wang <clark.wang@oracle.com>
/* histexpand.c -- history expansion. */
-/* Copyright (C) 1989-2010 Free Software Foundation, Inc.
+/* Copyright (C) 1989-2012 Free Software Foundation, Inc.
This file contains the GNU History Library (History), a set of
routines for managing the text of previously typed lines.
the returned string. Returns the new index into string in
*END_INDEX_PTR, and the expanded specifier in *RET_STRING. */
static int
-history_expand_internal (string, start, end_index_ptr, ret_string, current_line)
+history_expand_internal (string, start, qc, end_index_ptr, ret_string, current_line)
char *string;
- int start, *end_index_ptr;
+ int start, qc, *end_index_ptr;
char **ret_string;
char *current_line; /* for !# */
{
event = current_line;
}
else
- {
- int quoted_search_delimiter = 0;
-
- /* If the character before this `!' is a double or single
- quote, then this expansion takes place inside of the
- quoted string. If we have to search for some text ("!foo"),
- allow the delimiter to end the search string. */
-#if defined (HANDLE_MULTIBYTE)
- if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
- {
- int ch, l;
- l = _rl_find_prev_mbchar (string, i, MB_FIND_ANY);
- ch = string[l];
- /* XXX - original patch had i - 1 ??? If i == 0 it would fail. */
- if (i && (ch == '\'' || ch == '"'))
- quoted_search_delimiter = ch;
- }
- else
-#endif /* HANDLE_MULTIBYTE */
- if (i && (string[i - 1] == '\'' || string[i - 1] == '"'))
- quoted_search_delimiter = string[i - 1];
-
- event = get_history_event (string, &i, quoted_search_delimiter);
- }
+ event = get_history_event (string, &i, qc);
if (event == 0)
{
char **output;
{
register int j;
- int i, r, l, passc, cc, modified, eindex, only_printing, dquote, flag;
+ int i, r, l, passc, cc, modified, eindex, only_printing, dquote, squote, flag;
char *string;
/* The output string, and its length. */
/* `!' followed by one of the characters in history_no_expand_chars
is NOT an expansion. */
- for (i = dquote = 0; string[i]; i++)
+ for (i = dquote = squote = 0; string[i]; i++)
{
#if defined (HANDLE_MULTIBYTE)
if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
}
/* Extract and perform the substitution. */
- for (passc = dquote = i = j = 0; i < l; i++)
+ for (passc = dquote = squote = i = j = 0; i < l; i++)
{
- int tchar = string[i];
+ int qc, tchar = string[i];
if (passc)
{
case '\'':
{
/* If history_quotes_inhibit_expansion is set, single quotes
- inhibit history expansion. */
- if (dquote == 0 && history_quotes_inhibit_expansion)
+ inhibit history expansion, otherwise they are treated like
+ double quotes. */
+ if (squote)
+ {
+ squote = 0;
+ ADD_CHAR (tchar);
+ }
+ else if (dquote == 0 && history_quotes_inhibit_expansion)
{
int quote, slen;
ADD_STRING (temp);
xfree (temp);
}
+ else if (dquote == 0 && squote == 0 && history_quotes_inhibit_expansion == 0)
+ {
+ squote = 1;
+ ADD_CHAR (string[i]);
+ }
else
ADD_CHAR (string[i]);
break;
characters in history_no_expand_chars, then it is not a
candidate for expansion of any kind. */
if (cc == 0 || member (cc, history_no_expand_chars) ||
+ (dquote && cc == '"') ||
(history_inhibit_expansion_function && (*history_inhibit_expansion_function) (string, i)))
{
ADD_CHAR (string[i]);
break;
}
#endif
-
- r = history_expand_internal (string, i, &eindex, &temp, result);
+ qc = squote ? '\'' : (dquote ? '"' : 0);
+ r = history_expand_internal (string, i, qc, &eindex, &temp, result);
if (r < 0)
{
*output = temp;
/* OK, there's no function bound in this map, but there is a
shadow function that was overridden when the current keymap
was created. Return -2 to note that. */
- _rl_unget_char (key);
+ if (RL_ISSTATE (RL_STATE_MACROINPUT))
+ _rl_prev_macro_key ();
+ else
+ _rl_unget_char (key);
return -2;
}
else if (got_subseq)
have a matching key, nor was one overridden. This means
we need to back up the recursion chain and find the last
subsequence that is bound to a function. */
- _rl_unget_char (key);
+ if (RL_ISSTATE (RL_STATE_MACROINPUT))
+ _rl_prev_macro_key ();
+ else
+ _rl_unget_char (key);
return -1;
}
else
/* We didn't match (r is probably -1), so return something to
tell the caller that it should try ANYOTHERKEY for an
overridden function. */
- _rl_unget_char (key);
+ if (RL_ISSTATE (RL_STATE_MACROINPUT))
+ _rl_prev_macro_key ();
+ else
+ _rl_unget_char (key);
_rl_dispatching_keymap = map;
return -2;
}
else if (r && got_subseq)
{
/* OK, back up the chain. */
- _rl_unget_char (key);
+ if (RL_ISSTATE (RL_STATE_MACROINPUT))
+ _rl_prev_macro_key ();
+ else
+ _rl_unget_char (key);
_rl_dispatching_keymap = map;
return -1;
}