aboutsummaryrefslogtreecommitdiff
path: root/readline/search.c
diff options
context:
space:
mode:
Diffstat (limited to 'readline/search.c')
-rw-r--r--readline/search.c98
1 files changed, 19 insertions, 79 deletions
diff --git a/readline/search.c b/readline/search.c
index c9bc6b1..bf525e6 100644
--- a/readline/search.c
+++ b/readline/search.c
@@ -1,6 +1,6 @@
/* search.c - code for non-incremental searching in emacs and vi modes. */
-/* Copyright (C) 1992-2013 Free Software Foundation, Inc.
+/* Copyright (C) 1992-2009 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.
@@ -43,7 +43,6 @@
#include "readline.h"
#include "history.h"
-#include "histlib.h"
#include "rlprivate.h"
#include "xmalloc.h"
@@ -67,8 +66,6 @@ static char *prev_line_found = (char *) NULL;
static int rl_history_search_len;
static int rl_history_search_pos;
-static int rl_history_search_flags;
-
static char *history_search_string;
static int history_string_size;
@@ -77,9 +74,10 @@ static int noninc_search_from_pos PARAMS((char *, int, int));
static int noninc_dosearch PARAMS((char *, int));
static int noninc_search PARAMS((int, int));
static int rl_history_search_internal PARAMS((int, int));
-static void rl_history_search_reinit PARAMS((int));
+static void rl_history_search_reinit PARAMS((void));
static _rl_search_cxt *_rl_nsearch_init PARAMS((int, int));
+static int _rl_nsearch_cleanup PARAMS((_rl_search_cxt *, int));
static void _rl_nsearch_abort PARAMS((_rl_search_cxt *));
static int _rl_nsearch_dispatch PARAMS((_rl_search_cxt *, int));
@@ -171,8 +169,7 @@ noninc_dosearch (string, dir)
oldpos = where_history ();
history_set_pos (noninc_history_pos);
- entry = current_history (); /* will never be NULL after successful search */
-
+ entry = current_history ();
#if defined (VI_MODE)
if (rl_editing_mode != vi_mode)
#endif
@@ -223,7 +220,7 @@ _rl_nsearch_init (dir, pchar)
return cxt;
}
-int
+static int
_rl_nsearch_cleanup (cxt, r)
_rl_search_cxt *cxt;
int r;
@@ -410,7 +407,7 @@ rl_noninc_forward_search_again (count, key)
if (!noninc_search_string)
{
rl_ding ();
- return (1);
+ return (-1);
}
r = noninc_dosearch (noninc_search_string, 1);
return (r != 1);
@@ -427,7 +424,7 @@ rl_noninc_reverse_search_again (count, key)
if (!noninc_search_string)
{
rl_ding ();
- return (1);
+ return (-1);
}
r = noninc_dosearch (noninc_search_string, -1);
return (r != 1);
@@ -456,19 +453,15 @@ rl_history_search_internal (count, dir)
{
HIST_ENTRY *temp;
int ret, oldpos;
- char *t;
rl_maybe_save_line ();
temp = (HIST_ENTRY *)NULL;
- /* Search COUNT times through the history for a line matching
- history_search_string. If history_search_string[0] == '^', the
- line must match from the start; otherwise any substring can match.
- When this loop finishes, TEMP, if non-null, is the history line to
- copy into the line buffer. */
+ /* Search COUNT times through the history for a line whose prefix
+ matches history_search_string. When this loop finishes, TEMP,
+ if non-null, is the history line to copy into the line buffer. */
while (count)
{
- RL_CHECK_SIGNALS ();
ret = noninc_search_from_pos (history_search_string, rl_history_search_pos + dir, dir);
if (ret == -1)
break;
@@ -477,7 +470,7 @@ rl_history_search_internal (count, dir)
rl_history_search_pos = ret;
oldpos = where_history ();
history_set_pos (rl_history_search_pos);
- temp = current_history (); /* will never be NULL after successful search */
+ temp = current_history ();
history_set_pos (oldpos);
/* Don't find multiple instances of the same line. */
@@ -512,49 +505,35 @@ rl_history_search_internal (count, dir)
/* Copy the line we found into the current line buffer. */
make_history_line_current (temp);
- if (rl_history_search_flags & ANCHORED_SEARCH)
- rl_point = rl_history_search_len; /* easy case */
- else
- {
- t = strstr (rl_line_buffer, history_search_string);
- rl_point = t ? (int)(t - rl_line_buffer) + rl_history_search_len : rl_end;
- }
+ rl_point = rl_history_search_len;
rl_mark = rl_end;
return 0;
}
static void
-rl_history_search_reinit (flags)
- int flags;
+rl_history_search_reinit ()
{
- int sind;
-
rl_history_search_pos = where_history ();
rl_history_search_len = rl_point;
- rl_history_search_flags = flags;
-
prev_line_found = (char *)NULL;
if (rl_point)
{
- /* Allocate enough space for anchored and non-anchored searches */
if (rl_history_search_len >= history_string_size - 2)
{
history_string_size = rl_history_search_len + 2;
history_search_string = (char *)xrealloc (history_search_string, history_string_size);
}
- sind = 0;
- if (flags & ANCHORED_SEARCH)
- history_search_string[sind++] = '^';
- strncpy (history_search_string + sind, rl_line_buffer, rl_point);
- history_search_string[rl_point + sind] = '\0';
+ history_search_string[0] = '^';
+ strncpy (history_search_string + 1, rl_line_buffer, rl_point);
+ history_search_string[rl_point + 1] = '\0';
}
_rl_free_saved_history_line ();
}
/* 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. The search is anchored to the beginning of the history line. */
+ search. */
int
rl_history_search_forward (count, ignore)
int count, ignore;
@@ -564,7 +543,7 @@ rl_history_search_forward (count, ignore)
if (rl_last_func != rl_history_search_forward &&
rl_last_func != rl_history_search_backward)
- rl_history_search_reinit (ANCHORED_SEARCH);
+ rl_history_search_reinit ();
if (rl_history_search_len == 0)
return (rl_get_next_history (count, ignore));
@@ -583,46 +562,7 @@ rl_history_search_backward (count, ignore)
if (rl_last_func != rl_history_search_forward &&
rl_last_func != rl_history_search_backward)
- rl_history_search_reinit (ANCHORED_SEARCH);
-
- if (rl_history_search_len == 0)
- return (rl_get_previous_history (count, ignore));
- return (rl_history_search_internal (abs (count), (count > 0) ? -1 : 1));
-}
-
-/* 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. The search succeeds if the search string is present anywhere
- in the history line. */
-int
-rl_history_substr_search_forward (count, ignore)
- int count, ignore;
-{
- if (count == 0)
- return (0);
-
- if (rl_last_func != rl_history_substr_search_forward &&
- rl_last_func != rl_history_substr_search_backward)
- rl_history_search_reinit (NON_ANCHORED_SEARCH);
-
- if (rl_history_search_len == 0)
- return (rl_get_next_history (count, ignore));
- 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_substr_search_backward (count, ignore)
- int count, ignore;
-{
- if (count == 0)
- return (0);
-
- if (rl_last_func != rl_history_substr_search_forward &&
- rl_last_func != rl_history_substr_search_backward)
- rl_history_search_reinit (NON_ANCHORED_SEARCH);
+ rl_history_search_reinit ();
if (rl_history_search_len == 0)
return (rl_get_previous_history (count, ignore));