diff --git a/src/bufferedinputstream.jl b/src/bufferedinputstream.jl index 722b207..3eaeb90 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 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