143143# Methods
144144# -------
145145
146- function TranscodingStreams. initialize (codec:: DecompressorCodec )
147- code = inflate_init! (codec. zstream, codec. windowbits)
148- if code != Z_OK
149- zerror (codec. zstream, code)
150- end
151- return
152- end
153-
154146function TranscodingStreams. finalize (codec:: DecompressorCodec )
155147 zstream = codec. zstream
156148 if zstream. state != C_NULL
@@ -162,18 +154,42 @@ function TranscodingStreams.finalize(codec::DecompressorCodec)
162154 return
163155end
164156
165- function TranscodingStreams. startproc (codec:: DecompressorCodec , :: Symbol , error:: Error )
166- code = inflate_reset! (codec. zstream)
167- if code == Z_OK
168- return :ok
157+ function TranscodingStreams. startproc (codec:: DecompressorCodec , :: Symbol , error_ref:: Error )
158+ # indicate that no input data is being provided for future zlib compat
159+ codec. zstream. next_in = C_NULL
160+ codec. zstream. avail_in = 0
161+ if codec. zstream. state == C_NULL
162+ code = inflate_init! (codec. zstream, codec. windowbits)
163+ # errors in inflate_init! do not require clean up, so just throw
164+ if code == Z_OK
165+ return :ok
166+ elseif code == Z_MEM_ERROR
167+ throw (OutOfMemoryError ())
168+ elseif code == Z_STREAM_ERROR
169+ error (" Z_STREAM_ERROR: invalid parameter, this should be caught in the codec constructor" )
170+ elseif code == Z_VERSION_ERROR
171+ error (" Z_VERSION_ERROR: zlib library version is incompatible" )
172+ else
173+ error (" unexpected libz error code: $(code) " )
174+ end
169175 else
170- error[] = ErrorException (zlib_error_message (codec. zstream, code))
171- return :error
176+ code = inflate_reset! (codec. zstream)
177+ # errors in inflate_reset! do not require clean up, so just throw
178+ if code == Z_OK
179+ return :ok
180+ elseif code == Z_STREAM_ERROR
181+ error (" Z_STREAM_ERROR: the source stream state was inconsistent" )
182+ else
183+ error (" unexpected libz error code: $(code) " )
184+ end
172185 end
173186end
174187
175- function TranscodingStreams. process (codec:: DecompressorCodec , input:: Memory , output:: Memory , error :: Error )
188+ function TranscodingStreams. process (codec:: DecompressorCodec , input:: Memory , output:: Memory , error_ref :: Error )
176189 zstream = codec. zstream
190+ if zstream. state == C_NULL
191+ error (" startproc must be called before process" )
192+ end
177193 zstream. next_in = input. ptr
178194
179195 avail_in = min (input. size, typemax (UInt32))
@@ -182,14 +198,20 @@ function TranscodingStreams.process(codec::DecompressorCodec, input::Memory, out
182198 avail_out = min (output. size, typemax (UInt32))
183199 zstream. avail_out = avail_out
184200 code = inflate! (zstream, Z_NO_FLUSH)
201+ @assert code != Z_STREAM_ERROR # state not clobbered
185202 Δin = Int (avail_in - zstream. avail_in)
186203 Δout = Int (avail_out - zstream. avail_out)
187204 if code == Z_OK
188205 return Δin, Δout, :ok
189206 elseif code == Z_STREAM_END
190207 return Δin, Δout, :end
208+ elseif code == Z_MEM_ERROR
209+ throw (OutOfMemoryError ())
210+ elseif code == Z_BUF_ERROR && iszero (input. size)
211+ error_ref[] = ZlibError (" the compressed stream may be truncated" )
212+ return Δin, Δout, :error
191213 else
192- error [] = ErrorException (zlib_error_message (zstream, code))
214+ error_ref [] = ZlibError (zlib_error_message (zstream, code))
193215 return Δin, Δout, :error
194216 end
195217end
0 commit comments