zstd bindings for Chicken Scheme
TOC »
Requirements
- zstd version 1.4.0+.
Source Code
Hosted here.
API
- zstd-compress src #!key (level 3)procedure
Compress the string or blob src, returning the entire compressed frame as a string. This is faster than using ports but may not be suitable for large inputs.
If level is supplied, it sets the compression level as documented by man zstd, and should be an integer in the range [1-19].
- zstd-decompress trgprocedure
Decompress the string or blob trg, which must be a valid zstd frame. Returns the uncompressed data as a string.
Note that zstd-decompress cannot decompress data from the port-based API, because the frame sizes are unknown ahead of time. It is therefore safest to always decompress using the port-based API.
- zstd-frame-content-size frameprocedure
Return the size of the uncompressed data stored in frame in number of bytes, or #f if the frame size is unknown. The port-based API will produce frames of unknown sizes. frame can only be decompressed using zstd-decompress if this function returns non-#f.
- compressing-output-port output-port #!key (level 3)procedure
Returns an output-port to which uncompressed data can be written, and its compressed form will be written to output-port. It is important to close this port in order to flush internal zstd buffers. Closing this output-port does not close output-port.
If level is supplied, it sets the compression level as documented by man zstd, and should be an integer in the range [1-19].
- decompressing-input-port input-portprocedure
Returns an input-port from which uncompressed data can be read. Compressed data read, from input-port, will be read in the process. Closing this input-port does not close input-port.
Examples
Some very basic usage for illustration.
(import zstd chicken.process chicken.io chicken.port) (with-input-from-pipe ;; => "hello hello hello\n" "echo hello hello hello | zstd" (lambda () (with-input-from-port (decompressing-input-port) read-string))) (with-output-to-pipe ;; prints "hello world" to stdout "zstd -d" (lambda () (current-output-port (compressing-output-port)) (print "hello world") (close-output-port (current-output-port))))
Example code for benchmarking and testing
The code under ./examples may be useful to try things out and compare against the zstd command-line-tool.
> cd examples > make csc hello.scm csc zstd.scm csc unzstd.scm > ./hello | pv -cNu | sha1sum u: 18.0MiB 0:00:00 [47.2MiB/s] 7c363606a232e640bb0f9dce8b0023a78f7059ba - > ./hello | pv -cNu | ./zstd -1 | pv -cNz | ./unzstd | sha1sum u: 18.0MiB 0:00:00 [46.2MiB/s] z: 343KiB 0:00:00 [ 879KiB/s] 7c363606a232e640bb0f9dce8b0023a78f7059ba - > ./hello | pv -cNu | ./zstd -22 | pv -cNz | ./unzstd | sha1sum u: 18.0MiB 0:00:22 [ 828KiB/s] z: 115KiB 0:00:22 [5.15KiB/s] 7c363606a232e640bb0f9dce8b0023a78f7059ba - > ./hello | pv -cNu | zstd -1 | pv -cNz | unzstd | sha1sum u: 18.0MiB 0:00:00 [46.5MiB/s] z: 486KiB 0:00:00 [1.22MiB/s] 7c363606a232e640bb0f9dce8b0023a78f7059ba -
Development status
- This egg does not support the dictionary features of the zstd C API.
- This egg does not support re-using z-stream contexts.