vi: fix FEATURE_VI_REGEX_SEARCH to respect LIMITED (one-line) search

If busybox is compiled with FEATURE_VI_REGEX_SEARCH enabled, command
":s/x/y/" searches not only in the current line, but continues search
after it. This makes range searches (":1,3s/x/y/") work incorrect. For
example file "./test":
1
2
3

$ vi ./test
:1,2s/3/e/
gives us:
1
2
e

function                                             old     new   delta
char_search                                          213     241     +28

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2018-11-29 14:19:57 +01:00
parent 9a2b6dcc2d
commit 836d0a7ee4

View File

@ -255,8 +255,8 @@ enum {
YANKDEL = TRUE,
FORWARD = 1, // code depends on "1" for array index
BACK = -1, // code depends on "-1" for array index
LIMITED = 0, // how much of text[] in char_search
FULL = 1, // how much of text[] in char_search
LIMITED = 0, // char_search() only current line
FULL = 1, // char_search() to the end/beginning of entire text
S_BEFORE_WS = 1, // used in skip_thing() for moving "dot"
S_TO_WS = 2, // used in skip_thing() for moving "dot"
@ -1914,10 +1914,15 @@ static char *char_search(char *p, const char *pat, int dir, int range)
return p;
}
// assume a LIMITED forward search
q = end - 1;
if (dir == BACK)
q = end - 1; // if FULL
if (range == LIMITED)
q = next_line(p);
if (dir == BACK) {
q = text;
if (range == LIMITED)
q = prev_line(p);
}
// RANGE could be negative if we are searching backwards
range = q - p;
q = p;