1 /* search.c - code for non-incremental searching in emacs and vi modes. */
3 /* Copyright (C) 1992 Free Software Foundation, Inc.
5 This file is part of the Readline Library (the Library), a set of
6 routines for providing Emacs style line input to programs that ask
9 The Library is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 1, or (at your option)
14 The Library is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 General Public License for more details.
19 The GNU General Public License is often shipped with GNU software, and
20 is generally kept in a file called COPYING or LICENSE. If you do not
21 have a copy of the license, write to the Free Software Foundation,
22 675 Mass Ave, Cambridge, MA 02139, USA. */
26 #if defined (__GNUC__)
27 # define alloca __builtin_alloca
29 # if defined (sparc) || defined (HAVE_ALLOCA_H)
37 extern char *xmalloc (), *xrealloc ();
39 /* Variables imported from readline.c */
40 extern int rl_point
, rl_end
, rl_line_buffer_len
;
41 extern Keymap _rl_keymap
;
42 extern char *rl_prompt
;
43 extern char *rl_line_buffer
;
44 extern HIST_ENTRY
*saved_line_for_history
;
46 static char *noninc_search_string
= (char *) NULL
;
47 static int noninc_history_pos
= 0;
49 /* Search the history list for STRING starting at absolute history position
50 POS. If STRING begins with `^', the search must match STRING at the
51 beginning of a history line, otherwise a full substring match is performed
52 for STRING. DIR < 0 means to search backwards through the history list,
53 DIR >= 0 means to search forward. */
55 noninc_search_from_pos (string
, pos
, dir
)
61 old
= where_history ();
62 history_set_pos (pos
);
65 ret
= history_search_prefix (string
+ 1, dir
);
67 ret
= history_search (string
, dir
);
70 ret
= where_history ();
72 history_set_pos (old
);
76 /* Search for a line in the history containing STRING. If DIR is < 0, the
77 search is backwards through previous entries, else through subsequent
80 noninc_dosearch (string
, dir
)
87 if (string
== 0 || *string
== 0 || noninc_history_pos
< 0)
93 pos
= noninc_search_from_pos (string
, noninc_history_pos
+ dir
, dir
);
96 /* Search failed, current history position unchanged. */
104 noninc_history_pos
= pos
;
106 oldpos
= where_history ();
107 history_set_pos (noninc_history_pos
);
108 entry
= current_history ();
109 history_set_pos (oldpos
);
114 line_len
= strlen (entry
->line
);
115 if (line_len
>= rl_line_buffer_len
)
116 rl_extend_line_buffer (line_len
);
117 strcpy (rl_line_buffer
, entry
->line
);
120 rl_undo_list
= (UNDO_LIST
*)entry
->data
;
121 rl_end
= strlen (rl_line_buffer
);
125 if (saved_line_for_history
)
126 free_history_entry (saved_line_for_history
);
127 saved_line_for_history
= (HIST_ENTRY
*)NULL
;
130 /* Search non-interactively through the history list. DIR < 0 means to
131 search backwards through the history of previous commands; otherwise
132 the search is for commands subsequent to the current position in the
133 history list. PCHAR is the character to use for prompting when reading
134 the search string; if not specified (0), it defaults to `:'. */
136 noninc_search (dir
, pchar
)
140 int saved_point
, c
, pmtlen
;
144 saved_point
= rl_point
;
146 /* Use the line buffer to read the search string. */
147 rl_line_buffer
[0] = 0;
148 rl_end
= rl_point
= 0;
150 pmtlen
= (rl_prompt
&& *rl_prompt
) ? strlen (rl_prompt
) : 0;
151 p
= (char *)alloca (2 + pmtlen
);
153 strcpy (p
, rl_prompt
);
154 p
[pmtlen
] = pchar
? pchar
: ':';
155 p
[pmtlen
+ 1] = '\0';
157 rl_message (p
, 0, 0);
159 /* Read the search string. */
160 while (c
= rl_read_key ())
168 maybe_unsave_line ();
170 rl_point
= saved_point
;
177 rl_dispatch (c
, _rl_keymap
);
188 maybe_unsave_line ();
190 rl_point
= saved_point
;
202 /* If rl_point == 0, we want to re-use the previous search string and
203 start from the saved history position. If there's no previous search
207 if (!noninc_search_string
)
215 /* We want to start the search from the current history position. */
216 noninc_history_pos
= where_history ();
217 if (noninc_search_string
)
218 free (noninc_search_string
);
219 noninc_search_string
= savestring (rl_line_buffer
);
222 noninc_dosearch (noninc_search_string
, dir
);
225 /* Search forward through the history list for a string. If the vi-mode
226 code calls this, KEY will be `?'. */
227 rl_noninc_forward_search (count
, key
)
231 noninc_search (1, '?');
233 noninc_search (1, 0);
236 /* Reverse search the history list for a string. If the vi-mode code
237 calls this, KEY will be `/'. */
238 rl_noninc_reverse_search (count
, key
)
242 noninc_search (-1, '/');
244 noninc_search (-1, 0);
247 /* Search forward through the history list for the last string searched
248 for. If there is no saved search string, abort. */
249 rl_noninc_forward_search_again (count
, key
)
252 if (!noninc_search_string
)
257 noninc_dosearch (noninc_search_string
, 1);
260 /* Reverse search in the history list for the last string searched
261 for. If there is no saved search string, abort. */
262 rl_noninc_reverse_search_again (count
, key
)
265 if (!noninc_search_string
)
270 noninc_dosearch (noninc_search_string
, -1);
This page took 0.033822 seconds and 4 git commands to generate.