(module lzma (compress decompress) (import scheme) (import chicken) (import foreign) (use lolevel) (foreign-declare "#include ") (foreign-declare "static int lzma_return_buffer_len;") (define-foreign-variable lzma-return-buffer-len int "lzma_return_buffer_len") (define _decompress (foreign-lambda* c-pointer ((blob inblob) (int inlen)) "C_return (lzma_decompress(inblob, inlen, &lzma_return_buffer_len));")) (define _compress (foreign-lambda* c-pointer ((blob inblob) (int inlen)) "C_return (lzma_compress(inblob, inlen, &lzma_return_buffer_len));")) (define _free (foreign-lambda void "lzma_free" c-pointer)) (define (decompress inblob) (and-let* ((ptr (_decompress inblob (blob-size inblob))) (outblob (make-blob lzma-return-buffer-len))) (move-memory! ptr outblob lzma-return-buffer-len) (_free ptr) outblob)) (define (compress inblob) (and-let* ((ptr (_compress inblob (blob-size inblob))) (outblob (make-blob lzma-return-buffer-len))) (move-memory! ptr outblob lzma-return-buffer-len) (_free ptr) outblob)))