From d7cc6f5cf1ce712053b303183da827ef585401eb Mon Sep 17 00:00:00 2001 From: Kim Shrier Date: Sun, 17 Mar 2024 03:11:10 -0600 Subject: [PATCH] strings.textscanner: fix off-by-one error in skip method (#21045) --- vlib/strings/textscanner/textscanner.v | 2 +- .../strings/textscanner/textscanner_test.js.v | 26 +++++++++++++++++++ vlib/strings/textscanner/textscanner_test.v | 26 +++++++++++++++++++ 3 files changed, 53 insertions(+), 1 deletion(-) diff --git a/vlib/strings/textscanner/textscanner.v b/vlib/strings/textscanner/textscanner.v index be748b5d527725..65a38820bf874b 100644 --- a/vlib/strings/textscanner/textscanner.v +++ b/vlib/strings/textscanner/textscanner.v @@ -50,7 +50,7 @@ pub fn (mut ss TextScanner) next() int { // `skip()` does not return a result. @[inline] pub fn (mut ss TextScanner) skip() { - if ss.pos + 1 < ss.ilen { + if ss.pos < ss.ilen { ss.pos++ } } diff --git a/vlib/strings/textscanner/textscanner_test.js.v b/vlib/strings/textscanner/textscanner_test.js.v index e9d248769a5892..ef9f7b7cc46623 100644 --- a/vlib/strings/textscanner/textscanner_test.js.v +++ b/vlib/strings/textscanner/textscanner_test.js.v @@ -31,6 +31,15 @@ fn test_skip() { s.skip() assert s.next() == `c` assert s.next() == -1 + + s.reset() + assert s.peek() == `a` + s.skip() + assert s.peek() == `b` + s.skip() + assert s.peek() == `c` + s.skip() + assert s.peek() == -1 } fn test_skip_n() { @@ -38,6 +47,23 @@ fn test_skip_n() { s.skip_n(2) assert s.next() == `c` assert s.next() == -1 + + s.reset() + assert s.peek() == `a` + s.skip_n(2) + assert s.peek() == `c` + s.skip_n(2) + assert s.peek() == -1 + + s.reset() + assert s.peek() == `a` + s.skip_n(3) + assert s.peek() == -1 + + s.reset() + assert s.peek() == `a` + s.skip_n(4) + assert s.peek() == -1 } fn test_peek() { diff --git a/vlib/strings/textscanner/textscanner_test.v b/vlib/strings/textscanner/textscanner_test.v index e9d248769a5892..ef9f7b7cc46623 100644 --- a/vlib/strings/textscanner/textscanner_test.v +++ b/vlib/strings/textscanner/textscanner_test.v @@ -31,6 +31,15 @@ fn test_skip() { s.skip() assert s.next() == `c` assert s.next() == -1 + + s.reset() + assert s.peek() == `a` + s.skip() + assert s.peek() == `b` + s.skip() + assert s.peek() == `c` + s.skip() + assert s.peek() == -1 } fn test_skip_n() { @@ -38,6 +47,23 @@ fn test_skip_n() { s.skip_n(2) assert s.next() == `c` assert s.next() == -1 + + s.reset() + assert s.peek() == `a` + s.skip_n(2) + assert s.peek() == `c` + s.skip_n(2) + assert s.peek() == -1 + + s.reset() + assert s.peek() == `a` + s.skip_n(3) + assert s.peek() == -1 + + s.reset() + assert s.peek() == `a` + s.skip_n(4) + assert s.peek() == -1 } fn test_peek() {