(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) (let ((ptr (_decompress inblob (blob-size inblob)))) (if (null-pointer? ptr) #f (let ((outblob (make-blob lzma-return-buffer-len))) (begin (move-memory! ptr outblob lzma-return-buffer-len) (_free ptr) outblob))))) (define (compress inblob) (let ((ptr (_compress inblob (blob-size inblob)))) (if (null-pointer? ptr) #f (let ((outblob (make-blob lzma-return-buffer-len))) (begin (move-memory! ptr outblob lzma-return-buffer-len) (_free ptr) outblob))))))