From e5be04e8d1bdf230c91359474b6b10a19751c780 Mon Sep 17 00:00:00 2001 From: J S <49557684+svilupp@users.noreply.github.com> Date: Thu, 9 Mar 2023 11:29:52 +0000 Subject: [PATCH 1/2] proposed mutating interface --- src/TranscodingStreams.jl | 3 +++ src/transcode.jl | 44 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/src/TranscodingStreams.jl b/src/TranscodingStreams.jl index e1d96946..a2780d98 100644 --- a/src/TranscodingStreams.jl +++ b/src/TranscodingStreams.jl @@ -7,6 +7,9 @@ export const ByteData = Union{Vector{UInt8},Base.CodeUnits{UInt8}} +# in-place variant of transcode when output buffer size is known +function transcode! end + include("memory.jl") include("buffer.jl") include("error.jl") diff --git a/src/transcode.jl b/src/transcode.jl index 6043853d..14cf88af 100644 --- a/src/transcode.jl +++ b/src/transcode.jl @@ -129,3 +129,47 @@ function initial_output_size(codec::Codec, input::Memory) 8, # just in case where both minoutsize and expectedsize are foolish ) end +# Mutates the provided output buffer. Useful for cases when output size is known. +# Removed `makemargin!(output, n)` as it's not necessary +function transcode!(codec::Codec, data::ByteData,output::Buffer) + input = Buffer(data) + error = Error() + code = startproc(codec, :write, error) + if code === :error + @goto error + end + n = minoutsize(codec, buffermem(input)) + @label process + Δin, Δout, code = process(codec, buffermem(input), marginmem(output), error) + @debug( + "called process()", + code = code, + input_size = buffersize(input), + output_size = marginsize(output), + input_delta = Δin, + output_delta = Δout, + ) + consumed!(input, Δin) + supplied!(output, Δout) + if code === :error + @goto error + elseif code === :end + if buffersize(input) > 0 + if startproc(codec, :write, error) === :error + @goto error + end + n = minoutsize(codec, buffermem(input)) + @goto process + end + resize!(output.data, output.marginpos - 1) + return output.data + else + n = max(Δout, minoutsize(codec, buffermem(input))) + @goto process + end + @label error + if !haserror(error) + set_default_error!(error) + end + throw(error[]) +end \ No newline at end of file From e1639c044aff51e80611aa40e813dabf647f2a30 Mon Sep 17 00:00:00 2001 From: J S <49557684+svilupp@users.noreply.github.com> Date: Sun, 12 Mar 2023 16:24:33 +0000 Subject: [PATCH 2/2] removed calculation of the size of the next output buffer increase --- src/transcode.jl | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/transcode.jl b/src/transcode.jl index 14cf88af..ed03b51a 100644 --- a/src/transcode.jl +++ b/src/transcode.jl @@ -130,7 +130,6 @@ function initial_output_size(codec::Codec, input::Memory) ) end # Mutates the provided output buffer. Useful for cases when output size is known. -# Removed `makemargin!(output, n)` as it's not necessary function transcode!(codec::Codec, data::ByteData,output::Buffer) input = Buffer(data) error = Error() @@ -138,7 +137,6 @@ function transcode!(codec::Codec, data::ByteData,output::Buffer) if code === :error @goto error end - n = minoutsize(codec, buffermem(input)) @label process Δin, Δout, code = process(codec, buffermem(input), marginmem(output), error) @debug( @@ -158,13 +156,11 @@ function transcode!(codec::Codec, data::ByteData,output::Buffer) if startproc(codec, :write, error) === :error @goto error end - n = minoutsize(codec, buffermem(input)) @goto process end resize!(output.data, output.marginpos - 1) return output.data else - n = max(Δout, minoutsize(codec, buffermem(input))) @goto process end @label error