Revert "Sync readline/ to version 7.0 alpha"
[deliverable/binutils-gdb.git] / readline / histexpand.c
index fc133036493d826d436c732b06ced22551202b29..8fb3798b7cafc5169b3beb761602b70a5299af42 100644 (file)
@@ -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;
This page took 0.034951 seconds and 4 git commands to generate.