aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2018-11-29 14:19:57 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2018-11-29 14:19:57 +0100
commit836d0a7ee450893e7479b5f93a501454582955a2 (patch)
tree07a9de8a7d00a43c48bfe0123386c3179ad0e67b
parent9a2b6dcc2d3298499b88aea3b04c967f2f9ae965 (diff)
downloadbusybox-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.c15
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;