zstd bindings for Chicken Scheme
- zstd version 1.4.0+.
Hosted here.
[procedure] (zstd-compress src #!key (level 3))
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].
[procedure] (zstd-decompress trg)
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.
[procedure] (zstd-frame-content-size frame)
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
.
[procedure] (compressing-output-port output-port #!key (level 3)) => output-port
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].
[procedure] (decompressing-input-port input-port) => input-port
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
.
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))))
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 -
- This egg does not support the dictionary features of the zstd C API.
- This egg does not support re-using
z-stream
contexts.