library(zlib)
provides a binding to the
zlib general purpose
compression library. The prolog library aims as seamlessly reading and
writing files compatible to the gzip program as well as
compressed (network) communication.
Zlib is a widespread library implementing the RFC1950 (zlib wrapper), RFC1951 (deflate stream) and RFC1952 (gzip wrapper) compression standards. The SWI-Prolog binding is a foreign library that creates a compressed stream as a wrapper around a normal stream. Implemented this way, it can perform a wide variety of tasks:
The core predicate of the library is zopen/3.
The remainder of the functionality of library(zlib)
is
defined in Prolog and can be used as a starting point for other
high-level primitives. See also ztest.pl
providing test and
demo code. This file is part of the source distribution.
Part of the functionality of this library can also be realised using the pipe interface and the gzip program. For example, a gziped file can also be opened in Prolog using the code below.
... open(pipe('gunzip < file.gz'), read, In), ...
The advantage of this library over using an external program for such tasks is enhanced platform independence and reduced time to open a file. Platform independence is improved as we do not have to worry about availability of the gunzip utility and we do not have to worry about shell and filename quoting issues. While the above replacement code works well on most modern Unix systems, it only works with special precautions on Windows.1Install gunzip, deal with Windows path-names, the windows shell and quoting.
The library becomes unavoidable if we consider compressed network communication. Here we get the stream from tcp_open_socket/3. The library provides efficient creation of a compressed stream, as well as support for flushing output through the standard Prolog flush_output/1 call.
Defined options on output streams are:
deflate
(default) or gzip
. The deflate
envelope is simple and short and is typically used for compressed
(network) communication. The gzip
envelope is compatible to
the gzip program and intended to read/write compressed files.true
, restart reading if the input is not at
end-of-file. The default is true
for gzip streams.
Generic options are:
true
(default), closing the compressed stream also
closes (and thus invalidates) the wrapped stream. If false
,
the wrapped stream is not closed. This can be used to
read/write a compressed ndata block as partial input/output on a stream.
gzopen
File, Mode, Stream,[].gzip
.
Using flush_output/1
on a compressed stream causes a
Z_SYNC_FLUSH
on the stream. Using close/1
on a compressed stream causes a Z_FINISH
on the stream. If
the stream uses the gzip
format, a gzip compatible
footer is written to the stream. If close_parent
is set
(default) the underlying stream is closed too. Otherwise it remains open
and the user can continue communication in non-compressed format or
reopen the stream for compression using zopen/3.