Skip to content

Commit 90bb995

Browse files
committed
Add decompress_buf method
1 parent 4586f77 commit 90bb995

File tree

1 file changed

+27
-6
lines changed

1 file changed

+27
-6
lines changed

src/isal/igzip_lib.pyx

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,30 @@ cdef class IgzipDecompressor:
298298
view_bitbuffer(&self.stream)
299299

300300
cdef unsigned char * decompress_buf(self, Py_ssize_t max_length):
301-
return NULL
301+
cdef Py_ssize_t data_size = 0
302+
cdef unsigned char * obuf
303+
cdef Py_ssize_t obuflen = DEF_BUF_SIZE_I
304+
cdef int err
305+
if obuflen > max_length:
306+
obuflen = max_length
307+
while True:
308+
obuflen = arrange_output_buffer_with_maximum(&self.stream, &obuf, obuflen, max_length)
309+
if obuflen == -1:
310+
raise MemoryError("Unsufficient memory for buffer allocation")
311+
elif obuflen == -2:
312+
break
313+
err = isal_inflate(&self.stream)
314+
data_size = self.stream.next_out - obuf
315+
if err != ISAL_DECOMP_OK:
316+
check_isal_inflate_rc(err)
317+
if self.stream.block_state == ISAL_BLOCK_FINISH:
318+
break
319+
elif self.avail_in_real == 0:
320+
break
321+
elif self.stream.avail_out == 0:
322+
if data_size == max_length:
323+
break
324+
return obuf
302325

303326
def decompress(self, data, Py_ssize_t max_length = 0):
304327
"""
@@ -330,15 +353,13 @@ cdef class IgzipDecompressor:
330353
cdef Py_ssize_t ibuflen = buffer.len
331354
cdef unsigned char * data_ptr = <unsigned char*>buffer.buf
332355

333-
cdef int err
356+
334357
cdef bint max_length_reached = False
335358
cdef unsigned char * tmp
336359
cdef size_t offset
337360
# Initialise output buffer
338361
cdef unsigned char *obuf = NULL
339-
cdef Py_ssize_t obuflen = DEF_BUF_SIZE_I
340-
if obuflen > hard_limit:
341-
obuflen = hard_limit
362+
342363
try:
343364
if self.stream.next_in != NULL:
344365
avail_now = (self.input_buffer + self.input_buffer_size) - \
@@ -365,7 +386,7 @@ cdef class IgzipDecompressor:
365386
self.avail_in_real = ibuflen
366387
input_buffer_in_use = 0
367388

368-
obuf = self.decompress_buf(max_length)
389+
obuf = self.decompress_buf(hard_limit)
369390
if obuf == NULL:
370391
self.stream.next_in = NULL
371392
return b""

0 commit comments

Comments
 (0)