guix: Simplify and robustify lzread!.
* guix/lzlib.scm (lzread!): Do it. Previously lzread! would fail if COUNT was bigger than (lz-decompress-write-size). This is possible if a previous call to lzread! didn't empty the LZ_decompress input buffer (e.g. BV was too small to fit all the data).
This commit is contained in:
parent
dbef9015db
commit
ecfc54403e
|
@ -491,27 +491,19 @@ perhaps not yet read."
|
||||||
|
|
||||||
|
|
||||||
;; High level functions.
|
;; High level functions.
|
||||||
(define %lz-decompress-input-buffer-size (* 64 1024))
|
|
||||||
|
|
||||||
(define* (lzread! decoder file-port bv
|
(define* (lzread! decoder file-port bv
|
||||||
#:optional (start 0) (count (bytevector-length bv)))
|
#:optional (start 0) (count (bytevector-length bv)))
|
||||||
"Read up to COUNT bytes from FILE-PORT into BV at offset START. Return the
|
"Read up to COUNT bytes from FILE-PORT into BV at offset START. Return the
|
||||||
number of uncompressed bytes actually read; it is zero if COUNT is zero or if
|
number of uncompressed bytes actually read; it is zero if COUNT is zero or if
|
||||||
the end-of-stream has been reached."
|
the end-of-stream has been reached."
|
||||||
;; WARNING: Because we don't alternate between lz-reads and lz-writes, we can't
|
;; WARNING: Because we don't alternate between lz-reads and lz-writes, we can't
|
||||||
;; process more than %lz-decompress-input-buffer-size from the file-port.
|
;; process more than lz-decompress-write-size from the file-port.
|
||||||
(when (> count %lz-decompress-input-buffer-size)
|
(when (> count (lz-decompress-write-size decoder))
|
||||||
(set! count %lz-decompress-input-buffer-size))
|
(set! count (lz-decompress-write-size decoder)))
|
||||||
(let* ((written 0)
|
(let ((file-bv (get-bytevector-n file-port count)))
|
||||||
(read 0)
|
|
||||||
(file-bv (get-bytevector-n file-port count)))
|
|
||||||
(unless (eof-object? file-bv)
|
(unless (eof-object? file-bv)
|
||||||
(begin
|
(lz-decompress-write decoder file-bv 0 (bytevector-length file-bv))))
|
||||||
(while (and (< 0 (lz-decompress-write-size decoder))
|
(let ((read 0))
|
||||||
(< written (bytevector-length file-bv)))
|
|
||||||
(set! written (+ written
|
|
||||||
(lz-decompress-write decoder file-bv written
|
|
||||||
(- (bytevector-length file-bv) written)))))))
|
|
||||||
(let loop ((rd 0))
|
(let loop ((rd 0))
|
||||||
(if (< start (bytevector-length bv))
|
(if (< start (bytevector-length bv))
|
||||||
(begin
|
(begin
|
||||||
|
|
Loading…
Reference in New Issue