820af1e078
Introduces a new utility function `ZSTD_findFrameCompressedSize_internal` which is equivalent to `ZSTD_findFrameCompressSize`, but accepts an additional output parameter `bound` that computes an upper-bound for the compressed data in the frame. The new API function is named `ZSTD_decompressBound` to be consistent with `zstd_compressBound` (the inverse operation). Clients will now be able to compute an upper-bound for their compressed payloads instead of guessing a large size. Implements https://github.com/facebook/zstd/issues/1536. |
||
---|---|---|
.. | ||
common | ||
compress | ||
decompress | ||
deprecated | ||
dictBuilder | ||
dll/example | ||
legacy | ||
.gitignore | ||
BUCK | ||
libzstd.pc.in | ||
Makefile | ||
README.md | ||
zstd.h |
Zstandard library files
The lib directory is split into several sub-directories, in order to make it easier to select or exclude features.
Building
Makefile
script is provided, supporting Makefile conventions,
including commands variables, staged install, directory variables and standard targets.
make
: generates both static and dynamic librariesmake install
: install libraries and headers in target system directories
libzstd
default scope is pretty large, including compression, decompression, dictionary builder,
and support for decoding legacy formats >= v0.5.0.
The scope can be reduced on demand (see paragraph modular build).
Multithreading support
Multithreading is disabled by default when building with make
.
Enabling multithreading requires 2 conditions :
- set build macro
ZSTD_MULTITHREAD
(-DZSTD_MULTITHREAD
forgcc
) - for POSIX systems : compile with pthread (
-pthread
compilation flag forgcc
)
Both conditions are automatically applied when invoking make lib-mt
target.
When linking a POSIX program with a multithreaded version of libzstd
,
note that it's necessary to request the -pthread
flag during link stage.
Multithreading capabilities are exposed
via the advanced API defined in lib/zstd.h
.
This API is still labelled experimental,
but is expected to become "stable" in the near future.
API
Zstandard's stable API is exposed within lib/zstd.h.
Advanced API
Optional advanced features are exposed via :
-
lib/common/zstd_errors.h
: translatessize_t
function results into aZSTD_ErrorCode
, for accurate error handling. -
ZSTD_STATIC_LINKING_ONLY
: if this macro is defined before includingzstd.h
, it unlocks access to the experimental API, exposed in the second part ofzstd.h
. All definitions in the experimental APIs are unstable, they may still change in the future, or even be removed. As a consequence, experimental definitions shall never be used with dynamic library ! Only static linking is allowed.
Modular build
It's possible to compile only a limited set of features within libzstd
.
The file structure is designed to make this selection manually achievable for any build system :
-
Directory
lib/common
is always required, for all variants. -
Compression source code lies in
lib/compress
-
Decompression source code lies in
lib/decompress
-
It's possible to include only
compress
or onlydecompress
, they don't depend on each other. -
lib/dictBuilder
: makes it possible to generate dictionaries from a set of samples. The API is exposed inlib/dictBuilder/zdict.h
. This module depends on bothlib/common
andlib/compress
. -
lib/legacy
: makes it possible to decompress legacy zstd formats, starting fromv0.1.0
. This module depends onlib/common
andlib/decompress
. To enable this feature, defineZSTD_LEGACY_SUPPORT
during compilation. Specifying a number limits versions supported to that version onward. For example,ZSTD_LEGACY_SUPPORT=2
means : "support legacy formats >= v0.2.0". Conversely,ZSTD_LEGACY_SUPPORT=0
means "do not support legacy formats". By default, this build macro is set asZSTD_LEGACY_SUPPORT=5
. Decoding supported legacy format is a transparent capability triggered within decompression functions. It's also allowed to invoke legacy API directly, exposed inlib/legacy/zstd_legacy.h
. Each version does also provide its own set of advanced API. For example, advanced API for versionv0.4
is exposed inlib/legacy/zstd_v04.h
. -
While invoking
make libzstd
, it's possible to define build macrosZSTD_LIB_COMPRESSION, ZSTD_LIB_DECOMPRESSION
,ZSTD_LIB_DICTBUILDER
, andZSTD_LIB_DEPRECATED
as0
to forgo compilation of the corresponding features. This will also disable compilation of all dependencies (eg.ZSTD_LIB_COMPRESSION=0
will also disable dictBuilder). -
There are some additional build macros that can be used to minify the decoder.
Zstandard often has more than one implementation of a piece of functionality, where each implementation optimizes for different scenarios. For example, the Huffman decoder has complementary implementations that decode the stream one symbol at a time or two symbols at a time. Zstd normally includes both (and dispatches between them at runtime), but by defining
HUF_FORCE_DECOMPRESS_X1
orHUF_FORCE_DECOMPRESS_X2
, you can force the use of one or the other, avoiding compilation of the other. Similarly,ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT
andZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG
force the compilation and use of only one or the other of two decompression implementations. The smallest binary is achieved by usingHUF_FORCE_DECOMPRESS_X1
andZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT
.For squeezing the last ounce of size out, you can also define
ZSTD_NO_INLINE
, which disables inlining, andZSTD_STRIP_ERROR_STRINGS
, which removes the error messages that are otherwise returned byZSTD_getErrorName
.
Windows : using MinGW+MSYS to create DLL
DLL can be created using MinGW+MSYS with the make libzstd
command.
This command creates dll\libzstd.dll
and the import library dll\libzstd.lib
.
The import library is only required with Visual C++.
The header file zstd.h
and the dynamic library dll\libzstd.dll
are required to
compile a project using gcc/MinGW.
The dynamic library has to be added to linking options.
It means that if a project that uses ZSTD consists of a single test-dll.c
file it should be linked with dll\libzstd.dll
. For example:
gcc $(CFLAGS) -Iinclude/ test-dll.c -o test-dll dll\libzstd.dll
The compiled executable will require ZSTD DLL which is available at dll\libzstd.dll
.
Deprecated API
Obsolete API on their way out are stored in directory lib/deprecated
.
At this stage, it contains older streaming prototypes, in lib/deprecated/zbuff.h
.
These prototypes will be removed in some future version.
Consider migrating code towards supported streaming API exposed in zstd.h
.
Miscellaneous
The other files are not source code. There are :
BUCK
: support forbuck
build system (https://buckbuild.com/)Makefile
:make
script to build and install zstd library (static and dynamic)README.md
: this filedll/
: resources directory for Windows compilationlibzstd.pc.in
: script forpkg-config
(used inmake install
)