X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=lib%2Freadline%2Fsearch.c;h=45d7f13044f491536618bcb014730cc44025fe25;hb=28ef6c316f1aff914bb95ac09787a3c83c1815fd;hp=112f8072866e1669ccab106a433739cb3384521d;hpb=bb70624e964126b7ac4ff085ba163a9c35ffa18f;p=platform%2Fupstream%2Fbash.git diff --git a/lib/readline/search.c b/lib/readline/search.c index 112f807..45d7f13 100644 --- a/lib/readline/search.c +++ b/lib/readline/search.c @@ -51,7 +51,7 @@ #endif #define abs(x) (((x) >= 0) ? (x) : -(x)) -extern HIST_ENTRY *saved_line_for_history; +extern HIST_ENTRY *_rl_saved_line_for_history; /* Functions imported from the rest of the library. */ extern int _rl_free_history_entry __P((HIST_ENTRY *)); @@ -83,9 +83,9 @@ make_history_line_current (entry) rl_undo_list = (UNDO_LIST *)entry->data; rl_end = line_len; - if (saved_line_for_history) - _rl_free_history_entry (saved_line_for_history); - saved_line_for_history = (HIST_ENTRY *)NULL; + if (_rl_saved_line_for_history) + _rl_free_history_entry (_rl_saved_line_for_history); + _rl_saved_line_for_history = (HIST_ENTRY *)NULL; } /* Search the history list for STRING starting at absolute history position @@ -100,13 +100,19 @@ noninc_search_from_pos (string, pos, dir) { int ret, old; + if (pos < 0) + return -1; + old = where_history (); - history_set_pos (pos); + if (history_set_pos (pos) == 0) + return -1; + RL_SETSTATE(RL_STATE_SEARCH); if (*string == '^') ret = history_search_prefix (string + 1, dir); else ret = history_search (string, dir); + RL_UNSETSTATE(RL_STATE_SEARCH); if (ret != -1) ret = where_history (); @@ -128,7 +134,7 @@ noninc_dosearch (string, dir) if (string == 0 || *string == '\0' || noninc_history_pos < 0) { - ding (); + rl_ding (); return; } @@ -136,10 +142,10 @@ noninc_dosearch (string, dir) if (pos == -1) { /* Search failed, current history position unchanged. */ - maybe_unsave_line (); + rl_maybe_unsave_line (); rl_clear_message (); rl_point = 0; - ding (); + rl_ding (); return; } @@ -172,7 +178,7 @@ noninc_search (dir, pchar) int saved_point, c; char *p; - maybe_save_line (); + rl_maybe_save_line (); saved_point = rl_point; /* Use the line buffer to read the search string. */ @@ -183,18 +189,26 @@ noninc_search (dir, pchar) rl_message (p, 0, 0); free (p); -#define SEARCH_RETURN rl_restore_prompt (); return +#define SEARCH_RETURN rl_restore_prompt (); RL_UNSETSTATE(RL_STATE_NSEARCH); return + RL_SETSTATE(RL_STATE_NSEARCH); /* Read the search string. */ - while (c = rl_read_key ()) + while (1) { + RL_SETSTATE(RL_STATE_MOREINPUT); + c = rl_read_key (); + RL_UNSETSTATE(RL_STATE_MOREINPUT); + + if (c == 0) + break; + switch (c) { case CTRL('H'): case RUBOUT: if (rl_point == 0) { - maybe_unsave_line (); + rl_maybe_unsave_line (); rl_clear_message (); rl_point = saved_point; SEARCH_RETURN; @@ -218,10 +232,10 @@ noninc_search (dir, pchar) case CTRL('C'): case CTRL('G'): - maybe_unsave_line (); + rl_maybe_unsave_line (); rl_clear_message (); rl_point = saved_point; - ding (); + rl_ding (); SEARCH_RETURN; default: @@ -239,7 +253,7 @@ noninc_search (dir, pchar) { if (!noninc_search_string) { - ding (); + rl_ding (); SEARCH_RETURN; } } @@ -253,6 +267,7 @@ noninc_search (dir, pchar) rl_restore_prompt (); noninc_dosearch (noninc_search_string, dir); + RL_UNSETSTATE(RL_STATE_NSEARCH); } /* Search forward through the history list for a string. If the vi-mode @@ -283,7 +298,7 @@ rl_noninc_forward_search_again (count, key) { if (!noninc_search_string) { - ding (); + rl_ding (); return (-1); } noninc_dosearch (noninc_search_string, 1); @@ -298,7 +313,7 @@ rl_noninc_reverse_search_again (count, key) { if (!noninc_search_string) { - ding (); + rl_ding (); return (-1); } noninc_dosearch (noninc_search_string, -1); @@ -312,7 +327,7 @@ rl_history_search_internal (count, dir) HIST_ENTRY *temp; int ret, oldpos; - maybe_save_line (); + rl_maybe_save_line (); temp = (HIST_ENTRY *)NULL; /* Search COUNT times through the history for a line whose prefix @@ -341,8 +356,8 @@ rl_history_search_internal (count, dir) /* If we didn't find anything at all, return. */ if (temp == 0) { - maybe_unsave_line (); - ding (); + rl_maybe_unsave_line (); + rl_ding (); /* If you don't want the saved history line (last match) to show up in the line buffer after the search fails, change the #if 0 to #if 1 */ @@ -353,7 +368,7 @@ rl_history_search_internal (count, dir) rl_line_buffer[rl_end] = '\0'; } #else - rl_point = rl_history_search_len; /* maybe_unsave_line changes it */ + rl_point = rl_history_search_len; /* rl_maybe_unsave_line changes it */ #endif return 1; } @@ -382,6 +397,7 @@ rl_history_search_reinit () 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