Skip to content

Commit 186d35f

Browse files
authored
io.string_reader: fix fill_buffer_until(), add tests (#25685)
1 parent fdf28bb commit 186d35f

File tree

2 files changed

+55
-4
lines changed

2 files changed

+55
-4
lines changed

vlib/io/string_reader/string_reader.v

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,12 @@ pub fn (mut r StringReader) fill_buffer_until(n int) !int {
114114
}
115115

116116
mut end := start
117+
defer {
118+
// shrink the length of the buffer to the total of bytes read
119+
r.builder.go_back(r.builder.len - end)
120+
}
117121
for {
118-
read := reader.read(mut r.builder[start..]) or {
122+
read := reader.read(mut r.builder[end..]) or {
119123
r.end_of_stream = true
120124
break
121125
}
@@ -124,10 +128,11 @@ pub fn (mut r StringReader) fill_buffer_until(n int) !int {
124128
if read == 0 || end - start == n {
125129
break
126130
} else if r.builder.len == end {
127-
if n - end > io.read_all_grow_len {
131+
remaining := n - (end - start)
132+
if remaining > io.read_all_grow_len {
128133
unsafe { r.builder.grow_len(io.read_all_grow_len) }
129134
} else {
130-
unsafe { r.builder.grow_len(n - end) }
135+
unsafe { r.builder.grow_len(remaining) }
131136
}
132137
}
133138
}

vlib/io/string_reader/string_reader_test.v

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ fn (mut r TwoByteReader) read(mut buf []u8) !int {
2828
if r.pos >= r.data.len {
2929
return io.Eof{}
3030
}
31-
min := int_min(r.data.len - r.pos, 2)
31+
min := int_min(int_min(r.data.len - r.pos, 2), buf.len)
3232
for i in 0 .. min {
3333
buf[i] = r.data[r.pos]
3434
r.pos++
@@ -158,3 +158,49 @@ fn test_fill_buffer_false() {
158158
assert reader.fill_buffer(false)! == 2
159159
assert reader.get_string() == '12'
160160
}
161+
162+
fn test_fill_buffer_until() {
163+
mut two := TwoByteReader{
164+
data: '12345'
165+
}
166+
mut reader := StringReader.new(reader: two)
167+
assert reader.fill_buffer_until(1)! == 1
168+
assert reader.builder.len == 1
169+
assert reader.fill_buffer_until(2)! == 2
170+
assert reader.builder.len == 3
171+
assert reader.fill_buffer_until(2)! == 2
172+
assert reader.builder.len == 5
173+
assert reader.get_string() == '12345'
174+
}
175+
176+
fn test_fill_buffer_until_one() {
177+
mut two := TwoByteReader{
178+
data: '12345'
179+
}
180+
mut reader := StringReader.new(reader: two)
181+
assert reader.fill_buffer_until(1)! == 1
182+
assert reader.builder.len == 1
183+
assert reader.fill_buffer_until(1)! == 1
184+
assert reader.builder.len == 2
185+
assert reader.fill_buffer_until(1)! == 1
186+
assert reader.builder.len == 3
187+
assert reader.fill_buffer_until(1)! == 1
188+
assert reader.builder.len == 4
189+
assert reader.fill_buffer_until(1)! == 1
190+
assert reader.builder.len == 5
191+
assert reader.get_string() == '12345'
192+
}
193+
194+
fn test_fill_buffer_until_many() {
195+
mut two := TwoByteReader{
196+
data: '12345'
197+
}
198+
mut reader := StringReader.new(reader: two)
199+
assert reader.fill_buffer_until(1)! == 1
200+
assert reader.builder.len == 1
201+
assert reader.fill_buffer_until(12)! == 4
202+
assert reader.builder.len == 5
203+
assert reader.fill_buffer_until(123) or { -1 } == -1
204+
assert reader.builder.len == 5
205+
assert reader.get_string() == '12345'
206+
}

0 commit comments

Comments
 (0)