From 65d558b8ccfb472c67784a209c4acde0212d687c Mon Sep 17 00:00:00 2001 From: "Steven G. Johnson" Date: Wed, 12 Jul 2023 19:03:29 -0400 Subject: [PATCH 1/2] don't forget to shift anchor at end of buffer --- src/bufferedinputstream.jl | 5 +++-- test/runtests.jl | 9 +++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/bufferedinputstream.jl b/src/bufferedinputstream.jl index 722b207..466d7aa 100644 --- a/src/bufferedinputstream.jl +++ b/src/bufferedinputstream.jl @@ -81,10 +81,11 @@ function shiftdata!(stream::BufferedInputStream) if stream.immobilized return 0 else - if stream.anchor > 0 && stream.available - stream.anchor + 1 > 0 + if stream.anchor > 0 + @assert stream.position ≥ stream.anchor # negative seek is not currently allowed shift = stream.anchor - 1 n = stream.available - shift - copyto!(stream.buffer, 1, stream.buffer, stream.anchor, n) + n > 0 && copyto!(stream.buffer, 1, stream.buffer, stream.anchor, n) stream.anchor -= shift elseif stream.available - stream.position + 1 > 0 shift = stream.position - 1 diff --git a/test/runtests.jl b/test/runtests.jl index 0800edd..aca5b74 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -255,6 +255,15 @@ end end @test all(Bool[test_anchor() for _ in 1:100]) + + # issue #78 + let io = BufferedInputStream(IOBuffer("α∆"), 1) + @test read(io, Char) == 'α' + mark(io) + @test [read(io, UInt8) for _=1:3] == [0xe2, 0x88, 0x86] + reset(io) + @test read(io, Char) == '∆' + end end @testset "seek" begin From beba2f65c0a2c9c22849ce19e5721a6f34cce843 Mon Sep 17 00:00:00 2001 From: "Steven G. Johnson" Date: Wed, 12 Jul 2023 19:10:35 -0400 Subject: [PATCH 2/2] rm incorrect comment --- src/bufferedinputstream.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bufferedinputstream.jl b/src/bufferedinputstream.jl index 466d7aa..3eaeb90 100644 --- a/src/bufferedinputstream.jl +++ b/src/bufferedinputstream.jl @@ -82,7 +82,7 @@ function shiftdata!(stream::BufferedInputStream) return 0 else if stream.anchor > 0 - @assert stream.position ≥ stream.anchor # negative seek is not currently allowed + @assert stream.position ≥ stream.anchor shift = stream.anchor - 1 n = stream.available - shift n > 0 && copyto!(stream.buffer, 1, stream.buffer, stream.anchor, n)