diff --git a/lib/chibi/zlib.scm b/lib/chibi/zlib.scm new file mode 100644 index 00000000..3baa0c7b --- /dev/null +++ b/lib/chibi/zlib.scm @@ -0,0 +1,37 @@ + +;; Temporary hack, need to rewrite in pure Scheme. + +;;> Gzip compress a file in place, renaming with a .gz suffix. + +(define (gzip-file path) + (system "gzip" path)) + +;;> Gunzip decompress a file in place, removing any .gz suffix. + +(define (gunzip-file path) + (system "gzip" "-d" path)) + +;; Utility to filter a bytevector to a process and return the +;; accumulated output as a new bytevector. +(define (process-pipe-bytevector cmd bvec) + (call-with-process-io + cmd + (lambda (pid proc-in proc-out proc-err) + ;; This could overflow the pipe. + (write-bytevector bvec proc-in) + (close-output-port proc-in) + (let ((res (port->bytevector proc-out))) + (waitpid pid 0) + res)))) + +;;> Gzip compress a string or bytevector in memory. + +(define (gzip x) + (if (string? x) + (gzip (string->utf8 x)) + (process-pipe-bytevector '("gzip" "-c") x))) + +;;> Gunzip decompress a bytevector in memory. + +(define (gunzip bvec) + (process-pipe-bytevector '("gzip" "-c" "-d") bvec)) diff --git a/lib/chibi/zlib.sld b/lib/chibi/zlib.sld new file mode 100644 index 00000000..576b4515 --- /dev/null +++ b/lib/chibi/zlib.sld @@ -0,0 +1,5 @@ + +(define-library (chibi zlib) + (export gzip-file gunzip-file gzip gunzip) + (import (scheme base) (chibi io) (chibi process)) + (include "zlib.scm"))