Skip to content

Commit d7cc6f5

Browse files
authored
strings.textscanner: fix off-by-one error in skip method (#21045)
1 parent 549654a commit d7cc6f5

File tree

3 files changed

+53
-1
lines changed

3 files changed

+53
-1
lines changed

vlib/strings/textscanner/textscanner.v

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ pub fn (mut ss TextScanner) next() int {
5050
// `skip()` does not return a result.
5151
@[inline]
5252
pub fn (mut ss TextScanner) skip() {
53-
if ss.pos + 1 < ss.ilen {
53+
if ss.pos < ss.ilen {
5454
ss.pos++
5555
}
5656
}

vlib/strings/textscanner/textscanner_test.js.v

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,39 @@ fn test_skip() {
3131
s.skip()
3232
assert s.next() == `c`
3333
assert s.next() == -1
34+
35+
s.reset()
36+
assert s.peek() == `a`
37+
s.skip()
38+
assert s.peek() == `b`
39+
s.skip()
40+
assert s.peek() == `c`
41+
s.skip()
42+
assert s.peek() == -1
3443
}
3544

3645
fn test_skip_n() {
3746
mut s := textscanner.new('abc')
3847
s.skip_n(2)
3948
assert s.next() == `c`
4049
assert s.next() == -1
50+
51+
s.reset()
52+
assert s.peek() == `a`
53+
s.skip_n(2)
54+
assert s.peek() == `c`
55+
s.skip_n(2)
56+
assert s.peek() == -1
57+
58+
s.reset()
59+
assert s.peek() == `a`
60+
s.skip_n(3)
61+
assert s.peek() == -1
62+
63+
s.reset()
64+
assert s.peek() == `a`
65+
s.skip_n(4)
66+
assert s.peek() == -1
4167
}
4268

4369
fn test_peek() {

vlib/strings/textscanner/textscanner_test.v

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,39 @@ fn test_skip() {
3131
s.skip()
3232
assert s.next() == `c`
3333
assert s.next() == -1
34+
35+
s.reset()
36+
assert s.peek() == `a`
37+
s.skip()
38+
assert s.peek() == `b`
39+
s.skip()
40+
assert s.peek() == `c`
41+
s.skip()
42+
assert s.peek() == -1
3443
}
3544

3645
fn test_skip_n() {
3746
mut s := textscanner.new('abc')
3847
s.skip_n(2)
3948
assert s.next() == `c`
4049
assert s.next() == -1
50+
51+
s.reset()
52+
assert s.peek() == `a`
53+
s.skip_n(2)
54+
assert s.peek() == `c`
55+
s.skip_n(2)
56+
assert s.peek() == -1
57+
58+
s.reset()
59+
assert s.peek() == `a`
60+
s.skip_n(3)
61+
assert s.peek() == -1
62+
63+
s.reset()
64+
assert s.peek() == `a`
65+
s.skip_n(4)
66+
assert s.peek() == -1
4167
}
4268

4369
fn test_peek() {

0 commit comments

Comments
 (0)