vi: allow backward search to specify line address

It should be possible to use a backward search as a line address
in colon commands.

function                                             old     new   delta
colon                                               3661    3701     +40
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/0 up/down: 40/0)               Total: 40 bytes

Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Ron Yorston 2021-04-15 12:06:11 +01:00 committed by Denys Vlasenko
parent d488def0e4
commit 47f78913f7

View File

@ -2346,9 +2346,9 @@ static char *get_one_address(char *p, int *addr) // get colon addr, if present
{ {
int st; int st;
# if ENABLE_FEATURE_VI_YANKMARK || ENABLE_FEATURE_VI_SEARCH # if ENABLE_FEATURE_VI_YANKMARK || ENABLE_FEATURE_VI_SEARCH
char *q; char *q, c;
# endif # endif
IF_FEATURE_VI_YANKMARK(char c;) IF_FEATURE_VI_SEARCH(int dir;)
*addr = -1; // assume no addr *addr = -1; // assume no addr
if (*p == '.') { // the current line if (*p == '.') { // the current line
@ -2372,18 +2372,25 @@ static char *get_one_address(char *p, int *addr) // get colon addr, if present
} }
# endif # endif
# if ENABLE_FEATURE_VI_SEARCH # if ENABLE_FEATURE_VI_SEARCH
else if (*p == '/') { // a search pattern else if (*p == '/' || *p == '?') { // a search pattern
q = strchrnul(p + 1, '/'); c = *p;
q = strchrnul(p + 1, c);
if (p + 1 != q) { if (p + 1 != q) {
// save copy of new pattern // save copy of new pattern
free(last_search_pattern); free(last_search_pattern);
last_search_pattern = xstrndup(p, q - p); last_search_pattern = xstrndup(p, q - p);
} }
p = q; p = q;
if (*p == '/') if (*p == c)
p++; p++;
q = char_search(next_line(dot), last_search_pattern + 1, if (c == '/') {
(FORWARD << 1) | FULL); q = next_line(dot);
dir = (FORWARD << 1) | FULL;
} else {
q = begin_line(dot);
dir = ((unsigned)BACK << 1) | FULL;
}
q = char_search(q, last_search_pattern + 1, dir);
if (q == NULL) if (q == NULL)
return NULL; return NULL;
*addr = count_lines(text, q); *addr = count_lines(text, q);