Ludovic Courtès writes: > I’m not sure I follow. I think ‘make-lzip-input-port/compressed’ > corresponds to Example 2 in the manual (info "(lzlib) Examples"), > ‘make-lzip-output-port’ corresponds to Example 1, and > ‘make-lzip-input-port’ corresponds to Example 4 (with the exception that > ‘lzread!’ doesn’t call ‘lz-decompress-finished?’, but it has other means > to tell whether we’re done processing input.) Example 4 is: 1) LZ_decompress_open 2) go to step 5 if LZ_decompress_write_size returns 0 3) LZ_decompress_write 4) if no more data to write, call LZ_decompress_finish 5) LZ_decompress_read 5a) optionally, if LZ_decompress_member_finished returns 1, read final values for member with LZ_decompress_data_crc, etc. 6) go back to step 2 until LZ_decompress_finished returns 1 7) LZ_decompress_close In `lzread!', we don't call lz-decompress-finished? nor do we loop on lz-decompress-finished. This only works for decompression of single-member archive, but the documentation does not say that. --8<---------------cut here---------------start------------->8--- (match (get-bytevector-n port (lz-decompress-write-size decoder)) ((? eof-object? eof) eof) (bv (lz-decompress-write decoder bv))) --8<---------------cut here---------------end--------------->8--- In the above if lz-decompress-write-size returns 0, we won't be reading anything (infinite loop?). While I understand this should not happen in practice, the documentation of the library does not give such guarantees. Antonio told me that explicitly. --8<---------------cut here---------------start------------->8--- (match (lz-decompress-read decoder bv start (- count read)) (0 (if (eof-object? (feed-decoder! decoder)) read (loop read start))) --8<---------------cut here---------------end--------------->8--- I'm not sure I understand the above: if we read nothing, then we try again? This might loop forever. What do you think? -- Pierre Neidhardt https://ambrevar.xyz/