1 /* isearch.c - incremental searching */
3 /* **************************************************************** */
5 /* I-Search and Searching */
7 /* **************************************************************** */
9 /* Copyright (C) 1987-2015 Free Software Foundation, Inc.
11 This file is part of the GNU Readline Library (Readline), a library
12 for reading lines of text with interactive input and history editing.
14 Readline is free software: you can redistribute it and/or modify
15 it under the terms of the GNU General Public License as published by
16 the Free Software Foundation, either version 3 of the License, or
17 (at your option) any later version.
19 Readline is distributed in the hope that it will be useful,
20 but WITHOUT ANY WARRANTY; without even the implied warranty of
21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 GNU General Public License for more details.
24 You should have received a copy of the GNU General Public License
25 along with Readline. If not, see <http://www.gnu.org/licenses/>.
28 #define READLINE_LIBRARY
30 #if defined (HAVE_CONFIG_H)
34 #include <sys/types.h>
38 #if defined (HAVE_UNISTD_H)
42 #if defined (HAVE_STDLIB_H)
45 # include "ansi_stdlib.h"
54 #include "rlprivate.h"
57 /* Variables exported to other files in the readline library. */
58 char *_rl_isearch_terminators
= (char *)NULL
;
60 _rl_search_cxt
*_rl_iscxt
= 0;
62 /* Variables imported from other files in the readline library. */
63 extern HIST_ENTRY
*_rl_saved_line_for_history
;
65 static int rl_search_history
PARAMS((int, int));
67 static _rl_search_cxt
*_rl_isearch_init
PARAMS((int));
68 static void _rl_isearch_fini
PARAMS((_rl_search_cxt
*));
70 /* Last line found by the current incremental search, so we don't `find'
71 identical lines many times in a row. Now part of isearch context. */
72 /* static char *prev_line_found; */
74 /* Last search string and its length. */
75 static char *last_isearch_string
;
76 static int last_isearch_string_len
;
78 static char * const default_isearch_terminators
= "\033\012";
81 _rl_scxt_alloc (type
, flags
)
86 cxt
= (_rl_search_cxt
*)xmalloc (sizeof (_rl_search_cxt
));
91 cxt
->search_string
= 0;
92 cxt
->search_string_size
= cxt
->search_string_index
= 0;
95 cxt
->allocated_line
= 0;
96 cxt
->hlen
= cxt
->hindex
= 0;
98 cxt
->save_point
= rl_point
;
99 cxt
->save_mark
= rl_mark
;
100 cxt
->save_line
= where_history ();
101 cxt
->last_found_line
= cxt
->save_line
;
102 cxt
->prev_line_found
= 0;
104 cxt
->save_undo_list
= 0;
106 cxt
->keymap
= _rl_keymap
;
107 cxt
->okeymap
= _rl_keymap
;
109 cxt
->history_pos
= 0;
112 cxt
->prevc
= cxt
->lastc
= 0;
115 cxt
->sline_len
= cxt
->sline_index
= 0;
117 cxt
->search_terminators
= 0;
123 _rl_scxt_dispose (cxt
, flags
)
127 FREE (cxt
->search_string
);
128 FREE (cxt
->allocated_line
);
134 /* Search backwards through the history looking for a string which is typed
135 interactively. Start with the current line. */
137 rl_reverse_search_history (sign
, key
)
140 return (rl_search_history (-sign
, key
));
143 /* Search forwards through the history looking for a string which is typed
144 interactively. Start with the current line. */
146 rl_forward_search_history (sign
, key
)
149 return (rl_search_history (sign
, key
));
152 /* Display the current state of the search in the echo-area.
153 SEARCH_STRING contains the string that is being searched for,
154 DIRECTION is zero for forward, or non-zero for reverse,
155 WHERE is the history list number of the current line. If it is
156 -1, then this line is the starting one. */
158 rl_display_search (search_string
, flags
, where
)
163 int msglen
, searchlen
;
165 searchlen
= (search_string
&& *search_string
) ? strlen (search_string
) : 0;
167 message
= (char *)xmalloc (searchlen
+ 64);
173 sprintf (message
, "[%d]", where
+ history_base
);
174 msglen
= strlen (message
);
178 message
[msglen
++] = '(';
180 if (flags
& SF_FAILED
)
182 strcpy (message
+ msglen
, "failed ");
186 if (flags
& SF_REVERSE
)
188 strcpy (message
+ msglen
, "reverse-");
192 strcpy (message
+ msglen
, "i-search)`");
197 strcpy (message
+ msglen
, search_string
);
201 strcpy (message
+ msglen
, "': ");
203 rl_message ("%s", message
);
205 (*rl_redisplay_function
) ();
208 static _rl_search_cxt
*
209 _rl_isearch_init (direction
)
216 cxt
= _rl_scxt_alloc (RL_SEARCH_ISEARCH
, 0);
218 cxt
->sflags
|= SF_REVERSE
;
220 cxt
->search_terminators
= _rl_isearch_terminators
? _rl_isearch_terminators
221 : default_isearch_terminators
;
223 /* Create an array of pointers to the lines that we want to search. */
224 hlist
= history_list ();
225 rl_maybe_replace_line ();
228 for (i
= 0; hlist
[i
]; i
++);
230 /* Allocate space for this many lines, +1 for the current input line,
231 and remember those lines. */
232 cxt
->lines
= (char **)xmalloc ((1 + (cxt
->hlen
= i
)) * sizeof (char *));
233 for (i
= 0; i
< cxt
->hlen
; i
++)
234 cxt
->lines
[i
] = hlist
[i
]->line
;
236 if (_rl_saved_line_for_history
)
237 cxt
->lines
[i
] = _rl_saved_line_for_history
->line
;
240 /* Keep track of this so we can free it. */
241 cxt
->allocated_line
= (char *)xmalloc (1 + strlen (rl_line_buffer
));
242 strcpy (cxt
->allocated_line
, &rl_line_buffer
[0]);
243 cxt
->lines
[i
] = cxt
->allocated_line
;
248 /* The line where we start the search. */
249 cxt
->history_pos
= cxt
->save_line
;
253 /* Initialize search parameters. */
254 cxt
->search_string
= (char *)xmalloc (cxt
->search_string_size
= 128);
255 cxt
->search_string
[cxt
->search_string_index
= 0] = '\0';
257 /* Normalize DIRECTION into 1 or -1. */
258 cxt
->direction
= (direction
>= 0) ? 1 : -1;
260 cxt
->sline
= rl_line_buffer
;
261 cxt
->sline_len
= strlen (cxt
->sline
);
262 cxt
->sline_index
= rl_point
;
264 _rl_iscxt
= cxt
; /* save globally */
270 _rl_isearch_fini (cxt
)
273 /* First put back the original state. */
274 strcpy (rl_line_buffer
, cxt
->lines
[cxt
->save_line
]);
276 rl_restore_prompt ();
278 /* Save the search string for possible later use. */
279 FREE (last_isearch_string
);
280 last_isearch_string
= cxt
->search_string
;
281 last_isearch_string_len
= cxt
->search_string_index
;
282 cxt
->search_string
= 0;
284 if (cxt
->last_found_line
< cxt
->save_line
)
285 rl_get_previous_history (cxt
->save_line
- cxt
->last_found_line
, 0);
287 rl_get_next_history (cxt
->last_found_line
- cxt
->save_line
, 0);
289 /* If the string was not found, put point at the end of the last matching
290 line. If last_found_line == orig_line, we didn't find any matching
291 history lines at all, so put point back in its original position. */
292 if (cxt
->sline_index
< 0)
294 if (cxt
->last_found_line
== cxt
->save_line
)
295 cxt
->sline_index
= cxt
->save_point
;
297 cxt
->sline_index
= strlen (rl_line_buffer
);
298 rl_mark
= cxt
->save_mark
;
301 rl_point
= cxt
->sline_index
;
302 /* Don't worry about where to put the mark here; rl_get_previous_history
303 and rl_get_next_history take care of it. */
309 _rl_search_getchar (cxt
)
314 /* Read a key and decide how to proceed. */
315 RL_SETSTATE(RL_STATE_MOREINPUT
);
316 c
= cxt
->lastc
= rl_read_key ();
317 RL_UNSETSTATE(RL_STATE_MOREINPUT
);
319 #if defined (HANDLE_MULTIBYTE)
320 /* This ends up with C (and LASTC) being set to the last byte of the
321 multibyte character. In most cases c == lastc == mb[0] */
322 if (MB_CUR_MAX
> 1 && rl_byte_oriented
== 0)
323 c
= cxt
->lastc
= _rl_read_mbstring (cxt
->lastc
, cxt
->mb
, MB_LEN_MAX
);
330 #define ENDSRCH_CHAR(c) \
331 ((CTRL_CHAR (c) || META_CHAR (c) || (c) == RUBOUT) && ((c) != CTRL ('G')))
333 /* Process just-read character C according to isearch context CXT. Return
334 -1 if the caller should just free the context and return, 0 if we should
335 break out of the loop, and 1 if we should continue to read characters. */
337 _rl_isearch_dispatch (cxt
, c
)
341 int n
, wstart
, wlen
, limit
, cval
;
342 rl_command_func_t
*f
;
344 f
= (rl_command_func_t
*)NULL
;
348 cxt
->sflags
|= SF_FAILED
;
349 cxt
->history_pos
= cxt
->last_found_line
;
353 /* If we are moving into a new keymap, modify cxt->keymap and go on.
354 This can be a problem if c == ESC and we want to terminate the
355 incremental search, so we check */
356 if (c
>= 0 && cxt
->keymap
[c
].type
== ISKMAP
&& strchr (cxt
->search_terminators
, cxt
->lastc
) == 0)
358 /* _rl_keyseq_timeout specified in milliseconds; _rl_input_queued
359 takes microseconds, so multiply by 1000. If we don't get any
360 additional input and this keymap shadows another function, process
361 that key as if it was all we read. */
362 if (_rl_keyseq_timeout
> 0 &&
363 RL_ISSTATE (RL_STATE_CALLBACK
) == 0 &&
364 RL_ISSTATE (RL_STATE_INPUTPENDING
) == 0 &&
365 _rl_pushed_input_available () == 0 &&
366 ((Keymap
)(cxt
->keymap
[c
].function
))[ANYOTHERKEY
].function
&&
367 _rl_input_queued (_rl_keyseq_timeout
*1000) == 0)
370 cxt
->okeymap
= cxt
->keymap
;
371 cxt
->keymap
= FUNCTION_TO_KEYMAP (cxt
->keymap
, c
);
372 cxt
->sflags
|= SF_CHGKMAP
;
373 /* XXX - we should probably save this sequence, so we can do
374 something useful if this doesn't end up mapping to a command we
375 interpret here. Right now we just save the most recent character
376 that caused the index into a new keymap. */
378 #if defined (HANDLE_MULTIBYTE)
379 if (MB_CUR_MAX
> 1 && rl_byte_oriented
== 0)
383 cxt
->pmb
[0] = c
; /* XXX should be == cxt->mb[0] */
387 memcpy (cxt
->pmb
, cxt
->mb
, sizeof (cxt
->pmb
));
395 /* Translate the keys we do something with to opcodes. */
396 if (c
>= 0 && cxt
->keymap
[c
].type
== ISFUNC
)
398 f
= cxt
->keymap
[c
].function
;
400 if (f
== rl_reverse_search_history
)
401 cxt
->lastc
= (cxt
->sflags
& SF_REVERSE
) ? -1 : -2;
402 else if (f
== rl_forward_search_history
)
403 cxt
->lastc
= (cxt
->sflags
& SF_REVERSE
) ? -2 : -1;
404 else if (f
== rl_rubout
)
406 else if (c
== CTRL ('G') || f
== rl_abort
)
408 else if (c
== CTRL ('W') || f
== rl_unix_word_rubout
) /* XXX */
410 else if (c
== CTRL ('Y') || f
== rl_yank
) /* XXX */
414 /* If we changed the keymap earlier while translating a key sequence into
415 a command, restore it now that we've succeeded. */
416 if (cxt
->sflags
& SF_CHGKMAP
)
418 cxt
->keymap
= cxt
->okeymap
;
419 cxt
->sflags
&= ~SF_CHGKMAP
;
420 /* If we indexed into a new keymap, but didn't map to a command that
421 affects the search (lastc > 0), and the character that mapped to a
422 new keymap would have ended the search (ENDSRCH_CHAR(cxt->prevc)),
423 handle that now as if the previous char would have ended the search
424 and we would have read the current character. */
425 /* XXX - should we check cxt->mb? */
426 if (cxt
->lastc
> 0 && ENDSRCH_CHAR (cxt
->prevc
))
428 rl_stuff_char (cxt
->lastc
);
429 rl_execute_next (cxt
->prevc
);
430 /* XXX - do we insert everything in cxt->pmb? */
433 /* Otherwise, if the current character is mapped to self-insert or
434 nothing (i.e., not an editing command), and the previous character
435 was a keymap index, then we need to insert both the previous
436 character and the current character into the search string. */
437 else if (cxt
->lastc
> 0 && cxt
->prevc
> 0 &&
438 cxt
->keymap
[cxt
->prevc
].type
== ISKMAP
&&
439 (f
== 0 || f
== rl_insert
))
441 /* Make lastc be the next character read */
442 /* XXX - do we insert everything in cxt->mb? */
443 rl_execute_next (cxt
->lastc
);
444 /* Dispatch on the previous character (insert into search string) */
445 cxt
->lastc
= cxt
->prevc
;
446 #if defined (HANDLE_MULTIBYTE)
447 /* Have to overwrite cxt->mb here because dispatch uses it below */
448 if (MB_CUR_MAX
> 1 && rl_byte_oriented
== 0)
450 if (cxt
->pmb
[1] == 0)
452 cxt
->mb
[0] = cxt
->lastc
; /* == cxt->prevc */
456 memcpy (cxt
->mb
, cxt
->pmb
, sizeof (cxt
->mb
));
461 else if (cxt
->lastc
> 0 && cxt
->prevc
> 0 && f
&& f
!= rl_insert
)
463 rl_stuff_char (cxt
->lastc
);
464 rl_execute_next (cxt
->prevc
);
465 /* XXX - do we insert everything in cxt->pmb? */
470 /* The characters in isearch_terminators (set from the user-settable
471 variable isearch-terminators) are used to terminate the search but
472 not subsequently execute the character as a command. The default
473 value is "\033\012" (ESC and C-J). */
474 if (cxt
->lastc
> 0 && strchr (cxt
->search_terminators
, cxt
->lastc
))
476 /* ESC still terminates the search, but if there is pending
477 input or if input arrives within 0.1 seconds (on systems
478 with select(2)) it is used as a prefix character
479 with rl_execute_next. WATCH OUT FOR THIS! This is intended
480 to allow the arrow keys to be used like ^F and ^B are used
481 to terminate the search and execute the movement command.
482 XXX - since _rl_input_available depends on the application-
483 settable keyboard timeout value, this could alternatively
484 use _rl_input_queued(100000) */
485 if (cxt
->lastc
== ESC
&& (_rl_pushed_input_available () || _rl_input_available ()))
486 rl_execute_next (ESC
);
490 #if defined (HANDLE_MULTIBYTE)
491 if (MB_CUR_MAX
> 1 && rl_byte_oriented
== 0)
493 if (cxt
->lastc
>= 0 && (cxt
->mb
[0] && cxt
->mb
[1] == '\0') && ENDSRCH_CHAR (cxt
->lastc
))
495 /* This sets rl_pending_input to LASTC; it will be picked up the next
496 time rl_read_key is called. */
497 rl_execute_next (cxt
->lastc
);
503 if (cxt
->lastc
>= 0 && ENDSRCH_CHAR (cxt
->lastc
))
505 /* This sets rl_pending_input to LASTC; it will be picked up the next
506 time rl_read_key is called. */
507 rl_execute_next (cxt
->lastc
);
511 /* Now dispatch on the character. `Opcodes' affect the search string or
512 state. Other characters are added to the string. */
517 if (cxt
->search_string_index
== 0)
519 if (last_isearch_string
)
521 cxt
->search_string_size
= 64 + last_isearch_string_len
;
522 cxt
->search_string
= (char *)xrealloc (cxt
->search_string
, cxt
->search_string_size
);
523 strcpy (cxt
->search_string
, last_isearch_string
);
524 cxt
->search_string_index
= last_isearch_string_len
;
525 rl_display_search (cxt
->search_string
, cxt
->sflags
, -1);
530 else if (cxt
->sflags
& SF_REVERSE
)
532 else if (cxt
->sline_index
!= cxt
->sline_len
)
538 /* switch directions */
540 cxt
->direction
= -cxt
->direction
;
541 if (cxt
->direction
< 0)
542 cxt
->sflags
|= SF_REVERSE
;
544 cxt
->sflags
&= ~SF_REVERSE
;
547 /* delete character from search string. */
548 case -3: /* C-H, DEL */
549 /* This is tricky. To do this right, we need to keep a
550 stack of search positions for the current search, with
551 sentinels marking the beginning and end. But this will
552 do until we have a real isearch-undo. */
553 if (cxt
->search_string_index
== 0)
555 else if (MB_CUR_MAX
== 1 || rl_byte_oriented
)
556 cxt
->search_string
[--cxt
->search_string_index
] = '\0';
559 wstart
= _rl_find_prev_mbchar (cxt
->search_string
, cxt
->search_string_index
, MB_FIND_NONZERO
);
561 cxt
->search_string
[cxt
->search_string_index
= wstart
] = '\0';
563 cxt
->search_string
[cxt
->search_string_index
= 0] = '\0';
566 if (cxt
->search_string_index
== 0)
571 case -4: /* C-G, abort */
572 rl_replace_line (cxt
->lines
[cxt
->save_line
], 0);
573 rl_point
= cxt
->save_point
;
574 rl_mark
= cxt
->save_mark
;
581 /* skip over portion of line we already matched and yank word */
582 wstart
= rl_point
+ cxt
->search_string_index
;
583 if (wstart
>= rl_end
)
589 /* if not in a word, move to one. */
590 cval
= _rl_char_value (rl_line_buffer
, wstart
);
591 if (_rl_walphabetic (cval
) == 0)
596 n
= MB_NEXTCHAR (rl_line_buffer
, wstart
, 1, MB_FIND_NONZERO
);;
599 cval
= _rl_char_value (rl_line_buffer
, n
);
600 if (_rl_walphabetic (cval
) == 0)
602 n
= MB_NEXTCHAR (rl_line_buffer
, n
, 1, MB_FIND_NONZERO
);;
604 wlen
= n
- wstart
+ 1;
605 if (cxt
->search_string_index
+ wlen
+ 1 >= cxt
->search_string_size
)
607 cxt
->search_string_size
+= wlen
+ 1;
608 cxt
->search_string
= (char *)xrealloc (cxt
->search_string
, cxt
->search_string_size
);
610 for (; wstart
< n
; wstart
++)
611 cxt
->search_string
[cxt
->search_string_index
++] = rl_line_buffer
[wstart
];
612 cxt
->search_string
[cxt
->search_string_index
] = '\0';
616 /* skip over portion of line we already matched and yank rest */
617 wstart
= rl_point
+ cxt
->search_string_index
;
618 if (wstart
>= rl_end
)
623 n
= rl_end
- wstart
+ 1;
624 if (cxt
->search_string_index
+ n
+ 1 >= cxt
->search_string_size
)
626 cxt
->search_string_size
+= n
+ 1;
627 cxt
->search_string
= (char *)xrealloc (cxt
->search_string
, cxt
->search_string_size
);
629 for (n
= wstart
; n
< rl_end
; n
++)
630 cxt
->search_string
[cxt
->search_string_index
++] = rl_line_buffer
[n
];
631 cxt
->search_string
[cxt
->search_string_index
] = '\0';
634 /* Add character to search string and continue search. */
636 if (cxt
->search_string_index
+ 2 >= cxt
->search_string_size
)
638 cxt
->search_string_size
+= 128;
639 cxt
->search_string
= (char *)xrealloc (cxt
->search_string
, cxt
->search_string_size
);
641 #if defined (HANDLE_MULTIBYTE)
642 if (MB_CUR_MAX
> 1 && rl_byte_oriented
== 0)
646 if (cxt
->mb
[0] == 0 || cxt
->mb
[1] == 0)
647 cxt
->search_string
[cxt
->search_string_index
++] = cxt
->mb
[0];
649 for (j
= 0, l
= RL_STRLEN (cxt
->mb
); j
< l
; )
650 cxt
->search_string
[cxt
->search_string_index
++] = cxt
->mb
[j
++];
654 cxt
->search_string
[cxt
->search_string_index
++] = cxt
->lastc
; /* XXX - was c instead of lastc */
655 cxt
->search_string
[cxt
->search_string_index
] = '\0';
659 for (cxt
->sflags
&= ~(SF_FOUND
|SF_FAILED
);; )
661 if (cxt
->search_string_index
== 0)
663 cxt
->sflags
|= SF_FAILED
;
667 limit
= cxt
->sline_len
- cxt
->search_string_index
+ 1;
669 /* Search the current line. */
670 while ((cxt
->sflags
& SF_REVERSE
) ? (cxt
->sline_index
>= 0) : (cxt
->sline_index
< limit
))
672 if (STREQN (cxt
->search_string
, cxt
->sline
+ cxt
->sline_index
, cxt
->search_string_index
))
674 cxt
->sflags
|= SF_FOUND
;
678 cxt
->sline_index
+= cxt
->direction
;
680 if (cxt
->sflags
& SF_FOUND
)
683 /* Move to the next line, but skip new copies of the line
684 we just found and lines shorter than the string we're
688 /* Move to the next line. */
689 cxt
->history_pos
+= cxt
->direction
;
691 /* At limit for direction? */
692 if ((cxt
->sflags
& SF_REVERSE
) ? (cxt
->history_pos
< 0) : (cxt
->history_pos
== cxt
->hlen
))
694 cxt
->sflags
|= SF_FAILED
;
698 /* We will need these later. */
699 cxt
->sline
= cxt
->lines
[cxt
->history_pos
];
700 cxt
->sline_len
= strlen (cxt
->sline
);
702 while ((cxt
->prev_line_found
&& STREQ (cxt
->prev_line_found
, cxt
->lines
[cxt
->history_pos
])) ||
703 (cxt
->search_string_index
> cxt
->sline_len
));
705 if (cxt
->sflags
& SF_FAILED
)
708 /* Now set up the line for searching... */
709 cxt
->sline_index
= (cxt
->sflags
& SF_REVERSE
) ? cxt
->sline_len
- cxt
->search_string_index
: 0;
712 if (cxt
->sflags
& SF_FAILED
)
714 /* We cannot find the search string. Ding the bell. */
716 cxt
->history_pos
= cxt
->last_found_line
;
717 rl_display_search (cxt
->search_string
, cxt
->sflags
, (cxt
->history_pos
== cxt
->save_line
) ? -1 : cxt
->history_pos
);
721 /* We have found the search string. Just display it. But don't
722 actually move there in the history list until the user accepts
724 if (cxt
->sflags
& SF_FOUND
)
726 cxt
->prev_line_found
= cxt
->lines
[cxt
->history_pos
];
727 rl_replace_line (cxt
->lines
[cxt
->history_pos
], 0);
728 rl_point
= cxt
->sline_index
;
729 cxt
->last_found_line
= cxt
->history_pos
;
730 rl_display_search (cxt
->search_string
, cxt
->sflags
, (cxt
->history_pos
== cxt
->save_line
) ? -1 : cxt
->history_pos
);
737 _rl_isearch_cleanup (cxt
, r
)
742 _rl_isearch_fini (cxt
);
743 _rl_scxt_dispose (cxt
, 0);
746 RL_UNSETSTATE(RL_STATE_ISEARCH
);
751 /* Search through the history looking for an interactively typed string.
752 This is analogous to i-search. We start the search in the current line.
753 DIRECTION is which direction to search; >= 0 means forward, < 0 means
756 rl_search_history (direction
, invoking_key
)
757 int direction
, invoking_key
;
759 _rl_search_cxt
*cxt
; /* local for now, but saved globally */
762 RL_SETSTATE(RL_STATE_ISEARCH
);
763 cxt
= _rl_isearch_init (direction
);
765 rl_display_search (cxt
->search_string
, cxt
->sflags
, -1);
767 /* If we are using the callback interface, all we do is set up here and
768 return. The key is that we leave RL_STATE_ISEARCH set. */
769 if (RL_ISSTATE (RL_STATE_CALLBACK
))
775 c
= _rl_search_getchar (cxt
);
776 /* We might want to handle EOF here (c == 0) */
777 r
= _rl_isearch_dispatch (cxt
, cxt
->lastc
);
782 /* The searching is over. The user may have found the string that she
783 was looking for, or else she may have exited a failing search. If
784 LINE_INDEX is -1, then that shows that the string searched for was
785 not found. We use this to determine where to place rl_point. */
786 return (_rl_isearch_cleanup (cxt
, r
));
789 #if defined (READLINE_CALLBACKS)
790 /* Called from the callback functions when we are ready to read a key. The
791 callback functions know to call this because RL_ISSTATE(RL_STATE_ISEARCH).
792 If _rl_isearch_dispatch finishes searching, this function is responsible
793 for turning off RL_STATE_ISEARCH, which it does using _rl_isearch_cleanup. */
795 _rl_isearch_callback (cxt
)
800 c
= _rl_search_getchar (cxt
);
801 /* We might want to handle EOF here */
802 r
= _rl_isearch_dispatch (cxt
, cxt
->lastc
);
804 return (r
<= 0) ? _rl_isearch_cleanup (cxt
, r
) : 0;