aboutsummaryrefslogtreecommitdiff
path: root/readline/histexpand.c
diff options
context:
space:
mode:
Diffstat (limited to 'readline/histexpand.c')
-rw-r--r--readline/histexpand.c83
1 files changed, 39 insertions, 44 deletions
diff --git a/readline/histexpand.c b/readline/histexpand.c
index fc13303..8fb3798 100644
--- a/readline/histexpand.c
+++ b/readline/histexpand.c
@@ -1,6 +1,6 @@
/* histexpand.c -- history expansion. */
-/* Copyright (C) 1989-2012 Free Software Foundation, Inc.
+/* Copyright (C) 1989-2010 Free Software Foundation, Inc.
This file contains the GNU History Library (History), a set of
routines for managing the text of previously typed lines.
@@ -50,7 +50,6 @@
#define HISTORY_WORD_DELIMITERS " \t\n;&()|<>"
#define HISTORY_QUOTE_CHARACTERS "\"'`"
-#define HISTORY_EVENT_DELIMITERS "^$*%-"
#define slashify_in_quotes "\\`\"$"
@@ -63,10 +62,6 @@ static char *subst_rhs;
static int subst_lhs_len;
static int subst_rhs_len;
-/* Characters that delimit history event specifications and separate event
- specifications from word designators. Static for now */
-static char *history_event_delimiter_chars = HISTORY_EVENT_DELIMITERS;
-
static char *get_history_word_specifier PARAMS((char *, char *, int *));
static int history_tokenize_word PARAMS((const char *, int));
static char **history_tokenize_internal PARAMS((const char *, int, int *));
@@ -117,6 +112,7 @@ rl_linebuf_func_t *history_inhibit_expansion_function;
/* The last string searched for by a !?string? search. */
static char *search_string;
+
/* The last string matched by a !?string? search. */
static char *search_match;
@@ -229,7 +225,6 @@ get_history_event (string, caller_index, delimiting_quote)
#endif /* HANDLE_MULTIBYTE */
if ((!substring_okay && (whitespace (c) || c == ':' ||
- (history_event_delimiter_chars && member (c, history_event_delimiter_chars)) ||
(history_search_delimiter_chars && member (c, history_search_delimiter_chars)) ||
string[i] == delimiting_quote)) ||
string[i] == '\n' ||
@@ -277,8 +272,6 @@ get_history_event (string, caller_index, delimiting_quote)
if (local_index == 0 || substring_okay)
{
entry = current_history ();
- if (entry == 0)
- FAIL_SEARCH ();
history_offset = history_length;
/* If this was a substring search, then remember the
@@ -526,9 +519,9 @@ postproc_subst_rhs ()
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, qc, end_index_ptr, ret_string, current_line)
+history_expand_internal (string, start, end_index_ptr, ret_string, current_line)
char *string;
- int start, qc, *end_index_ptr;
+ int start, *end_index_ptr;
char **ret_string;
char *current_line; /* for !# */
{
@@ -564,7 +557,30 @@ history_expand_internal (string, start, qc, end_index_ptr, ret_string, current_l
event = current_line;
}
else
- event = get_history_event (string, &i, qc);
+ {
+ 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);
+ }
if (event == 0)
{
@@ -838,7 +854,7 @@ history_expand_internal (string, start, qc, end_index_ptr, ret_string, current_l
}
i += 2;
}
- /* Done with modifiers. */
+ /* Done with modfiers. */
/* Believe it or not, we have to back the pointer up by one. */
--i;
@@ -878,7 +894,7 @@ history_expand_internal (string, start, qc, end_index_ptr, ret_string, current_l
1) If expansions did take place
2) If the `p' modifier was given and the caller should print the result
- If an error occurred in expansion, then OUTPUT contains a descriptive
+ If an error ocurred in expansion, then OUTPUT contains a descriptive
error message. */
#define ADD_STRING(s) \
@@ -912,7 +928,7 @@ history_expand (hstring, output)
char **output;
{
register int j;
- int i, r, l, passc, cc, modified, eindex, only_printing, dquote, squote, flag;
+ int i, r, l, passc, cc, modified, eindex, only_printing, dquote, flag;
char *string;
/* The output string, and its length. */
@@ -975,7 +991,7 @@ history_expand (hstring, output)
/* `!' followed by one of the characters in history_no_expand_chars
is NOT an expansion. */
- for (i = dquote = squote = 0; string[i]; i++)
+ for (i = dquote = 0; string[i]; i++)
{
#if defined (HANDLE_MULTIBYTE)
if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
@@ -996,7 +1012,6 @@ history_expand (hstring, output)
history expansion performed on it.
Skip the rest of the line and break out of the loop. */
if (history_comment_char && string[i] == history_comment_char &&
- dquote == 0 &&
(i == 0 || member (string[i - 1], history_word_delimiters)))
{
while (string[i])
@@ -1007,13 +1022,6 @@ history_expand (hstring, output)
{
if (cc == 0 || member (cc, history_no_expand_chars))
continue;
- /* DQUOTE won't be set unless history_quotes_inhibit_expansion
- is set. The idea here is to treat double-quoted strings the
- same as the word outside double quotes; in effect making the
- double quote part of history_no_expand_chars when DQUOTE is
- set. */
- else if (dquote && cc == '"')
- continue;
/* If the calling application has set
history_inhibit_expansion_function to a function that checks
for special cases that should not be history expanded,
@@ -1063,9 +1071,9 @@ history_expand (hstring, output)
}
/* Extract and perform the substitution. */
- for (passc = dquote = squote = i = j = 0; i < l; i++)
+ for (passc = dquote = i = j = 0; i < l; i++)
{
- int qc, tchar = string[i];
+ int tchar = string[i];
if (passc)
{
@@ -1122,14 +1130,8 @@ history_expand (hstring, output)
case '\'':
{
/* If history_quotes_inhibit_expansion is set, single quotes
- 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)
+ inhibit history expansion. */
+ if (dquote == 0 && history_quotes_inhibit_expansion)
{
int quote, slen;
@@ -1144,19 +1146,13 @@ history_expand (hstring, output)
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;
}
case -2: /* history_comment_char */
- if ((dquote == 0 || history_quotes_inhibit_expansion == 0) &&
- (i == 0 || member (string[i - 1], history_word_delimiters)))
+ if (i == 0 || member (string[i - 1], history_word_delimiters))
{
temp = (char *)xmalloc (l - i + 1);
strcpy (temp, string + i);
@@ -1175,7 +1171,6 @@ history_expand (hstring, output)
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]);
@@ -1201,8 +1196,8 @@ history_expand (hstring, output)
break;
}
#endif
- qc = squote ? '\'' : (dquote ? '"' : 0);
- r = history_expand_internal (string, i, qc, &eindex, &temp, result);
+
+ r = history_expand_internal (string, i, &eindex, &temp, result);
if (r < 0)
{
*output = temp;