#| Chicken Scheme bindings for the Blosc compression library. Written for Chicken Scheme by Ivan Raikov. |# (module blosc ( initialize! compress compress! decompress decompress! sizes set-nthreads! set-compressor! free-resources! version-format max-threads max-overhead ) (import scheme chicken foreign) (require-extension srfi-4) (import (only extras printf)) ; (only srfi-4 make-u32vector u32vector->list subu8vector blob->u8vector/shared u8vector->blob/shared)) #> #include #include #include #include #include #define C_bytevector_length(x) (C_header_size(x)) <# (define version-format (foreign-value "BLOSC_VERSION_FORMAT" int)) (define max-overhead (foreign-value "BLOSC_MAX_OVERHEAD" int)) (define do-shuffle (foreign-value "BLOSC_DOSHUFFLE" int)) (define mem-cpyed (foreign-value "BLOSC_MEMCPYED" int)) (define max-threads (foreign-value "BLOSC_MAX_THREADS" int)) (define max-typesize 255) (define max-buffersize 4294967295) ;; Initializes the BLOSC compressor (define (initialize!) ((foreign-lambda* void () #<= 0); C_return (result); END )) (define (compress! dest src #!key (level 5) (shuffle #t) (itemsize 1)) (if (< itemsize 0) (error 'compress! "item size must be positive")) (if (or (< level 0) (> level 9)) (error 'compress! "level must be between 0 and 9, inclusive")) (blosc-compress level (if shuffle 1 0) itemsize dest src)) (define (compress src #!key (level 5) (shuffle #t) (itemsize 1)) (assert (< 0 (blob-size src))) (let* ((dest (make-blob (+ (blob-size src) max-overhead))) (sz (compress! dest src level: level shuffle: shuffle itemsize: itemsize))) (u8vector->blob/shared (subu8vector (blob->u8vector/shared dest) 0 sz)))) ;; Given a compressed buffer, return the (uncompressed, compressed, block) size (define cbuffer-sizes (foreign-safe-lambda* void ((scheme-object buffer) (u32vector sizes)) #<list res) )) (define blosc-decompress (foreign-safe-lambda* int ((scheme-object dest) (scheme-object src)) #<= 0); C_return (result); END )) (define (decompress! dest src) (let* ((uncompressed-sz (car (sizes src))) (len (blob-size dest))) (if (not (<= uncompressed-sz len)) (error 'decompress! "destination buffer is too small")) (blosc-decompress dest src) dest)) (define (decompress src) (let* ((uncompressed-sz (car (sizes src)))) (decompress! (make-blob uncompressed-sz) src))) ;; Initialize a pool of threads for compression / decompression. ;; If `nthreads` is 1, the the serial version is chosen and a possible previous existing pool is ended. ;; If this function is not callled, `nthreads` is set to 1 internally. (define (set-nthreads! n) ((foreign-lambda* void ((int n)) #<