Remove generated file.
[deliverable/binutils-gdb.git] / readline / search.c
index ea98c6f897577af7ff5a04705dc168d3f26194e2..6c76e1a1c966cd598f740c54b148dc1e95b65be8 100644 (file)
    is generally kept in a file called COPYING or LICENSE.  If you do not
    have a copy of the license, write to the Free Software Foundation,
    675 Mass Ave, Cambridge, MA 02139, USA. */
+#define READLINE_LIBRARY
 
+#if defined (HAVE_CONFIG_H)
+#  include <config.h>
+#endif
+
+#include <sys/types.h>
 #include <stdio.h>
 
-#if defined (__GNUC__)
-#  define alloca __builtin_alloca
+#if defined (HAVE_UNISTD_H)
+#  include <unistd.h>
+#endif
+
+#if defined (HAVE_STDLIB_H)
+#  include <stdlib.h>
 #else
-#  if defined (sparc) || defined (HAVE_ALLOCA_H)
-#    include <alloca.h>
-#  endif
+#  include "ansi_stdlib.h"
 #endif
 
+#include "rldefs.h"
 #include "readline.h"
 #include "history.h"
 
+#ifdef abs
+#  undef abs
+#endif
+#define abs(x)         (((x) >= 0) ? (x) : -(x))
+
 extern char *xmalloc (), *xrealloc ();
 
 /* Variables imported from readline.c */
 extern int rl_point, rl_end, rl_line_buffer_len;
-extern Keymap _rl_keymap;
+extern int rl_editing_mode;
 extern char *rl_prompt;
 extern char *rl_line_buffer;
 extern HIST_ENTRY *saved_line_for_history;
+extern Function *rl_last_func;
+
+/* Functions imported from the rest of the library. */
+extern int _rl_free_history_entry ();
+extern char *_rl_make_prompt_for_search ();
+extern void rl_extend_line_buffer ();
 
 static char *noninc_search_string = (char *) NULL;
-static int noninc_history_pos = 0;
+static int noninc_history_pos;
+static char *prev_line_found = (char *) NULL;
 
 /* Search the history list for STRING starting at absolute history position
    POS.  If STRING begins with `^', the search must match STRING at the
@@ -81,10 +102,10 @@ noninc_dosearch (string, dir)
      char *string;
      int dir;
 {
-  int oldpos, pos;
+  int oldpos, pos, line_len;
   HIST_ENTRY *entry;
 
-  if (string == 0 || *string == 0 || noninc_history_pos < 0)
+  if (string == 0 || *string == '\0' || noninc_history_pos < 0)
     {
       ding ();
       return;
@@ -106,16 +127,15 @@ noninc_dosearch (string, dir)
   oldpos = where_history ();
   history_set_pos (noninc_history_pos);
   entry = current_history ();
+#if defined (VI_MODE)
+  if (rl_editing_mode != vi_mode)
+#endif
   history_set_pos (oldpos);
 
-  {
-    int line_len;
-
-    line_len = strlen (entry->line);
-    if (line_len >= rl_line_buffer_len)
-      rl_extend_line_buffer (line_len);
-    strcpy (rl_line_buffer, entry->line);
-  }
+  line_len = strlen (entry->line);
+  if (line_len >= rl_line_buffer_len)
+    rl_extend_line_buffer (line_len);
+  strcpy (rl_line_buffer, entry->line);
 
   rl_undo_list = (UNDO_LIST *)entry->data;
   rl_end = strlen (rl_line_buffer);
@@ -123,7 +143,7 @@ noninc_dosearch (string, dir)
   rl_clear_message ();
 
   if (saved_line_for_history)
-    free_history_entry (saved_line_for_history);
+    _rl_free_history_entry (saved_line_for_history);
   saved_line_for_history = (HIST_ENTRY *)NULL;
 }
 
@@ -137,7 +157,7 @@ noninc_search (dir, pchar)
      int dir;
      int pchar;
 {
-  int saved_point, c, pmtlen;
+  int saved_point, c;
   char *p;
 
   maybe_save_line ();
@@ -147,14 +167,11 @@ noninc_search (dir, pchar)
   rl_line_buffer[0] = 0;
   rl_end = rl_point = 0;
 
-  pmtlen = (rl_prompt && *rl_prompt) ? strlen (rl_prompt) : 0;
-  p = (char *)alloca (2 + pmtlen);
-  if (pmtlen)
-    strcpy (p, rl_prompt);
-  p[pmtlen] = pchar ? pchar : ':';
-  p[pmtlen + 1]  = '\0';
-
+  p = _rl_make_prompt_for_search (pchar ? pchar : ':');
   rl_message (p, 0, 0);
+  free (p);
+
+#define SEARCH_RETURN rl_restore_prompt (); return
 
   /* Read the search string. */
   while (c = rl_read_key ())
@@ -168,13 +185,17 @@ noninc_search (dir, pchar)
              maybe_unsave_line ();
              rl_clear_message ();
              rl_point = saved_point;
-             return;
+             SEARCH_RETURN;
            }
-         /* FALLTHROUGH */
+         rl_rubout (1, c);
+         break;
 
        case CTRL('W'):
+         rl_unix_word_rubout (1, c);
+         break;
+
        case CTRL('U'):
-         rl_dispatch (c, _rl_keymap);
+         rl_unix_line_discard (1, c);
          break;
 
        case RETURN:
@@ -189,13 +210,13 @@ noninc_search (dir, pchar)
          rl_clear_message ();
          rl_point = saved_point;
          ding ();
-         return;
+         SEARCH_RETURN;
 
        default:
          rl_insert (1, c);
          break;
        }
-      rl_redisplay ();
+      (*rl_redisplay_function) ();
     }
 
  dosearch:
@@ -207,7 +228,7 @@ noninc_search (dir, pchar)
       if (!noninc_search_string)
        {
          ding ();
-         return;
+         SEARCH_RETURN;
        }
     }
   else
@@ -219,33 +240,33 @@ noninc_search (dir, pchar)
       noninc_search_string = savestring (rl_line_buffer);
     }
 
+  rl_restore_prompt ();
   noninc_dosearch (noninc_search_string, dir);
 }
 
 /* Search forward through the history list for a string.  If the vi-mode
    code calls this, KEY will be `?'. */
+int
 rl_noninc_forward_search (count, key)
      int count, key;
 {
-  if (key == '?')
-    noninc_search (1, '?');
-  else
-    noninc_search (1, 0);
+  noninc_search (1, (key == '?') ? '?' : 0);
+  return 0;
 }
 
 /* Reverse search the history list for a string.  If the vi-mode code
    calls this, KEY will be `/'. */
+int
 rl_noninc_reverse_search (count, key)
      int count, key;
 {
-  if (key == '/')
-    noninc_search (-1, '/');
-  else
-    noninc_search (-1, 0);
+  noninc_search (-1, (key == '/') ? '/' : 0);
+  return 0;
 }
 
 /* Search forward through the history list for the last string searched
    for.  If there is no saved search string, abort. */
+int
 rl_noninc_forward_search_again (count, key)
      int count, key;
 {
@@ -255,10 +276,12 @@ rl_noninc_forward_search_again (count, key)
       return (-1);
     }
   noninc_dosearch (noninc_search_string, 1);
+  return 0;
 }
 
 /* Reverse search in the history list for the last string searched
    for.  If there is no saved search string, abort. */
+int
 rl_noninc_reverse_search_again (count, key)
      int count, key;
 {
@@ -268,4 +291,87 @@ rl_noninc_reverse_search_again (count, key)
       return (-1);
     }
   noninc_dosearch (noninc_search_string, -1);
+  return 0;
+}
+
+static int
+rl_history_search_internal (count, direction)
+     int count, direction;
+{
+  HIST_ENTRY *temp, *old_temp;
+  int line_len;
+
+  maybe_save_line ();
+
+  temp = old_temp = (HIST_ENTRY *)NULL;
+  while (count)
+    {
+      temp = (direction < 0) ? previous_history () : next_history ();
+      if (temp == 0)
+        break;
+      /* On an empty prefix, make this the same as previous-history. */
+      if (rl_point == 0)
+       {
+         count--;
+         continue;
+       }
+      if (STREQN (rl_line_buffer, temp->line, rl_point))
+       {
+         /* Don't find multiple instances of the same line. */
+         if (prev_line_found && STREQ (prev_line_found, temp->line))
+           continue;
+          if (direction < 0)
+            old_temp = temp;
+          prev_line_found = temp->line;
+          count--;
+       }
+    }
+
+  if (temp == 0)
+    {
+      if (direction < 0 && old_temp)
+       temp = old_temp;
+      else
+       {
+         maybe_unsave_line ();
+         ding ();
+         return 1;
+       }
+    }
+
+  line_len = strlen (temp->line);
+  if (line_len >= rl_line_buffer_len)
+    rl_extend_line_buffer (line_len);
+  strcpy (rl_line_buffer, temp->line);
+  rl_undo_list = (UNDO_LIST *)temp->data;
+  rl_end = line_len;
+  return 0;
+}
+
+/* Search forward in the history for the string of characters
+   from the start of the line to rl_point.  This is a non-incremental
+   search. */
+int
+rl_history_search_forward (count, ignore)
+     int count, ignore;
+{
+  if (count == 0)
+    return (0);
+  if (rl_last_func != rl_history_search_forward)
+    prev_line_found = (char *)NULL;
+  return (rl_history_search_internal (abs (count), (count > 0) ? 1 : -1));
+}
+
+/* Search backward through the history for the string of characters
+   from the start of the line to rl_point.  This is a non-incremental
+   search. */
+int
+rl_history_search_backward (count, ignore)
+     int count, ignore;
+{
+  if (count == 0)
+    return (0);
+  if (rl_last_func != rl_history_search_backward)
+    prev_line_found = (char *)NULL;
+  return (rl_history_search_internal (abs (count), (count > 0) ? -1 : 1));
 }
This page took 0.026814 seconds and 4 git commands to generate.