diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2018-11-29 14:19:57 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2018-11-29 14:19:57 +0100 |
commit | 836d0a7ee450893e7479b5f93a501454582955a2 (patch) | |
tree | 07a9de8a7d00a43c48bfe0123386c3179ad0e67b | |
parent | 9a2b6dcc2d3298499b88aea3b04c967f2f9ae965 (diff) | |
download | busybox-w32-836d0a7ee450893e7479b5f93a501454582955a2.tar.gz busybox-w32-836d0a7ee450893e7479b5f93a501454582955a2.tar.bz2 busybox-w32-836d0a7ee450893e7479b5f93a501454582955a2.zip |
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>
-rw-r--r-- | editors/vi.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/editors/vi.c b/editors/vi.c index 2aa0ad9dd..bff47250d 100644 --- a/editors/vi.c +++ b/editors/vi.c | |||
@@ -255,8 +255,8 @@ enum { | |||
255 | YANKDEL = TRUE, | 255 | YANKDEL = TRUE, |
256 | FORWARD = 1, // code depends on "1" for array index | 256 | FORWARD = 1, // code depends on "1" for array index |
257 | BACK = -1, // code depends on "-1" for array index | 257 | BACK = -1, // code depends on "-1" for array index |
258 | LIMITED = 0, // how much of text[] in char_search | 258 | LIMITED = 0, // char_search() only current line |
259 | FULL = 1, // how much of text[] in char_search | 259 | FULL = 1, // char_search() to the end/beginning of entire text |
260 | 260 | ||
261 | S_BEFORE_WS = 1, // used in skip_thing() for moving "dot" | 261 | S_BEFORE_WS = 1, // used in skip_thing() for moving "dot" |
262 | S_TO_WS = 2, // used in skip_thing() for moving "dot" | 262 | 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) | |||
1914 | return p; | 1914 | return p; |
1915 | } | 1915 | } |
1916 | 1916 | ||
1917 | // assume a LIMITED forward search | 1917 | q = end - 1; // if FULL |
1918 | q = end - 1; | 1918 | if (range == LIMITED) |
1919 | if (dir == BACK) | 1919 | q = next_line(p); |
1920 | if (dir == BACK) { | ||
1920 | q = text; | 1921 | q = text; |
1922 | if (range == LIMITED) | ||
1923 | q = prev_line(p); | ||
1924 | } | ||
1925 | |||
1921 | // RANGE could be negative if we are searching backwards | 1926 | // RANGE could be negative if we are searching backwards |
1922 | range = q - p; | 1927 | range = q - p; |
1923 | q = p; | 1928 | q = p; |