diff --git a/ChangeLog b/ChangeLog index fc7b1fd9492abf7c70692f48fabeeb9cf44ce839..3160a5c6c8e22bb058d6fabfc0bb59e3e0312405 100644 --- a/ChangeLog +++ b/ChangeLog @@ -120,6 +120,16 @@ CVS code - debugging messages indicating when a flag is set or unset. (DLR) - search.c: + search_init() + - Add parameter use_answer. When it's TRUE, only set + backupstring to answer. This is needed to preserve the text + of the statusbar when switching to the search prompt from + the "Go To Line" prompt. Also, set backupstring before doing + anything else, add one minor efficiency tweak, and preserve + the text of the statusbar no matter what when switching from + the search prompt to the "Go To Line" prompt, since the + toggling works both ways now and non-numeric text shouldn't be + lost when going only one of those ways. (DLR) findnextstr() - Take the no_sameline parameter after can_display_wrap and wholewords, not after all other parameters. (DLR) diff --git a/src/proto.h b/src/proto.h index 8c258d27ba54c76fa52c6e678b1790bb80ce5c11..d2e623e7e8d74f3e3f87f29d06e4ffd140e08f13 100644 --- a/src/proto.h +++ b/src/proto.h @@ -402,7 +402,7 @@ void regexp_cleanup(void); void not_found_msg(const char *str); void search_abort(void); void search_init_globals(void); -int search_init(bool replacing); +int search_init(bool replacing, bool use_answer); bool is_whole_word(int curr_pos, const char *datastr, const char *searchword); bool findnextstr(bool can_display_wrap, bool wholeword, bool diff --git a/src/search.c b/src/search.c index cf1557237d1ada315c9372fc2a17605d8cebb8f8..a2ede844757fe0ab41b8f5e82b049fc92d561818 100644 --- a/src/search.c +++ b/src/search.c @@ -109,32 +109,39 @@ void search_init_globals(void) } } -/* Set up the system variables for a search or replace. Return -1 if - * the search should be canceled (due to Cancel, Go to Line, or a failed - * regcomp()). Return 0 on success, and 1 on rerun calling program. - * Return -2 to run opposite program (search -> replace, replace -> - * search). +/* Set up the system variables for a search or replace. If use_answer + * is TRUE, only set backupstring to answer. Return -2 to run opposite + * program (search -> replace, replace -> search), return -1 if the + * search should be canceled (due to Cancel, Go to Line, or a failed + * regcomp()), return 0 on success, and return 1 on rerun calling + * program. * - * replacing is TRUE if we call from do_replace(), FALSE if called from - * do_search(). */ -int search_init(bool replacing) + * replacing is TRUE if we call from do_replace(), and FALSE if called + * from do_search(). */ +int search_init(bool replacing, bool use_answer) { int i = 0; char *buf; static char *backupstring = NULL; + /* The search string we'll be using. */ + + /* If backupstring doesn't exist, initialize it to "". */ + if (backupstring == NULL) + backupstring = mallocstrcpy(NULL, ""); + + /* If use_answer is TRUE, set backupstring to answer and get out. */ + if (use_answer) { + backupstring = mallocstrcpy(backupstring, answer); + return 0; + } /* We display the search prompt below. If the user types a partial * search string and then Replace or a toggle, we will return to * do_search() or do_replace() and be called again. In that case, - * we should put the same search string back up. backupstring holds - * this string. */ + * we should put the same search string back up. */ search_init_globals(); - /* If we don't already have a backupstring, set it. */ - if (backupstring == NULL) - backupstring = mallocstrcpy(NULL, ""); - #ifndef NANO_SMALL search_history.current = (historytype *)&search_history.next; #endif @@ -148,10 +155,8 @@ int search_init(bool replacing) sprintf(buf, " [%s%s]", disp, strlenpt(last_search) > COLS / 3 ? "..." : ""); free(disp); - } else { - buf = charalloc(1); - buf[0] = '\0'; - } + } else + buf = mallocstrcpy(NULL, ""); /* This is now one simple call. It just does a lot. */ i = statusq(FALSE, replacing ? replace_list : whereis_list, @@ -238,9 +243,8 @@ int search_init(bool replacing) #ifndef NANO_SMALL search_history.current = search_history.next; #endif - /* If answer parses as an integer, put it up on the - * statusbar. */ - do_gotoline(parse_num(answer, NULL) ? -1 : 0, FALSE); + /* Put answer up on the statusbar. */ + do_gotoline(-1, FALSE); /* Fall through. */ default: return -1; @@ -386,7 +390,7 @@ void do_search(void) wrap_reset(); #endif - i = search_init(FALSE); + i = search_init(FALSE, FALSE); if (i == -1) /* Cancel, Go to Line, blank search string, or * regcomp() failed. */ search_abort(); @@ -780,7 +784,7 @@ void do_replace(void) return; } - i = search_init(TRUE); + i = search_init(TRUE, FALSE); if (i == -1) { /* Cancel, Go to Line, blank search * string, or regcomp() failed. */ replace_abort(); @@ -876,6 +880,9 @@ void do_gotoline(int line, bool save_pos) } if (i == NANO_TOOTHERWHEREIS_KEY) { + /* Keep answer up on the statusbar. */ + search_init(TRUE, TRUE); + do_search(); return; }