mirror of
https://github.com/Sarsoo/csbindgen.git
synced 2024-12-22 22:46:26 +00:00
initial code
This commit is contained in:
parent
6e442da24e
commit
4ac772ad22
6
.gitignore
vendored
Normal file
6
.gitignore
vendored
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
/target
|
||||||
|
/Cargo.lock
|
||||||
|
|
||||||
|
.vs/
|
||||||
|
dotnet-sandbox/obj/
|
||||||
|
dotnet-sandbox/bin/
|
43
.vscode/launch.json
vendored
Normal file
43
.vscode/launch.json
vendored
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
{
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"type": "lldb",
|
||||||
|
"request": "launch",
|
||||||
|
"name": "Debug unit tests in library 'csbindgen'",
|
||||||
|
"cargo": {
|
||||||
|
"args": [
|
||||||
|
"test",
|
||||||
|
"--no-run",
|
||||||
|
"--lib",
|
||||||
|
"--package=csbindgen"
|
||||||
|
],
|
||||||
|
"filter": {
|
||||||
|
"name": "csbindgen",
|
||||||
|
"kind": "lib"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"args": [],
|
||||||
|
"cwd": "${workspaceFolder}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "lldb",
|
||||||
|
"request": "launch",
|
||||||
|
"name": "Debug unit tests in library 'csbindgen-tests'",
|
||||||
|
"cargo": {
|
||||||
|
"args": [
|
||||||
|
"test",
|
||||||
|
"--no-run",
|
||||||
|
"--lib",
|
||||||
|
"--package=csbindgen-tests"
|
||||||
|
],
|
||||||
|
"filter": {
|
||||||
|
"name": "csbindgen-tests",
|
||||||
|
"kind": "lib"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"args": [],
|
||||||
|
"cwd": "${workspaceFolder}"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
17
.vscode/tasks.json
vendored
Normal file
17
.vscode/tasks.json
vendored
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"version": "2.0.0",
|
||||||
|
"tasks": [
|
||||||
|
{
|
||||||
|
"type": "cargo",
|
||||||
|
"command": "build",
|
||||||
|
"problemMatcher": [
|
||||||
|
"$rustc"
|
||||||
|
],
|
||||||
|
"group": {
|
||||||
|
"kind": "build",
|
||||||
|
"isDefault": true
|
||||||
|
},
|
||||||
|
"label": "rust: cargo build"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
5
Cargo.toml
Normal file
5
Cargo.toml
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
[workspace]
|
||||||
|
members = [
|
||||||
|
"csbindgen",
|
||||||
|
"csbindgen-tests",
|
||||||
|
]
|
15
csbindgen-tests/Cargo.toml
Normal file
15
csbindgen-tests/Cargo.toml
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
[package]
|
||||||
|
name = "csbindgen-tests"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
crate-type = ["cdylib"]
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
csbindgen = { path = "../csbindgen" }
|
||||||
|
|
||||||
|
[build-dependencies]
|
||||||
|
cc = "1.0.79"
|
||||||
|
bindgen = "0.64.0"
|
||||||
|
csbindgen = { path = "../csbindgen" }
|
23
csbindgen-tests/build.rs
Normal file
23
csbindgen-tests/build.rs
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
#![feature(core_intrinsics)]
|
||||||
|
fn main() {
|
||||||
|
let bindings = bindgen::Builder::default()
|
||||||
|
.header("c/lz4/lz4.h")
|
||||||
|
.header("c/lz4/lz4hc.h")
|
||||||
|
.header("c/lz4/lz4frame.h")
|
||||||
|
.header("c/lz4/xxhash.h")
|
||||||
|
.generate()
|
||||||
|
.expect("Unable to generate bindings");
|
||||||
|
|
||||||
|
bindings
|
||||||
|
.write_to_file("src/lz4/mod.rs")
|
||||||
|
.expect("Couldn't write bindings!");
|
||||||
|
|
||||||
|
cc::Build::new().file("c/lz4/lz4.c").compile("lz4");
|
||||||
|
|
||||||
|
// TODO:write test
|
||||||
|
csbindgen::run(
|
||||||
|
"src/lz4/mod.rs",
|
||||||
|
"src/ffi.rs",
|
||||||
|
"../dotnet-sandbox/bindgen.cs",
|
||||||
|
)
|
||||||
|
}
|
2751
csbindgen-tests/c/lz4/lz4.c
Normal file
2751
csbindgen-tests/c/lz4/lz4.c
Normal file
File diff suppressed because it is too large
Load Diff
862
csbindgen-tests/c/lz4/lz4.h
Normal file
862
csbindgen-tests/c/lz4/lz4.h
Normal file
@ -0,0 +1,862 @@
|
|||||||
|
/*
|
||||||
|
* LZ4 - Fast LZ compression algorithm
|
||||||
|
* Header File
|
||||||
|
* Copyright (C) 2011-2020, Yann Collet.
|
||||||
|
|
||||||
|
BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are
|
||||||
|
met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above
|
||||||
|
copyright notice, this list of conditions and the following disclaimer
|
||||||
|
in the documentation and/or other materials provided with the
|
||||||
|
distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
You can contact the author at :
|
||||||
|
- LZ4 homepage : http://www.lz4.org
|
||||||
|
- LZ4 source repository : https://github.com/lz4/lz4
|
||||||
|
*/
|
||||||
|
#if defined (__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef LZ4_H_2983827168210
|
||||||
|
#define LZ4_H_2983827168210
|
||||||
|
|
||||||
|
/* --- Dependency --- */
|
||||||
|
#include <stddef.h> /* size_t */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Introduction
|
||||||
|
|
||||||
|
LZ4 is lossless compression algorithm, providing compression speed >500 MB/s per core,
|
||||||
|
scalable with multi-cores CPU. It features an extremely fast decoder, with speed in
|
||||||
|
multiple GB/s per core, typically reaching RAM speed limits on multi-core systems.
|
||||||
|
|
||||||
|
The LZ4 compression library provides in-memory compression and decompression functions.
|
||||||
|
It gives full buffer control to user.
|
||||||
|
Compression can be done in:
|
||||||
|
- a single step (described as Simple Functions)
|
||||||
|
- a single step, reusing a context (described in Advanced Functions)
|
||||||
|
- unbounded multiple steps (described as Streaming compression)
|
||||||
|
|
||||||
|
lz4.h generates and decodes LZ4-compressed blocks (doc/lz4_Block_format.md).
|
||||||
|
Decompressing such a compressed block requires additional metadata.
|
||||||
|
Exact metadata depends on exact decompression function.
|
||||||
|
For the typical case of LZ4_decompress_safe(),
|
||||||
|
metadata includes block's compressed size, and maximum bound of decompressed size.
|
||||||
|
Each application is free to encode and pass such metadata in whichever way it wants.
|
||||||
|
|
||||||
|
lz4.h only handle blocks, it can not generate Frames.
|
||||||
|
|
||||||
|
Blocks are different from Frames (doc/lz4_Frame_format.md).
|
||||||
|
Frames bundle both blocks and metadata in a specified manner.
|
||||||
|
Embedding metadata is required for compressed data to be self-contained and portable.
|
||||||
|
Frame format is delivered through a companion API, declared in lz4frame.h.
|
||||||
|
The `lz4` CLI can only manage frames.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*^***************************************************************
|
||||||
|
* Export parameters
|
||||||
|
*****************************************************************/
|
||||||
|
/*
|
||||||
|
* LZ4_DLL_EXPORT :
|
||||||
|
* Enable exporting of functions when building a Windows DLL
|
||||||
|
* LZ4LIB_VISIBILITY :
|
||||||
|
* Control library symbols visibility.
|
||||||
|
*/
|
||||||
|
#ifndef LZ4LIB_VISIBILITY
|
||||||
|
# if defined(__GNUC__) && (__GNUC__ >= 4)
|
||||||
|
# define LZ4LIB_VISIBILITY __attribute__ ((visibility ("default")))
|
||||||
|
# else
|
||||||
|
# define LZ4LIB_VISIBILITY
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
#if defined(LZ4_DLL_EXPORT) && (LZ4_DLL_EXPORT==1)
|
||||||
|
# define LZ4LIB_API __declspec(dllexport) LZ4LIB_VISIBILITY
|
||||||
|
#elif defined(LZ4_DLL_IMPORT) && (LZ4_DLL_IMPORT==1)
|
||||||
|
# define LZ4LIB_API __declspec(dllimport) LZ4LIB_VISIBILITY /* It isn't required but allows to generate better code, saving a function pointer load from the IAT and an indirect jump.*/
|
||||||
|
#else
|
||||||
|
# define LZ4LIB_API LZ4LIB_VISIBILITY
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*! LZ4_FREESTANDING :
|
||||||
|
* When this macro is set to 1, it enables "freestanding mode" that is
|
||||||
|
* suitable for typical freestanding environment which doesn't support
|
||||||
|
* standard C library.
|
||||||
|
*
|
||||||
|
* - LZ4_FREESTANDING is a compile-time switch.
|
||||||
|
* - It requires the following macros to be defined:
|
||||||
|
* LZ4_memcpy, LZ4_memmove, LZ4_memset.
|
||||||
|
* - It only enables LZ4/HC functions which don't use heap.
|
||||||
|
* All LZ4F_* functions are not supported.
|
||||||
|
* - See tests/freestanding.c to check its basic setup.
|
||||||
|
*/
|
||||||
|
#if defined(LZ4_FREESTANDING) && (LZ4_FREESTANDING == 1)
|
||||||
|
# define LZ4_HEAPMODE 0
|
||||||
|
# define LZ4HC_HEAPMODE 0
|
||||||
|
# define LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION 1
|
||||||
|
# if !defined(LZ4_memcpy)
|
||||||
|
# error "LZ4_FREESTANDING requires macro 'LZ4_memcpy'."
|
||||||
|
# endif
|
||||||
|
# if !defined(LZ4_memset)
|
||||||
|
# error "LZ4_FREESTANDING requires macro 'LZ4_memset'."
|
||||||
|
# endif
|
||||||
|
# if !defined(LZ4_memmove)
|
||||||
|
# error "LZ4_FREESTANDING requires macro 'LZ4_memmove'."
|
||||||
|
# endif
|
||||||
|
#elif ! defined(LZ4_FREESTANDING)
|
||||||
|
# define LZ4_FREESTANDING 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*------ Version ------*/
|
||||||
|
#define LZ4_VERSION_MAJOR 1 /* for breaking interface changes */
|
||||||
|
#define LZ4_VERSION_MINOR 9 /* for new (non-breaking) interface capabilities */
|
||||||
|
#define LZ4_VERSION_RELEASE 4 /* for tweaks, bug-fixes, or development */
|
||||||
|
|
||||||
|
#define LZ4_VERSION_NUMBER (LZ4_VERSION_MAJOR *100*100 + LZ4_VERSION_MINOR *100 + LZ4_VERSION_RELEASE)
|
||||||
|
|
||||||
|
#define LZ4_LIB_VERSION LZ4_VERSION_MAJOR.LZ4_VERSION_MINOR.LZ4_VERSION_RELEASE
|
||||||
|
#define LZ4_QUOTE(str) #str
|
||||||
|
#define LZ4_EXPAND_AND_QUOTE(str) LZ4_QUOTE(str)
|
||||||
|
#define LZ4_VERSION_STRING LZ4_EXPAND_AND_QUOTE(LZ4_LIB_VERSION) /* requires v1.7.3+ */
|
||||||
|
|
||||||
|
LZ4LIB_API int LZ4_versionNumber (void); /**< library version number; useful to check dll version; requires v1.3.0+ */
|
||||||
|
LZ4LIB_API const char* LZ4_versionString (void); /**< library version string; useful to check dll version; requires v1.7.5+ */
|
||||||
|
|
||||||
|
|
||||||
|
/*-************************************
|
||||||
|
* Tuning parameter
|
||||||
|
**************************************/
|
||||||
|
#define LZ4_MEMORY_USAGE_MIN 10
|
||||||
|
#define LZ4_MEMORY_USAGE_DEFAULT 14
|
||||||
|
#define LZ4_MEMORY_USAGE_MAX 20
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* LZ4_MEMORY_USAGE :
|
||||||
|
* Memory usage formula : N->2^N Bytes (examples : 10 -> 1KB; 12 -> 4KB ; 16 -> 64KB; 20 -> 1MB; )
|
||||||
|
* Increasing memory usage improves compression ratio, at the cost of speed.
|
||||||
|
* Reduced memory usage may improve speed at the cost of ratio, thanks to better cache locality.
|
||||||
|
* Default value is 14, for 16KB, which nicely fits into Intel x86 L1 cache
|
||||||
|
*/
|
||||||
|
#ifndef LZ4_MEMORY_USAGE
|
||||||
|
# define LZ4_MEMORY_USAGE LZ4_MEMORY_USAGE_DEFAULT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (LZ4_MEMORY_USAGE < LZ4_MEMORY_USAGE_MIN)
|
||||||
|
# error "LZ4_MEMORY_USAGE is too small !"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (LZ4_MEMORY_USAGE > LZ4_MEMORY_USAGE_MAX)
|
||||||
|
# error "LZ4_MEMORY_USAGE is too large !"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*-************************************
|
||||||
|
* Simple Functions
|
||||||
|
**************************************/
|
||||||
|
/*! LZ4_compress_default() :
|
||||||
|
* Compresses 'srcSize' bytes from buffer 'src'
|
||||||
|
* into already allocated 'dst' buffer of size 'dstCapacity'.
|
||||||
|
* Compression is guaranteed to succeed if 'dstCapacity' >= LZ4_compressBound(srcSize).
|
||||||
|
* It also runs faster, so it's a recommended setting.
|
||||||
|
* If the function cannot compress 'src' into a more limited 'dst' budget,
|
||||||
|
* compression stops *immediately*, and the function result is zero.
|
||||||
|
* In which case, 'dst' content is undefined (invalid).
|
||||||
|
* srcSize : max supported value is LZ4_MAX_INPUT_SIZE.
|
||||||
|
* dstCapacity : size of buffer 'dst' (which must be already allocated)
|
||||||
|
* @return : the number of bytes written into buffer 'dst' (necessarily <= dstCapacity)
|
||||||
|
* or 0 if compression fails
|
||||||
|
* Note : This function is protected against buffer overflow scenarios (never writes outside 'dst' buffer, nor read outside 'source' buffer).
|
||||||
|
*/
|
||||||
|
LZ4LIB_API int LZ4_compress_default(const char* src, char* dst, int srcSize, int dstCapacity);
|
||||||
|
|
||||||
|
/*! LZ4_decompress_safe() :
|
||||||
|
* @compressedSize : is the exact complete size of the compressed block.
|
||||||
|
* @dstCapacity : is the size of destination buffer (which must be already allocated),
|
||||||
|
* is an upper bound of decompressed size.
|
||||||
|
* @return : the number of bytes decompressed into destination buffer (necessarily <= dstCapacity)
|
||||||
|
* If destination buffer is not large enough, decoding will stop and output an error code (negative value).
|
||||||
|
* If the source stream is detected malformed, the function will stop decoding and return a negative result.
|
||||||
|
* Note 1 : This function is protected against malicious data packets :
|
||||||
|
* it will never writes outside 'dst' buffer, nor read outside 'source' buffer,
|
||||||
|
* even if the compressed block is maliciously modified to order the decoder to do these actions.
|
||||||
|
* In such case, the decoder stops immediately, and considers the compressed block malformed.
|
||||||
|
* Note 2 : compressedSize and dstCapacity must be provided to the function, the compressed block does not contain them.
|
||||||
|
* The implementation is free to send / store / derive this information in whichever way is most beneficial.
|
||||||
|
* If there is a need for a different format which bundles together both compressed data and its metadata, consider looking at lz4frame.h instead.
|
||||||
|
*/
|
||||||
|
LZ4LIB_API int LZ4_decompress_safe (const char* src, char* dst, int compressedSize, int dstCapacity);
|
||||||
|
|
||||||
|
|
||||||
|
/*-************************************
|
||||||
|
* Advanced Functions
|
||||||
|
**************************************/
|
||||||
|
#define LZ4_MAX_INPUT_SIZE 0x7E000000 /* 2 113 929 216 bytes */
|
||||||
|
#define LZ4_COMPRESSBOUND(isize) ((unsigned)(isize) > (unsigned)LZ4_MAX_INPUT_SIZE ? 0 : (isize) + ((isize)/255) + 16)
|
||||||
|
|
||||||
|
/*! LZ4_compressBound() :
|
||||||
|
Provides the maximum size that LZ4 compression may output in a "worst case" scenario (input data not compressible)
|
||||||
|
This function is primarily useful for memory allocation purposes (destination buffer size).
|
||||||
|
Macro LZ4_COMPRESSBOUND() is also provided for compilation-time evaluation (stack memory allocation for example).
|
||||||
|
Note that LZ4_compress_default() compresses faster when dstCapacity is >= LZ4_compressBound(srcSize)
|
||||||
|
inputSize : max supported value is LZ4_MAX_INPUT_SIZE
|
||||||
|
return : maximum output size in a "worst case" scenario
|
||||||
|
or 0, if input size is incorrect (too large or negative)
|
||||||
|
*/
|
||||||
|
LZ4LIB_API int LZ4_compressBound(int inputSize);
|
||||||
|
|
||||||
|
/*! LZ4_compress_fast() :
|
||||||
|
Same as LZ4_compress_default(), but allows selection of "acceleration" factor.
|
||||||
|
The larger the acceleration value, the faster the algorithm, but also the lesser the compression.
|
||||||
|
It's a trade-off. It can be fine tuned, with each successive value providing roughly +~3% to speed.
|
||||||
|
An acceleration value of "1" is the same as regular LZ4_compress_default()
|
||||||
|
Values <= 0 will be replaced by LZ4_ACCELERATION_DEFAULT (currently == 1, see lz4.c).
|
||||||
|
Values > LZ4_ACCELERATION_MAX will be replaced by LZ4_ACCELERATION_MAX (currently == 65537, see lz4.c).
|
||||||
|
*/
|
||||||
|
LZ4LIB_API int LZ4_compress_fast (const char* src, char* dst, int srcSize, int dstCapacity, int acceleration);
|
||||||
|
|
||||||
|
|
||||||
|
/*! LZ4_compress_fast_extState() :
|
||||||
|
* Same as LZ4_compress_fast(), using an externally allocated memory space for its state.
|
||||||
|
* Use LZ4_sizeofState() to know how much memory must be allocated,
|
||||||
|
* and allocate it on 8-bytes boundaries (using `malloc()` typically).
|
||||||
|
* Then, provide this buffer as `void* state` to compression function.
|
||||||
|
*/
|
||||||
|
LZ4LIB_API int LZ4_sizeofState(void);
|
||||||
|
LZ4LIB_API int LZ4_compress_fast_extState (void* state, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration);
|
||||||
|
|
||||||
|
|
||||||
|
/*! LZ4_compress_destSize() :
|
||||||
|
* Reverse the logic : compresses as much data as possible from 'src' buffer
|
||||||
|
* into already allocated buffer 'dst', of size >= 'targetDestSize'.
|
||||||
|
* This function either compresses the entire 'src' content into 'dst' if it's large enough,
|
||||||
|
* or fill 'dst' buffer completely with as much data as possible from 'src'.
|
||||||
|
* note: acceleration parameter is fixed to "default".
|
||||||
|
*
|
||||||
|
* *srcSizePtr : will be modified to indicate how many bytes where read from 'src' to fill 'dst'.
|
||||||
|
* New value is necessarily <= input value.
|
||||||
|
* @return : Nb bytes written into 'dst' (necessarily <= targetDestSize)
|
||||||
|
* or 0 if compression fails.
|
||||||
|
*
|
||||||
|
* Note : from v1.8.2 to v1.9.1, this function had a bug (fixed un v1.9.2+):
|
||||||
|
* the produced compressed content could, in specific circumstances,
|
||||||
|
* require to be decompressed into a destination buffer larger
|
||||||
|
* by at least 1 byte than the content to decompress.
|
||||||
|
* If an application uses `LZ4_compress_destSize()`,
|
||||||
|
* it's highly recommended to update liblz4 to v1.9.2 or better.
|
||||||
|
* If this can't be done or ensured,
|
||||||
|
* the receiving decompression function should provide
|
||||||
|
* a dstCapacity which is > decompressedSize, by at least 1 byte.
|
||||||
|
* See https://github.com/lz4/lz4/issues/859 for details
|
||||||
|
*/
|
||||||
|
LZ4LIB_API int LZ4_compress_destSize (const char* src, char* dst, int* srcSizePtr, int targetDstSize);
|
||||||
|
|
||||||
|
|
||||||
|
/*! LZ4_decompress_safe_partial() :
|
||||||
|
* Decompress an LZ4 compressed block, of size 'srcSize' at position 'src',
|
||||||
|
* into destination buffer 'dst' of size 'dstCapacity'.
|
||||||
|
* Up to 'targetOutputSize' bytes will be decoded.
|
||||||
|
* The function stops decoding on reaching this objective.
|
||||||
|
* This can be useful to boost performance
|
||||||
|
* whenever only the beginning of a block is required.
|
||||||
|
*
|
||||||
|
* @return : the number of bytes decoded in `dst` (necessarily <= targetOutputSize)
|
||||||
|
* If source stream is detected malformed, function returns a negative result.
|
||||||
|
*
|
||||||
|
* Note 1 : @return can be < targetOutputSize, if compressed block contains less data.
|
||||||
|
*
|
||||||
|
* Note 2 : targetOutputSize must be <= dstCapacity
|
||||||
|
*
|
||||||
|
* Note 3 : this function effectively stops decoding on reaching targetOutputSize,
|
||||||
|
* so dstCapacity is kind of redundant.
|
||||||
|
* This is because in older versions of this function,
|
||||||
|
* decoding operation would still write complete sequences.
|
||||||
|
* Therefore, there was no guarantee that it would stop writing at exactly targetOutputSize,
|
||||||
|
* it could write more bytes, though only up to dstCapacity.
|
||||||
|
* Some "margin" used to be required for this operation to work properly.
|
||||||
|
* Thankfully, this is no longer necessary.
|
||||||
|
* The function nonetheless keeps the same signature, in an effort to preserve API compatibility.
|
||||||
|
*
|
||||||
|
* Note 4 : If srcSize is the exact size of the block,
|
||||||
|
* then targetOutputSize can be any value,
|
||||||
|
* including larger than the block's decompressed size.
|
||||||
|
* The function will, at most, generate block's decompressed size.
|
||||||
|
*
|
||||||
|
* Note 5 : If srcSize is _larger_ than block's compressed size,
|
||||||
|
* then targetOutputSize **MUST** be <= block's decompressed size.
|
||||||
|
* Otherwise, *silent corruption will occur*.
|
||||||
|
*/
|
||||||
|
LZ4LIB_API int LZ4_decompress_safe_partial (const char* src, char* dst, int srcSize, int targetOutputSize, int dstCapacity);
|
||||||
|
|
||||||
|
|
||||||
|
/*-*********************************************
|
||||||
|
* Streaming Compression Functions
|
||||||
|
***********************************************/
|
||||||
|
typedef union LZ4_stream_u LZ4_stream_t; /* incomplete type (defined later) */
|
||||||
|
|
||||||
|
/**
|
||||||
|
Note about RC_INVOKED
|
||||||
|
|
||||||
|
- RC_INVOKED is predefined symbol of rc.exe (the resource compiler which is part of MSVC/Visual Studio).
|
||||||
|
https://docs.microsoft.com/en-us/windows/win32/menurc/predefined-macros
|
||||||
|
|
||||||
|
- Since rc.exe is a legacy compiler, it truncates long symbol (> 30 chars)
|
||||||
|
and reports warning "RC4011: identifier truncated".
|
||||||
|
|
||||||
|
- To eliminate the warning, we surround long preprocessor symbol with
|
||||||
|
"#if !defined(RC_INVOKED) ... #endif" block that means
|
||||||
|
"skip this block when rc.exe is trying to read it".
|
||||||
|
*/
|
||||||
|
#if !defined(RC_INVOKED) /* https://docs.microsoft.com/en-us/windows/win32/menurc/predefined-macros */
|
||||||
|
#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION)
|
||||||
|
LZ4LIB_API LZ4_stream_t* LZ4_createStream(void);
|
||||||
|
LZ4LIB_API int LZ4_freeStream (LZ4_stream_t* streamPtr);
|
||||||
|
#endif /* !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*! LZ4_resetStream_fast() : v1.9.0+
|
||||||
|
* Use this to prepare an LZ4_stream_t for a new chain of dependent blocks
|
||||||
|
* (e.g., LZ4_compress_fast_continue()).
|
||||||
|
*
|
||||||
|
* An LZ4_stream_t must be initialized once before usage.
|
||||||
|
* This is automatically done when created by LZ4_createStream().
|
||||||
|
* However, should the LZ4_stream_t be simply declared on stack (for example),
|
||||||
|
* it's necessary to initialize it first, using LZ4_initStream().
|
||||||
|
*
|
||||||
|
* After init, start any new stream with LZ4_resetStream_fast().
|
||||||
|
* A same LZ4_stream_t can be re-used multiple times consecutively
|
||||||
|
* and compress multiple streams,
|
||||||
|
* provided that it starts each new stream with LZ4_resetStream_fast().
|
||||||
|
*
|
||||||
|
* LZ4_resetStream_fast() is much faster than LZ4_initStream(),
|
||||||
|
* but is not compatible with memory regions containing garbage data.
|
||||||
|
*
|
||||||
|
* Note: it's only useful to call LZ4_resetStream_fast()
|
||||||
|
* in the context of streaming compression.
|
||||||
|
* The *extState* functions perform their own resets.
|
||||||
|
* Invoking LZ4_resetStream_fast() before is redundant, and even counterproductive.
|
||||||
|
*/
|
||||||
|
LZ4LIB_API void LZ4_resetStream_fast (LZ4_stream_t* streamPtr);
|
||||||
|
|
||||||
|
/*! LZ4_loadDict() :
|
||||||
|
* Use this function to reference a static dictionary into LZ4_stream_t.
|
||||||
|
* The dictionary must remain available during compression.
|
||||||
|
* LZ4_loadDict() triggers a reset, so any previous data will be forgotten.
|
||||||
|
* The same dictionary will have to be loaded on decompression side for successful decoding.
|
||||||
|
* Dictionary are useful for better compression of small data (KB range).
|
||||||
|
* While LZ4 accept any input as dictionary,
|
||||||
|
* results are generally better when using Zstandard's Dictionary Builder.
|
||||||
|
* Loading a size of 0 is allowed, and is the same as reset.
|
||||||
|
* @return : loaded dictionary size, in bytes (necessarily <= 64 KB)
|
||||||
|
*/
|
||||||
|
LZ4LIB_API int LZ4_loadDict (LZ4_stream_t* streamPtr, const char* dictionary, int dictSize);
|
||||||
|
|
||||||
|
/*! LZ4_compress_fast_continue() :
|
||||||
|
* Compress 'src' content using data from previously compressed blocks, for better compression ratio.
|
||||||
|
* 'dst' buffer must be already allocated.
|
||||||
|
* If dstCapacity >= LZ4_compressBound(srcSize), compression is guaranteed to succeed, and runs faster.
|
||||||
|
*
|
||||||
|
* @return : size of compressed block
|
||||||
|
* or 0 if there is an error (typically, cannot fit into 'dst').
|
||||||
|
*
|
||||||
|
* Note 1 : Each invocation to LZ4_compress_fast_continue() generates a new block.
|
||||||
|
* Each block has precise boundaries.
|
||||||
|
* Each block must be decompressed separately, calling LZ4_decompress_*() with relevant metadata.
|
||||||
|
* It's not possible to append blocks together and expect a single invocation of LZ4_decompress_*() to decompress them together.
|
||||||
|
*
|
||||||
|
* Note 2 : The previous 64KB of source data is __assumed__ to remain present, unmodified, at same address in memory !
|
||||||
|
*
|
||||||
|
* Note 3 : When input is structured as a double-buffer, each buffer can have any size, including < 64 KB.
|
||||||
|
* Make sure that buffers are separated, by at least one byte.
|
||||||
|
* This construction ensures that each block only depends on previous block.
|
||||||
|
*
|
||||||
|
* Note 4 : If input buffer is a ring-buffer, it can have any size, including < 64 KB.
|
||||||
|
*
|
||||||
|
* Note 5 : After an error, the stream status is undefined (invalid), it can only be reset or freed.
|
||||||
|
*/
|
||||||
|
LZ4LIB_API int LZ4_compress_fast_continue (LZ4_stream_t* streamPtr, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration);
|
||||||
|
|
||||||
|
/*! LZ4_saveDict() :
|
||||||
|
* If last 64KB data cannot be guaranteed to remain available at its current memory location,
|
||||||
|
* save it into a safer place (char* safeBuffer).
|
||||||
|
* This is schematically equivalent to a memcpy() followed by LZ4_loadDict(),
|
||||||
|
* but is much faster, because LZ4_saveDict() doesn't need to rebuild tables.
|
||||||
|
* @return : saved dictionary size in bytes (necessarily <= maxDictSize), or 0 if error.
|
||||||
|
*/
|
||||||
|
LZ4LIB_API int LZ4_saveDict (LZ4_stream_t* streamPtr, char* safeBuffer, int maxDictSize);
|
||||||
|
|
||||||
|
|
||||||
|
/*-**********************************************
|
||||||
|
* Streaming Decompression Functions
|
||||||
|
* Bufferless synchronous API
|
||||||
|
************************************************/
|
||||||
|
typedef union LZ4_streamDecode_u LZ4_streamDecode_t; /* tracking context */
|
||||||
|
|
||||||
|
/*! LZ4_createStreamDecode() and LZ4_freeStreamDecode() :
|
||||||
|
* creation / destruction of streaming decompression tracking context.
|
||||||
|
* A tracking context can be re-used multiple times.
|
||||||
|
*/
|
||||||
|
#if !defined(RC_INVOKED) /* https://docs.microsoft.com/en-us/windows/win32/menurc/predefined-macros */
|
||||||
|
#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION)
|
||||||
|
LZ4LIB_API LZ4_streamDecode_t* LZ4_createStreamDecode(void);
|
||||||
|
LZ4LIB_API int LZ4_freeStreamDecode (LZ4_streamDecode_t* LZ4_stream);
|
||||||
|
#endif /* !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*! LZ4_setStreamDecode() :
|
||||||
|
* An LZ4_streamDecode_t context can be allocated once and re-used multiple times.
|
||||||
|
* Use this function to start decompression of a new stream of blocks.
|
||||||
|
* A dictionary can optionally be set. Use NULL or size 0 for a reset order.
|
||||||
|
* Dictionary is presumed stable : it must remain accessible and unmodified during next decompression.
|
||||||
|
* @return : 1 if OK, 0 if error
|
||||||
|
*/
|
||||||
|
LZ4LIB_API int LZ4_setStreamDecode (LZ4_streamDecode_t* LZ4_streamDecode, const char* dictionary, int dictSize);
|
||||||
|
|
||||||
|
/*! LZ4_decoderRingBufferSize() : v1.8.2+
|
||||||
|
* Note : in a ring buffer scenario (optional),
|
||||||
|
* blocks are presumed decompressed next to each other
|
||||||
|
* up to the moment there is not enough remaining space for next block (remainingSize < maxBlockSize),
|
||||||
|
* at which stage it resumes from beginning of ring buffer.
|
||||||
|
* When setting such a ring buffer for streaming decompression,
|
||||||
|
* provides the minimum size of this ring buffer
|
||||||
|
* to be compatible with any source respecting maxBlockSize condition.
|
||||||
|
* @return : minimum ring buffer size,
|
||||||
|
* or 0 if there is an error (invalid maxBlockSize).
|
||||||
|
*/
|
||||||
|
LZ4LIB_API int LZ4_decoderRingBufferSize(int maxBlockSize);
|
||||||
|
#define LZ4_DECODER_RING_BUFFER_SIZE(maxBlockSize) (65536 + 14 + (maxBlockSize)) /* for static allocation; maxBlockSize presumed valid */
|
||||||
|
|
||||||
|
/*! LZ4_decompress_safe_continue() :
|
||||||
|
* This decoding function allows decompression of consecutive blocks in "streaming" mode.
|
||||||
|
* The difference with the usual independent blocks is that
|
||||||
|
* new blocks are allowed to find references into former blocks.
|
||||||
|
* A block is an unsplittable entity, and must be presented entirely to the decompression function.
|
||||||
|
* LZ4_decompress_safe_continue() only accepts one block at a time.
|
||||||
|
* It's modeled after `LZ4_decompress_safe()` and behaves similarly.
|
||||||
|
*
|
||||||
|
* @LZ4_streamDecode : decompression state, tracking the position in memory of past data
|
||||||
|
* @compressedSize : exact complete size of one compressed block.
|
||||||
|
* @dstCapacity : size of destination buffer (which must be already allocated),
|
||||||
|
* must be an upper bound of decompressed size.
|
||||||
|
* @return : number of bytes decompressed into destination buffer (necessarily <= dstCapacity)
|
||||||
|
* If destination buffer is not large enough, decoding will stop and output an error code (negative value).
|
||||||
|
* If the source stream is detected malformed, the function will stop decoding and return a negative result.
|
||||||
|
*
|
||||||
|
* The last 64KB of previously decoded data *must* remain available and unmodified
|
||||||
|
* at the memory position where they were previously decoded.
|
||||||
|
* If less than 64KB of data has been decoded, all the data must be present.
|
||||||
|
*
|
||||||
|
* Special : if decompression side sets a ring buffer, it must respect one of the following conditions :
|
||||||
|
* - Decompression buffer size is _at least_ LZ4_decoderRingBufferSize(maxBlockSize).
|
||||||
|
* maxBlockSize is the maximum size of any single block. It can have any value > 16 bytes.
|
||||||
|
* In which case, encoding and decoding buffers do not need to be synchronized.
|
||||||
|
* Actually, data can be produced by any source compliant with LZ4 format specification, and respecting maxBlockSize.
|
||||||
|
* - Synchronized mode :
|
||||||
|
* Decompression buffer size is _exactly_ the same as compression buffer size,
|
||||||
|
* and follows exactly same update rule (block boundaries at same positions),
|
||||||
|
* and decoding function is provided with exact decompressed size of each block (exception for last block of the stream),
|
||||||
|
* _then_ decoding & encoding ring buffer can have any size, including small ones ( < 64 KB).
|
||||||
|
* - Decompression buffer is larger than encoding buffer, by a minimum of maxBlockSize more bytes.
|
||||||
|
* In which case, encoding and decoding buffers do not need to be synchronized,
|
||||||
|
* and encoding ring buffer can have any size, including small ones ( < 64 KB).
|
||||||
|
*
|
||||||
|
* Whenever these conditions are not possible,
|
||||||
|
* save the last 64KB of decoded data into a safe buffer where it can't be modified during decompression,
|
||||||
|
* then indicate where this data is saved using LZ4_setStreamDecode(), before decompressing next block.
|
||||||
|
*/
|
||||||
|
LZ4LIB_API int
|
||||||
|
LZ4_decompress_safe_continue (LZ4_streamDecode_t* LZ4_streamDecode,
|
||||||
|
const char* src, char* dst,
|
||||||
|
int srcSize, int dstCapacity);
|
||||||
|
|
||||||
|
|
||||||
|
/*! LZ4_decompress_safe_usingDict() :
|
||||||
|
* Works the same as
|
||||||
|
* a combination of LZ4_setStreamDecode() followed by LZ4_decompress_safe_continue()
|
||||||
|
* However, it's stateless: it doesn't need any LZ4_streamDecode_t state.
|
||||||
|
* Dictionary is presumed stable : it must remain accessible and unmodified during decompression.
|
||||||
|
* Performance tip : Decompression speed can be substantially increased
|
||||||
|
* when dst == dictStart + dictSize.
|
||||||
|
*/
|
||||||
|
LZ4LIB_API int
|
||||||
|
LZ4_decompress_safe_usingDict(const char* src, char* dst,
|
||||||
|
int srcSize, int dstCapacity,
|
||||||
|
const char* dictStart, int dictSize);
|
||||||
|
|
||||||
|
/*! LZ4_decompress_safe_partial_usingDict() :
|
||||||
|
* Behaves the same as LZ4_decompress_safe_partial()
|
||||||
|
* with the added ability to specify a memory segment for past data.
|
||||||
|
* Performance tip : Decompression speed can be substantially increased
|
||||||
|
* when dst == dictStart + dictSize.
|
||||||
|
*/
|
||||||
|
LZ4LIB_API int
|
||||||
|
LZ4_decompress_safe_partial_usingDict(const char* src, char* dst,
|
||||||
|
int compressedSize,
|
||||||
|
int targetOutputSize, int maxOutputSize,
|
||||||
|
const char* dictStart, int dictSize);
|
||||||
|
|
||||||
|
#endif /* LZ4_H_2983827168210 */
|
||||||
|
|
||||||
|
|
||||||
|
/*^*************************************
|
||||||
|
* !!!!!! STATIC LINKING ONLY !!!!!!
|
||||||
|
***************************************/
|
||||||
|
|
||||||
|
/*-****************************************************************************
|
||||||
|
* Experimental section
|
||||||
|
*
|
||||||
|
* Symbols declared in this section must be considered unstable. Their
|
||||||
|
* signatures or semantics may change, or they may be removed altogether in the
|
||||||
|
* future. They are therefore only safe to depend on when the caller is
|
||||||
|
* statically linked against the library.
|
||||||
|
*
|
||||||
|
* To protect against unsafe usage, not only are the declarations guarded,
|
||||||
|
* the definitions are hidden by default
|
||||||
|
* when building LZ4 as a shared/dynamic library.
|
||||||
|
*
|
||||||
|
* In order to access these declarations,
|
||||||
|
* define LZ4_STATIC_LINKING_ONLY in your application
|
||||||
|
* before including LZ4's headers.
|
||||||
|
*
|
||||||
|
* In order to make their implementations accessible dynamically, you must
|
||||||
|
* define LZ4_PUBLISH_STATIC_FUNCTIONS when building the LZ4 library.
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#ifdef LZ4_STATIC_LINKING_ONLY
|
||||||
|
|
||||||
|
#ifndef LZ4_STATIC_3504398509
|
||||||
|
#define LZ4_STATIC_3504398509
|
||||||
|
|
||||||
|
#ifdef LZ4_PUBLISH_STATIC_FUNCTIONS
|
||||||
|
#define LZ4LIB_STATIC_API LZ4LIB_API
|
||||||
|
#else
|
||||||
|
#define LZ4LIB_STATIC_API
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*! LZ4_compress_fast_extState_fastReset() :
|
||||||
|
* A variant of LZ4_compress_fast_extState().
|
||||||
|
*
|
||||||
|
* Using this variant avoids an expensive initialization step.
|
||||||
|
* It is only safe to call if the state buffer is known to be correctly initialized already
|
||||||
|
* (see above comment on LZ4_resetStream_fast() for a definition of "correctly initialized").
|
||||||
|
* From a high level, the difference is that
|
||||||
|
* this function initializes the provided state with a call to something like LZ4_resetStream_fast()
|
||||||
|
* while LZ4_compress_fast_extState() starts with a call to LZ4_resetStream().
|
||||||
|
*/
|
||||||
|
LZ4LIB_STATIC_API int LZ4_compress_fast_extState_fastReset (void* state, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration);
|
||||||
|
|
||||||
|
/*! LZ4_attach_dictionary() :
|
||||||
|
* This is an experimental API that allows
|
||||||
|
* efficient use of a static dictionary many times.
|
||||||
|
*
|
||||||
|
* Rather than re-loading the dictionary buffer into a working context before
|
||||||
|
* each compression, or copying a pre-loaded dictionary's LZ4_stream_t into a
|
||||||
|
* working LZ4_stream_t, this function introduces a no-copy setup mechanism,
|
||||||
|
* in which the working stream references the dictionary stream in-place.
|
||||||
|
*
|
||||||
|
* Several assumptions are made about the state of the dictionary stream.
|
||||||
|
* Currently, only streams which have been prepared by LZ4_loadDict() should
|
||||||
|
* be expected to work.
|
||||||
|
*
|
||||||
|
* Alternatively, the provided dictionaryStream may be NULL,
|
||||||
|
* in which case any existing dictionary stream is unset.
|
||||||
|
*
|
||||||
|
* If a dictionary is provided, it replaces any pre-existing stream history.
|
||||||
|
* The dictionary contents are the only history that can be referenced and
|
||||||
|
* logically immediately precede the data compressed in the first subsequent
|
||||||
|
* compression call.
|
||||||
|
*
|
||||||
|
* The dictionary will only remain attached to the working stream through the
|
||||||
|
* first compression call, at the end of which it is cleared. The dictionary
|
||||||
|
* stream (and source buffer) must remain in-place / accessible / unchanged
|
||||||
|
* through the completion of the first compression call on the stream.
|
||||||
|
*/
|
||||||
|
LZ4LIB_STATIC_API void
|
||||||
|
LZ4_attach_dictionary(LZ4_stream_t* workingStream,
|
||||||
|
const LZ4_stream_t* dictionaryStream);
|
||||||
|
|
||||||
|
|
||||||
|
/*! In-place compression and decompression
|
||||||
|
*
|
||||||
|
* It's possible to have input and output sharing the same buffer,
|
||||||
|
* for highly constrained memory environments.
|
||||||
|
* In both cases, it requires input to lay at the end of the buffer,
|
||||||
|
* and decompression to start at beginning of the buffer.
|
||||||
|
* Buffer size must feature some margin, hence be larger than final size.
|
||||||
|
*
|
||||||
|
* |<------------------------buffer--------------------------------->|
|
||||||
|
* |<-----------compressed data--------->|
|
||||||
|
* |<-----------decompressed size------------------>|
|
||||||
|
* |<----margin---->|
|
||||||
|
*
|
||||||
|
* This technique is more useful for decompression,
|
||||||
|
* since decompressed size is typically larger,
|
||||||
|
* and margin is short.
|
||||||
|
*
|
||||||
|
* In-place decompression will work inside any buffer
|
||||||
|
* which size is >= LZ4_DECOMPRESS_INPLACE_BUFFER_SIZE(decompressedSize).
|
||||||
|
* This presumes that decompressedSize > compressedSize.
|
||||||
|
* Otherwise, it means compression actually expanded data,
|
||||||
|
* and it would be more efficient to store such data with a flag indicating it's not compressed.
|
||||||
|
* This can happen when data is not compressible (already compressed, or encrypted).
|
||||||
|
*
|
||||||
|
* For in-place compression, margin is larger, as it must be able to cope with both
|
||||||
|
* history preservation, requiring input data to remain unmodified up to LZ4_DISTANCE_MAX,
|
||||||
|
* and data expansion, which can happen when input is not compressible.
|
||||||
|
* As a consequence, buffer size requirements are much higher,
|
||||||
|
* and memory savings offered by in-place compression are more limited.
|
||||||
|
*
|
||||||
|
* There are ways to limit this cost for compression :
|
||||||
|
* - Reduce history size, by modifying LZ4_DISTANCE_MAX.
|
||||||
|
* Note that it is a compile-time constant, so all compressions will apply this limit.
|
||||||
|
* Lower values will reduce compression ratio, except when input_size < LZ4_DISTANCE_MAX,
|
||||||
|
* so it's a reasonable trick when inputs are known to be small.
|
||||||
|
* - Require the compressor to deliver a "maximum compressed size".
|
||||||
|
* This is the `dstCapacity` parameter in `LZ4_compress*()`.
|
||||||
|
* When this size is < LZ4_COMPRESSBOUND(inputSize), then compression can fail,
|
||||||
|
* in which case, the return code will be 0 (zero).
|
||||||
|
* The caller must be ready for these cases to happen,
|
||||||
|
* and typically design a backup scheme to send data uncompressed.
|
||||||
|
* The combination of both techniques can significantly reduce
|
||||||
|
* the amount of margin required for in-place compression.
|
||||||
|
*
|
||||||
|
* In-place compression can work in any buffer
|
||||||
|
* which size is >= (maxCompressedSize)
|
||||||
|
* with maxCompressedSize == LZ4_COMPRESSBOUND(srcSize) for guaranteed compression success.
|
||||||
|
* LZ4_COMPRESS_INPLACE_BUFFER_SIZE() depends on both maxCompressedSize and LZ4_DISTANCE_MAX,
|
||||||
|
* so it's possible to reduce memory requirements by playing with them.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define LZ4_DECOMPRESS_INPLACE_MARGIN(compressedSize) (((compressedSize) >> 8) + 32)
|
||||||
|
#define LZ4_DECOMPRESS_INPLACE_BUFFER_SIZE(decompressedSize) ((decompressedSize) + LZ4_DECOMPRESS_INPLACE_MARGIN(decompressedSize)) /**< note: presumes that compressedSize < decompressedSize. note2: margin is overestimated a bit, since it could use compressedSize instead */
|
||||||
|
|
||||||
|
#ifndef LZ4_DISTANCE_MAX /* history window size; can be user-defined at compile time */
|
||||||
|
# define LZ4_DISTANCE_MAX 65535 /* set to maximum value by default */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define LZ4_COMPRESS_INPLACE_MARGIN (LZ4_DISTANCE_MAX + 32) /* LZ4_DISTANCE_MAX can be safely replaced by srcSize when it's smaller */
|
||||||
|
#define LZ4_COMPRESS_INPLACE_BUFFER_SIZE(maxCompressedSize) ((maxCompressedSize) + LZ4_COMPRESS_INPLACE_MARGIN) /**< maxCompressedSize is generally LZ4_COMPRESSBOUND(inputSize), but can be set to any lower value, with the risk that compression can fail (return code 0(zero)) */
|
||||||
|
|
||||||
|
#endif /* LZ4_STATIC_3504398509 */
|
||||||
|
#endif /* LZ4_STATIC_LINKING_ONLY */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef LZ4_H_98237428734687
|
||||||
|
#define LZ4_H_98237428734687
|
||||||
|
|
||||||
|
/*-************************************************************
|
||||||
|
* Private Definitions
|
||||||
|
**************************************************************
|
||||||
|
* Do not use these definitions directly.
|
||||||
|
* They are only exposed to allow static allocation of `LZ4_stream_t` and `LZ4_streamDecode_t`.
|
||||||
|
* Accessing members will expose user code to API and/or ABI break in future versions of the library.
|
||||||
|
**************************************************************/
|
||||||
|
#define LZ4_HASHLOG (LZ4_MEMORY_USAGE-2)
|
||||||
|
#define LZ4_HASHTABLESIZE (1 << LZ4_MEMORY_USAGE)
|
||||||
|
#define LZ4_HASH_SIZE_U32 (1 << LZ4_HASHLOG) /* required as macro for static allocation */
|
||||||
|
|
||||||
|
#if defined(__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */)
|
||||||
|
# include <stdint.h>
|
||||||
|
typedef int8_t LZ4_i8;
|
||||||
|
typedef uint8_t LZ4_byte;
|
||||||
|
typedef uint16_t LZ4_u16;
|
||||||
|
typedef uint32_t LZ4_u32;
|
||||||
|
#else
|
||||||
|
typedef signed char LZ4_i8;
|
||||||
|
typedef unsigned char LZ4_byte;
|
||||||
|
typedef unsigned short LZ4_u16;
|
||||||
|
typedef unsigned int LZ4_u32;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*! LZ4_stream_t :
|
||||||
|
* Never ever use below internal definitions directly !
|
||||||
|
* These definitions are not API/ABI safe, and may change in future versions.
|
||||||
|
* If you need static allocation, declare or allocate an LZ4_stream_t object.
|
||||||
|
**/
|
||||||
|
|
||||||
|
typedef struct LZ4_stream_t_internal LZ4_stream_t_internal;
|
||||||
|
struct LZ4_stream_t_internal {
|
||||||
|
LZ4_u32 hashTable[LZ4_HASH_SIZE_U32];
|
||||||
|
const LZ4_byte* dictionary;
|
||||||
|
const LZ4_stream_t_internal* dictCtx;
|
||||||
|
LZ4_u32 currentOffset;
|
||||||
|
LZ4_u32 tableType;
|
||||||
|
LZ4_u32 dictSize;
|
||||||
|
/* Implicit padding to ensure structure is aligned */
|
||||||
|
};
|
||||||
|
|
||||||
|
#define LZ4_STREAM_MINSIZE ((1UL << LZ4_MEMORY_USAGE) + 32) /* static size, for inter-version compatibility */
|
||||||
|
union LZ4_stream_u {
|
||||||
|
char minStateSize[LZ4_STREAM_MINSIZE];
|
||||||
|
LZ4_stream_t_internal internal_donotuse;
|
||||||
|
}; /* previously typedef'd to LZ4_stream_t */
|
||||||
|
|
||||||
|
|
||||||
|
/*! LZ4_initStream() : v1.9.0+
|
||||||
|
* An LZ4_stream_t structure must be initialized at least once.
|
||||||
|
* This is automatically done when invoking LZ4_createStream(),
|
||||||
|
* but it's not when the structure is simply declared on stack (for example).
|
||||||
|
*
|
||||||
|
* Use LZ4_initStream() to properly initialize a newly declared LZ4_stream_t.
|
||||||
|
* It can also initialize any arbitrary buffer of sufficient size,
|
||||||
|
* and will @return a pointer of proper type upon initialization.
|
||||||
|
*
|
||||||
|
* Note : initialization fails if size and alignment conditions are not respected.
|
||||||
|
* In which case, the function will @return NULL.
|
||||||
|
* Note2: An LZ4_stream_t structure guarantees correct alignment and size.
|
||||||
|
* Note3: Before v1.9.0, use LZ4_resetStream() instead
|
||||||
|
**/
|
||||||
|
LZ4LIB_API LZ4_stream_t* LZ4_initStream (void* buffer, size_t size);
|
||||||
|
|
||||||
|
|
||||||
|
/*! LZ4_streamDecode_t :
|
||||||
|
* Never ever use below internal definitions directly !
|
||||||
|
* These definitions are not API/ABI safe, and may change in future versions.
|
||||||
|
* If you need static allocation, declare or allocate an LZ4_streamDecode_t object.
|
||||||
|
**/
|
||||||
|
typedef struct {
|
||||||
|
const LZ4_byte* externalDict;
|
||||||
|
const LZ4_byte* prefixEnd;
|
||||||
|
size_t extDictSize;
|
||||||
|
size_t prefixSize;
|
||||||
|
} LZ4_streamDecode_t_internal;
|
||||||
|
|
||||||
|
#define LZ4_STREAMDECODE_MINSIZE 32
|
||||||
|
union LZ4_streamDecode_u {
|
||||||
|
char minStateSize[LZ4_STREAMDECODE_MINSIZE];
|
||||||
|
LZ4_streamDecode_t_internal internal_donotuse;
|
||||||
|
} ; /* previously typedef'd to LZ4_streamDecode_t */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*-************************************
|
||||||
|
* Obsolete Functions
|
||||||
|
**************************************/
|
||||||
|
|
||||||
|
/*! Deprecation warnings
|
||||||
|
*
|
||||||
|
* Deprecated functions make the compiler generate a warning when invoked.
|
||||||
|
* This is meant to invite users to update their source code.
|
||||||
|
* Should deprecation warnings be a problem, it is generally possible to disable them,
|
||||||
|
* typically with -Wno-deprecated-declarations for gcc
|
||||||
|
* or _CRT_SECURE_NO_WARNINGS in Visual.
|
||||||
|
*
|
||||||
|
* Another method is to define LZ4_DISABLE_DEPRECATE_WARNINGS
|
||||||
|
* before including the header file.
|
||||||
|
*/
|
||||||
|
#ifdef LZ4_DISABLE_DEPRECATE_WARNINGS
|
||||||
|
# define LZ4_DEPRECATED(message) /* disable deprecation warnings */
|
||||||
|
#else
|
||||||
|
# if defined (__cplusplus) && (__cplusplus >= 201402) /* C++14 or greater */
|
||||||
|
# define LZ4_DEPRECATED(message) [[deprecated(message)]]
|
||||||
|
# elif defined(_MSC_VER)
|
||||||
|
# define LZ4_DEPRECATED(message) __declspec(deprecated(message))
|
||||||
|
# elif defined(__clang__) || (defined(__GNUC__) && (__GNUC__ * 10 + __GNUC_MINOR__ >= 45))
|
||||||
|
# define LZ4_DEPRECATED(message) __attribute__((deprecated(message)))
|
||||||
|
# elif defined(__GNUC__) && (__GNUC__ * 10 + __GNUC_MINOR__ >= 31)
|
||||||
|
# define LZ4_DEPRECATED(message) __attribute__((deprecated))
|
||||||
|
# else
|
||||||
|
# pragma message("WARNING: LZ4_DEPRECATED needs custom implementation for this compiler")
|
||||||
|
# define LZ4_DEPRECATED(message) /* disabled */
|
||||||
|
# endif
|
||||||
|
#endif /* LZ4_DISABLE_DEPRECATE_WARNINGS */
|
||||||
|
|
||||||
|
/*! Obsolete compression functions (since v1.7.3) */
|
||||||
|
LZ4_DEPRECATED("use LZ4_compress_default() instead") LZ4LIB_API int LZ4_compress (const char* src, char* dest, int srcSize);
|
||||||
|
LZ4_DEPRECATED("use LZ4_compress_default() instead") LZ4LIB_API int LZ4_compress_limitedOutput (const char* src, char* dest, int srcSize, int maxOutputSize);
|
||||||
|
LZ4_DEPRECATED("use LZ4_compress_fast_extState() instead") LZ4LIB_API int LZ4_compress_withState (void* state, const char* source, char* dest, int inputSize);
|
||||||
|
LZ4_DEPRECATED("use LZ4_compress_fast_extState() instead") LZ4LIB_API int LZ4_compress_limitedOutput_withState (void* state, const char* source, char* dest, int inputSize, int maxOutputSize);
|
||||||
|
LZ4_DEPRECATED("use LZ4_compress_fast_continue() instead") LZ4LIB_API int LZ4_compress_continue (LZ4_stream_t* LZ4_streamPtr, const char* source, char* dest, int inputSize);
|
||||||
|
LZ4_DEPRECATED("use LZ4_compress_fast_continue() instead") LZ4LIB_API int LZ4_compress_limitedOutput_continue (LZ4_stream_t* LZ4_streamPtr, const char* source, char* dest, int inputSize, int maxOutputSize);
|
||||||
|
|
||||||
|
/*! Obsolete decompression functions (since v1.8.0) */
|
||||||
|
LZ4_DEPRECATED("use LZ4_decompress_fast() instead") LZ4LIB_API int LZ4_uncompress (const char* source, char* dest, int outputSize);
|
||||||
|
LZ4_DEPRECATED("use LZ4_decompress_safe() instead") LZ4LIB_API int LZ4_uncompress_unknownOutputSize (const char* source, char* dest, int isize, int maxOutputSize);
|
||||||
|
|
||||||
|
/* Obsolete streaming functions (since v1.7.0)
|
||||||
|
* degraded functionality; do not use!
|
||||||
|
*
|
||||||
|
* In order to perform streaming compression, these functions depended on data
|
||||||
|
* that is no longer tracked in the state. They have been preserved as well as
|
||||||
|
* possible: using them will still produce a correct output. However, they don't
|
||||||
|
* actually retain any history between compression calls. The compression ratio
|
||||||
|
* achieved will therefore be no better than compressing each chunk
|
||||||
|
* independently.
|
||||||
|
*/
|
||||||
|
LZ4_DEPRECATED("Use LZ4_createStream() instead") LZ4LIB_API void* LZ4_create (char* inputBuffer);
|
||||||
|
LZ4_DEPRECATED("Use LZ4_createStream() instead") LZ4LIB_API int LZ4_sizeofStreamState(void);
|
||||||
|
LZ4_DEPRECATED("Use LZ4_resetStream() instead") LZ4LIB_API int LZ4_resetStreamState(void* state, char* inputBuffer);
|
||||||
|
LZ4_DEPRECATED("Use LZ4_saveDict() instead") LZ4LIB_API char* LZ4_slideInputBuffer (void* state);
|
||||||
|
|
||||||
|
/*! Obsolete streaming decoding functions (since v1.7.0) */
|
||||||
|
LZ4_DEPRECATED("use LZ4_decompress_safe_usingDict() instead") LZ4LIB_API int LZ4_decompress_safe_withPrefix64k (const char* src, char* dst, int compressedSize, int maxDstSize);
|
||||||
|
LZ4_DEPRECATED("use LZ4_decompress_fast_usingDict() instead") LZ4LIB_API int LZ4_decompress_fast_withPrefix64k (const char* src, char* dst, int originalSize);
|
||||||
|
|
||||||
|
/*! Obsolete LZ4_decompress_fast variants (since v1.9.0) :
|
||||||
|
* These functions used to be faster than LZ4_decompress_safe(),
|
||||||
|
* but this is no longer the case. They are now slower.
|
||||||
|
* This is because LZ4_decompress_fast() doesn't know the input size,
|
||||||
|
* and therefore must progress more cautiously into the input buffer to not read beyond the end of block.
|
||||||
|
* On top of that `LZ4_decompress_fast()` is not protected vs malformed or malicious inputs, making it a security liability.
|
||||||
|
* As a consequence, LZ4_decompress_fast() is strongly discouraged, and deprecated.
|
||||||
|
*
|
||||||
|
* The last remaining LZ4_decompress_fast() specificity is that
|
||||||
|
* it can decompress a block without knowing its compressed size.
|
||||||
|
* Such functionality can be achieved in a more secure manner
|
||||||
|
* by employing LZ4_decompress_safe_partial().
|
||||||
|
*
|
||||||
|
* Parameters:
|
||||||
|
* originalSize : is the uncompressed size to regenerate.
|
||||||
|
* `dst` must be already allocated, its size must be >= 'originalSize' bytes.
|
||||||
|
* @return : number of bytes read from source buffer (== compressed size).
|
||||||
|
* The function expects to finish at block's end exactly.
|
||||||
|
* If the source stream is detected malformed, the function stops decoding and returns a negative result.
|
||||||
|
* note : LZ4_decompress_fast*() requires originalSize. Thanks to this information, it never writes past the output buffer.
|
||||||
|
* However, since it doesn't know its 'src' size, it may read an unknown amount of input, past input buffer bounds.
|
||||||
|
* Also, since match offsets are not validated, match reads from 'src' may underflow too.
|
||||||
|
* These issues never happen if input (compressed) data is correct.
|
||||||
|
* But they may happen if input data is invalid (error or intentional tampering).
|
||||||
|
* As a consequence, use these functions in trusted environments with trusted data **only**.
|
||||||
|
*/
|
||||||
|
LZ4_DEPRECATED("This function is deprecated and unsafe. Consider using LZ4_decompress_safe() instead")
|
||||||
|
LZ4LIB_API int LZ4_decompress_fast (const char* src, char* dst, int originalSize);
|
||||||
|
LZ4_DEPRECATED("This function is deprecated and unsafe. Consider using LZ4_decompress_safe_continue() instead")
|
||||||
|
LZ4LIB_API int LZ4_decompress_fast_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* src, char* dst, int originalSize);
|
||||||
|
LZ4_DEPRECATED("This function is deprecated and unsafe. Consider using LZ4_decompress_safe_usingDict() instead")
|
||||||
|
LZ4LIB_API int LZ4_decompress_fast_usingDict (const char* src, char* dst, int originalSize, const char* dictStart, int dictSize);
|
||||||
|
|
||||||
|
/*! LZ4_resetStream() :
|
||||||
|
* An LZ4_stream_t structure must be initialized at least once.
|
||||||
|
* This is done with LZ4_initStream(), or LZ4_resetStream().
|
||||||
|
* Consider switching to LZ4_initStream(),
|
||||||
|
* invoking LZ4_resetStream() will trigger deprecation warnings in the future.
|
||||||
|
*/
|
||||||
|
LZ4LIB_API void LZ4_resetStream (LZ4_stream_t* streamPtr);
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* LZ4_H_98237428734687 */
|
||||||
|
|
||||||
|
|
||||||
|
#if defined (__cplusplus)
|
||||||
|
}
|
||||||
|
#endif
|
311
csbindgen-tests/c/lz4/lz4file.c
Normal file
311
csbindgen-tests/c/lz4/lz4file.c
Normal file
@ -0,0 +1,311 @@
|
|||||||
|
/*
|
||||||
|
* LZ4 file library
|
||||||
|
* Copyright (C) 2022, Xiaomi Inc.
|
||||||
|
*
|
||||||
|
* BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* - Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the following disclaimer
|
||||||
|
* in the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* You can contact the author at :
|
||||||
|
* - LZ4 homepage : http://www.lz4.org
|
||||||
|
* - LZ4 source repository : https://github.com/lz4/lz4
|
||||||
|
*/
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "lz4.h"
|
||||||
|
#include "lz4file.h"
|
||||||
|
|
||||||
|
struct LZ4_readFile_s {
|
||||||
|
LZ4F_dctx* dctxPtr;
|
||||||
|
FILE* fp;
|
||||||
|
LZ4_byte* srcBuf;
|
||||||
|
size_t srcBufNext;
|
||||||
|
size_t srcBufSize;
|
||||||
|
size_t srcBufMaxSize;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct LZ4_writeFile_s {
|
||||||
|
LZ4F_cctx* cctxPtr;
|
||||||
|
FILE* fp;
|
||||||
|
LZ4_byte* dstBuf;
|
||||||
|
size_t maxWriteSize;
|
||||||
|
size_t dstBufMaxSize;
|
||||||
|
LZ4F_errorCode_t errCode;
|
||||||
|
};
|
||||||
|
|
||||||
|
LZ4F_errorCode_t LZ4F_readOpen(LZ4_readFile_t** lz4fRead, FILE* fp)
|
||||||
|
{
|
||||||
|
char buf[LZ4F_HEADER_SIZE_MAX];
|
||||||
|
size_t consumedSize;
|
||||||
|
LZ4F_errorCode_t ret;
|
||||||
|
LZ4F_frameInfo_t info;
|
||||||
|
|
||||||
|
if (fp == NULL || lz4fRead == NULL) {
|
||||||
|
return -LZ4F_ERROR_GENERIC;
|
||||||
|
}
|
||||||
|
|
||||||
|
*lz4fRead = (LZ4_readFile_t*)calloc(1, sizeof(LZ4_readFile_t));
|
||||||
|
if (*lz4fRead == NULL) {
|
||||||
|
return -LZ4F_ERROR_allocation_failed;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = LZ4F_createDecompressionContext(&(*lz4fRead)->dctxPtr, LZ4F_getVersion());
|
||||||
|
if (LZ4F_isError(ret)) {
|
||||||
|
free(*lz4fRead);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
(*lz4fRead)->fp = fp;
|
||||||
|
consumedSize = fread(buf, 1, sizeof(buf), (*lz4fRead)->fp);
|
||||||
|
if (consumedSize != sizeof(buf)) {
|
||||||
|
free(*lz4fRead);
|
||||||
|
return -LZ4F_ERROR_GENERIC;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = LZ4F_getFrameInfo((*lz4fRead)->dctxPtr, &info, buf, &consumedSize);
|
||||||
|
if (LZ4F_isError(ret)) {
|
||||||
|
LZ4F_freeDecompressionContext((*lz4fRead)->dctxPtr);
|
||||||
|
free(*lz4fRead);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (info.blockSizeID) {
|
||||||
|
case LZ4F_default :
|
||||||
|
case LZ4F_max64KB :
|
||||||
|
(*lz4fRead)->srcBufMaxSize = 64 * 1024;
|
||||||
|
break;
|
||||||
|
case LZ4F_max256KB:
|
||||||
|
(*lz4fRead)->srcBufMaxSize = 256 * 1024;
|
||||||
|
break;
|
||||||
|
case LZ4F_max1MB:
|
||||||
|
(*lz4fRead)->srcBufMaxSize = 1 * 1024 * 1024;
|
||||||
|
break;
|
||||||
|
case LZ4F_max4MB:
|
||||||
|
(*lz4fRead)->srcBufMaxSize = 4 * 1024 * 1024;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
LZ4F_freeDecompressionContext((*lz4fRead)->dctxPtr);
|
||||||
|
free(*lz4fRead);
|
||||||
|
return -LZ4F_ERROR_maxBlockSize_invalid;
|
||||||
|
}
|
||||||
|
|
||||||
|
(*lz4fRead)->srcBuf = (LZ4_byte*)malloc((*lz4fRead)->srcBufMaxSize);
|
||||||
|
if ((*lz4fRead)->srcBuf == NULL) {
|
||||||
|
LZ4F_freeDecompressionContext((*lz4fRead)->dctxPtr);
|
||||||
|
free(lz4fRead);
|
||||||
|
return -LZ4F_ERROR_allocation_failed;
|
||||||
|
}
|
||||||
|
|
||||||
|
(*lz4fRead)->srcBufSize = sizeof(buf) - consumedSize;
|
||||||
|
memcpy((*lz4fRead)->srcBuf, buf + consumedSize, (*lz4fRead)->srcBufSize);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t LZ4F_read(LZ4_readFile_t* lz4fRead, void* buf, size_t size)
|
||||||
|
{
|
||||||
|
LZ4_byte* p = (LZ4_byte*)buf;
|
||||||
|
size_t next = 0;
|
||||||
|
|
||||||
|
if (lz4fRead == NULL || buf == NULL)
|
||||||
|
return -LZ4F_ERROR_GENERIC;
|
||||||
|
|
||||||
|
while (next < size) {
|
||||||
|
size_t srcsize = lz4fRead->srcBufSize - lz4fRead->srcBufNext;
|
||||||
|
size_t dstsize = size - next;
|
||||||
|
size_t ret;
|
||||||
|
|
||||||
|
if (srcsize == 0) {
|
||||||
|
ret = fread(lz4fRead->srcBuf, 1, lz4fRead->srcBufMaxSize, lz4fRead->fp);
|
||||||
|
if (ret > 0) {
|
||||||
|
lz4fRead->srcBufSize = ret;
|
||||||
|
srcsize = lz4fRead->srcBufSize;
|
||||||
|
lz4fRead->srcBufNext = 0;
|
||||||
|
}
|
||||||
|
else if (ret == 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return -LZ4F_ERROR_GENERIC;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = LZ4F_decompress(lz4fRead->dctxPtr,
|
||||||
|
p, &dstsize,
|
||||||
|
lz4fRead->srcBuf + lz4fRead->srcBufNext,
|
||||||
|
&srcsize,
|
||||||
|
NULL);
|
||||||
|
if (LZ4F_isError(ret)) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
lz4fRead->srcBufNext += srcsize;
|
||||||
|
next += dstsize;
|
||||||
|
p += dstsize;
|
||||||
|
}
|
||||||
|
|
||||||
|
return next;
|
||||||
|
}
|
||||||
|
|
||||||
|
LZ4F_errorCode_t LZ4F_readClose(LZ4_readFile_t* lz4fRead)
|
||||||
|
{
|
||||||
|
if (lz4fRead == NULL)
|
||||||
|
return -LZ4F_ERROR_GENERIC;
|
||||||
|
LZ4F_freeDecompressionContext(lz4fRead->dctxPtr);
|
||||||
|
free(lz4fRead->srcBuf);
|
||||||
|
free(lz4fRead);
|
||||||
|
return LZ4F_OK_NoError;
|
||||||
|
}
|
||||||
|
|
||||||
|
LZ4F_errorCode_t LZ4F_writeOpen(LZ4_writeFile_t** lz4fWrite, FILE* fp, const LZ4F_preferences_t* prefsPtr)
|
||||||
|
{
|
||||||
|
LZ4_byte buf[LZ4F_HEADER_SIZE_MAX];
|
||||||
|
size_t ret;
|
||||||
|
|
||||||
|
if (fp == NULL || lz4fWrite == NULL)
|
||||||
|
return -LZ4F_ERROR_GENERIC;
|
||||||
|
|
||||||
|
*lz4fWrite = (LZ4_writeFile_t*)malloc(sizeof(LZ4_writeFile_t));
|
||||||
|
if (*lz4fWrite == NULL) {
|
||||||
|
return -LZ4F_ERROR_allocation_failed;
|
||||||
|
}
|
||||||
|
if (prefsPtr != NULL) {
|
||||||
|
switch (prefsPtr->frameInfo.blockSizeID) {
|
||||||
|
case LZ4F_default :
|
||||||
|
case LZ4F_max64KB :
|
||||||
|
(*lz4fWrite)->maxWriteSize = 64 * 1024;
|
||||||
|
break;
|
||||||
|
case LZ4F_max256KB:
|
||||||
|
(*lz4fWrite)->maxWriteSize = 256 * 1024;
|
||||||
|
break;
|
||||||
|
case LZ4F_max1MB:
|
||||||
|
(*lz4fWrite)->maxWriteSize = 1 * 1024 * 1024;
|
||||||
|
break;
|
||||||
|
case LZ4F_max4MB:
|
||||||
|
(*lz4fWrite)->maxWriteSize = 4 * 1024 * 1024;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
free(lz4fWrite);
|
||||||
|
return -LZ4F_ERROR_maxBlockSize_invalid;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
(*lz4fWrite)->maxWriteSize = 64 * 1024;
|
||||||
|
}
|
||||||
|
|
||||||
|
(*lz4fWrite)->dstBufMaxSize = LZ4F_compressBound((*lz4fWrite)->maxWriteSize, prefsPtr);
|
||||||
|
(*lz4fWrite)->dstBuf = (LZ4_byte*)malloc((*lz4fWrite)->dstBufMaxSize);
|
||||||
|
if ((*lz4fWrite)->dstBuf == NULL) {
|
||||||
|
free(*lz4fWrite);
|
||||||
|
return -LZ4F_ERROR_allocation_failed;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = LZ4F_createCompressionContext(&(*lz4fWrite)->cctxPtr, LZ4F_getVersion());
|
||||||
|
if (LZ4F_isError(ret)) {
|
||||||
|
free((*lz4fWrite)->dstBuf);
|
||||||
|
free(*lz4fWrite);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = LZ4F_compressBegin((*lz4fWrite)->cctxPtr, buf, LZ4F_HEADER_SIZE_MAX, prefsPtr);
|
||||||
|
if (LZ4F_isError(ret)) {
|
||||||
|
LZ4F_freeCompressionContext((*lz4fWrite)->cctxPtr);
|
||||||
|
free((*lz4fWrite)->dstBuf);
|
||||||
|
free(*lz4fWrite);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ret != fwrite(buf, 1, ret, fp)) {
|
||||||
|
LZ4F_freeCompressionContext((*lz4fWrite)->cctxPtr);
|
||||||
|
free((*lz4fWrite)->dstBuf);
|
||||||
|
free(*lz4fWrite);
|
||||||
|
return -LZ4F_ERROR_GENERIC;
|
||||||
|
}
|
||||||
|
|
||||||
|
(*lz4fWrite)->fp = fp;
|
||||||
|
(*lz4fWrite)->errCode = LZ4F_OK_NoError;
|
||||||
|
return LZ4F_OK_NoError;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t LZ4F_write(LZ4_writeFile_t* lz4fWrite, const void* buf, size_t size)
|
||||||
|
{
|
||||||
|
const LZ4_byte* p = (const LZ4_byte*)buf;
|
||||||
|
size_t remain = size;
|
||||||
|
size_t chunk;
|
||||||
|
size_t ret;
|
||||||
|
|
||||||
|
if (lz4fWrite == NULL || buf == NULL)
|
||||||
|
return -LZ4F_ERROR_GENERIC;
|
||||||
|
while (remain) {
|
||||||
|
if (remain > lz4fWrite->maxWriteSize)
|
||||||
|
chunk = lz4fWrite->maxWriteSize;
|
||||||
|
else
|
||||||
|
chunk = remain;
|
||||||
|
|
||||||
|
ret = LZ4F_compressUpdate(lz4fWrite->cctxPtr,
|
||||||
|
lz4fWrite->dstBuf, lz4fWrite->dstBufMaxSize,
|
||||||
|
p, chunk,
|
||||||
|
NULL);
|
||||||
|
if (LZ4F_isError(ret)) {
|
||||||
|
lz4fWrite->errCode = ret;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ret != fwrite(lz4fWrite->dstBuf, 1, ret, lz4fWrite->fp)) {
|
||||||
|
lz4fWrite->errCode = -LZ4F_ERROR_GENERIC;
|
||||||
|
return -LZ4F_ERROR_GENERIC;
|
||||||
|
}
|
||||||
|
|
||||||
|
p += chunk;
|
||||||
|
remain -= chunk;
|
||||||
|
}
|
||||||
|
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
LZ4F_errorCode_t LZ4F_writeClose(LZ4_writeFile_t* lz4fWrite)
|
||||||
|
{
|
||||||
|
LZ4F_errorCode_t ret = LZ4F_OK_NoError;
|
||||||
|
|
||||||
|
if (lz4fWrite == NULL)
|
||||||
|
return -LZ4F_ERROR_GENERIC;
|
||||||
|
|
||||||
|
if (lz4fWrite->errCode == LZ4F_OK_NoError) {
|
||||||
|
ret = LZ4F_compressEnd(lz4fWrite->cctxPtr,
|
||||||
|
lz4fWrite->dstBuf, lz4fWrite->dstBufMaxSize,
|
||||||
|
NULL);
|
||||||
|
if (LZ4F_isError(ret)) {
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ret != fwrite(lz4fWrite->dstBuf, 1, ret, lz4fWrite->fp)) {
|
||||||
|
ret = -LZ4F_ERROR_GENERIC;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
|
LZ4F_freeCompressionContext(lz4fWrite->cctxPtr);
|
||||||
|
free(lz4fWrite->dstBuf);
|
||||||
|
free(lz4fWrite);
|
||||||
|
return ret;
|
||||||
|
}
|
93
csbindgen-tests/c/lz4/lz4file.h
Normal file
93
csbindgen-tests/c/lz4/lz4file.h
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
/*
|
||||||
|
LZ4 file library
|
||||||
|
Header File
|
||||||
|
Copyright (C) 2022, Xiaomi Inc.
|
||||||
|
BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are
|
||||||
|
met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above
|
||||||
|
copyright notice, this list of conditions and the following disclaimer
|
||||||
|
in the documentation and/or other materials provided with the
|
||||||
|
distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
You can contact the author at :
|
||||||
|
- LZ4 source repository : https://github.com/lz4/lz4
|
||||||
|
- LZ4 public forum : https://groups.google.com/forum/#!forum/lz4c
|
||||||
|
*/
|
||||||
|
#if defined (__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef LZ4FILE_H
|
||||||
|
#define LZ4FILE_H
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "lz4frame_static.h"
|
||||||
|
|
||||||
|
typedef struct LZ4_readFile_s LZ4_readFile_t;
|
||||||
|
typedef struct LZ4_writeFile_s LZ4_writeFile_t;
|
||||||
|
|
||||||
|
/*! LZ4F_readOpen() :
|
||||||
|
* Set read lz4file handle.
|
||||||
|
* `lz4f` will set a lz4file handle.
|
||||||
|
* `fp` must be the return value of the lz4 file opened by fopen.
|
||||||
|
*/
|
||||||
|
LZ4FLIB_STATIC_API LZ4F_errorCode_t LZ4F_readOpen(LZ4_readFile_t** lz4fRead, FILE* fp);
|
||||||
|
|
||||||
|
/*! LZ4F_read() :
|
||||||
|
* Read lz4file content to buffer.
|
||||||
|
* `lz4f` must use LZ4_readOpen to set first.
|
||||||
|
* `buf` read data buffer.
|
||||||
|
* `size` read data buffer size.
|
||||||
|
*/
|
||||||
|
LZ4FLIB_STATIC_API size_t LZ4F_read(LZ4_readFile_t* lz4fRead, void* buf, size_t size);
|
||||||
|
|
||||||
|
/*! LZ4F_readClose() :
|
||||||
|
* Close lz4file handle.
|
||||||
|
* `lz4f` must use LZ4_readOpen to set first.
|
||||||
|
*/
|
||||||
|
LZ4FLIB_STATIC_API LZ4F_errorCode_t LZ4F_readClose(LZ4_readFile_t* lz4fRead);
|
||||||
|
|
||||||
|
/*! LZ4F_writeOpen() :
|
||||||
|
* Set write lz4file handle.
|
||||||
|
* `lz4f` will set a lz4file handle.
|
||||||
|
* `fp` must be the return value of the lz4 file opened by fopen.
|
||||||
|
*/
|
||||||
|
LZ4FLIB_STATIC_API LZ4F_errorCode_t LZ4F_writeOpen(LZ4_writeFile_t** lz4fWrite, FILE* fp, const LZ4F_preferences_t* prefsPtr);
|
||||||
|
|
||||||
|
/*! LZ4F_write() :
|
||||||
|
* Write buffer to lz4file.
|
||||||
|
* `lz4f` must use LZ4F_writeOpen to set first.
|
||||||
|
* `buf` write data buffer.
|
||||||
|
* `size` write data buffer size.
|
||||||
|
*/
|
||||||
|
LZ4FLIB_STATIC_API size_t LZ4F_write(LZ4_writeFile_t* lz4fWrite, const void* buf, size_t size);
|
||||||
|
|
||||||
|
/*! LZ4F_writeClose() :
|
||||||
|
* Close lz4file handle.
|
||||||
|
* `lz4f` must use LZ4F_writeOpen to set first.
|
||||||
|
*/
|
||||||
|
LZ4FLIB_STATIC_API LZ4F_errorCode_t LZ4F_writeClose(LZ4_writeFile_t* lz4fWrite);
|
||||||
|
|
||||||
|
#endif /* LZ4FILE_H */
|
||||||
|
|
||||||
|
#if defined (__cplusplus)
|
||||||
|
}
|
||||||
|
#endif
|
2076
csbindgen-tests/c/lz4/lz4frame.c
Normal file
2076
csbindgen-tests/c/lz4/lz4frame.c
Normal file
File diff suppressed because it is too large
Load Diff
707
csbindgen-tests/c/lz4/lz4frame.h
Normal file
707
csbindgen-tests/c/lz4/lz4frame.h
Normal file
@ -0,0 +1,707 @@
|
|||||||
|
/*
|
||||||
|
LZ4F - LZ4-Frame library
|
||||||
|
Header File
|
||||||
|
Copyright (C) 2011-2020, Yann Collet.
|
||||||
|
BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are
|
||||||
|
met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above
|
||||||
|
copyright notice, this list of conditions and the following disclaimer
|
||||||
|
in the documentation and/or other materials provided with the
|
||||||
|
distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
You can contact the author at :
|
||||||
|
- LZ4 source repository : https://github.com/lz4/lz4
|
||||||
|
- LZ4 public forum : https://groups.google.com/forum/#!forum/lz4c
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* LZ4F is a stand-alone API able to create and decode LZ4 frames
|
||||||
|
* conformant with specification v1.6.1 in doc/lz4_Frame_format.md .
|
||||||
|
* Generated frames are compatible with `lz4` CLI.
|
||||||
|
*
|
||||||
|
* LZ4F also offers streaming capabilities.
|
||||||
|
*
|
||||||
|
* lz4.h is not required when using lz4frame.h,
|
||||||
|
* except to extract common constants such as LZ4_VERSION_NUMBER.
|
||||||
|
* */
|
||||||
|
|
||||||
|
#ifndef LZ4F_H_09782039843
|
||||||
|
#define LZ4F_H_09782039843
|
||||||
|
|
||||||
|
#if defined (__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* --- Dependency --- */
|
||||||
|
#include <stddef.h> /* size_t */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Introduction
|
||||||
|
*
|
||||||
|
* lz4frame.h implements LZ4 frame specification: see doc/lz4_Frame_format.md .
|
||||||
|
* LZ4 Frames are compatible with `lz4` CLI,
|
||||||
|
* and designed to be interoperable with any system.
|
||||||
|
**/
|
||||||
|
|
||||||
|
/*-***************************************************************
|
||||||
|
* Compiler specifics
|
||||||
|
*****************************************************************/
|
||||||
|
/* LZ4_DLL_EXPORT :
|
||||||
|
* Enable exporting of functions when building a Windows DLL
|
||||||
|
* LZ4FLIB_VISIBILITY :
|
||||||
|
* Control library symbols visibility.
|
||||||
|
*/
|
||||||
|
#ifndef LZ4FLIB_VISIBILITY
|
||||||
|
# if defined(__GNUC__) && (__GNUC__ >= 4)
|
||||||
|
# define LZ4FLIB_VISIBILITY __attribute__ ((visibility ("default")))
|
||||||
|
# else
|
||||||
|
# define LZ4FLIB_VISIBILITY
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
#if defined(LZ4_DLL_EXPORT) && (LZ4_DLL_EXPORT==1)
|
||||||
|
# define LZ4FLIB_API __declspec(dllexport) LZ4FLIB_VISIBILITY
|
||||||
|
#elif defined(LZ4_DLL_IMPORT) && (LZ4_DLL_IMPORT==1)
|
||||||
|
# define LZ4FLIB_API __declspec(dllimport) LZ4FLIB_VISIBILITY
|
||||||
|
#else
|
||||||
|
# define LZ4FLIB_API LZ4FLIB_VISIBILITY
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef LZ4F_DISABLE_DEPRECATE_WARNINGS
|
||||||
|
# define LZ4F_DEPRECATE(x) x
|
||||||
|
#else
|
||||||
|
# if defined(_MSC_VER)
|
||||||
|
# define LZ4F_DEPRECATE(x) x /* __declspec(deprecated) x - only works with C++ */
|
||||||
|
# elif defined(__clang__) || (defined(__GNUC__) && (__GNUC__ >= 6))
|
||||||
|
# define LZ4F_DEPRECATE(x) x __attribute__((deprecated))
|
||||||
|
# else
|
||||||
|
# define LZ4F_DEPRECATE(x) x /* no deprecation warning for this compiler */
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*-************************************
|
||||||
|
* Error management
|
||||||
|
**************************************/
|
||||||
|
typedef size_t LZ4F_errorCode_t;
|
||||||
|
|
||||||
|
LZ4FLIB_API unsigned LZ4F_isError(LZ4F_errorCode_t code); /**< tells when a function result is an error code */
|
||||||
|
LZ4FLIB_API const char* LZ4F_getErrorName(LZ4F_errorCode_t code); /**< return error code string; for debugging */
|
||||||
|
|
||||||
|
|
||||||
|
/*-************************************
|
||||||
|
* Frame compression types
|
||||||
|
************************************* */
|
||||||
|
/* #define LZ4F_ENABLE_OBSOLETE_ENUMS // uncomment to enable obsolete enums */
|
||||||
|
#ifdef LZ4F_ENABLE_OBSOLETE_ENUMS
|
||||||
|
# define LZ4F_OBSOLETE_ENUM(x) , LZ4F_DEPRECATE(x) = LZ4F_##x
|
||||||
|
#else
|
||||||
|
# define LZ4F_OBSOLETE_ENUM(x)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* The larger the block size, the (slightly) better the compression ratio,
|
||||||
|
* though there are diminishing returns.
|
||||||
|
* Larger blocks also increase memory usage on both compression and decompression sides.
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
LZ4F_default=0,
|
||||||
|
LZ4F_max64KB=4,
|
||||||
|
LZ4F_max256KB=5,
|
||||||
|
LZ4F_max1MB=6,
|
||||||
|
LZ4F_max4MB=7
|
||||||
|
LZ4F_OBSOLETE_ENUM(max64KB)
|
||||||
|
LZ4F_OBSOLETE_ENUM(max256KB)
|
||||||
|
LZ4F_OBSOLETE_ENUM(max1MB)
|
||||||
|
LZ4F_OBSOLETE_ENUM(max4MB)
|
||||||
|
} LZ4F_blockSizeID_t;
|
||||||
|
|
||||||
|
/* Linked blocks sharply reduce inefficiencies when using small blocks,
|
||||||
|
* they compress better.
|
||||||
|
* However, some LZ4 decoders are only compatible with independent blocks */
|
||||||
|
typedef enum {
|
||||||
|
LZ4F_blockLinked=0,
|
||||||
|
LZ4F_blockIndependent
|
||||||
|
LZ4F_OBSOLETE_ENUM(blockLinked)
|
||||||
|
LZ4F_OBSOLETE_ENUM(blockIndependent)
|
||||||
|
} LZ4F_blockMode_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
LZ4F_noContentChecksum=0,
|
||||||
|
LZ4F_contentChecksumEnabled
|
||||||
|
LZ4F_OBSOLETE_ENUM(noContentChecksum)
|
||||||
|
LZ4F_OBSOLETE_ENUM(contentChecksumEnabled)
|
||||||
|
} LZ4F_contentChecksum_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
LZ4F_noBlockChecksum=0,
|
||||||
|
LZ4F_blockChecksumEnabled
|
||||||
|
} LZ4F_blockChecksum_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
LZ4F_frame=0,
|
||||||
|
LZ4F_skippableFrame
|
||||||
|
LZ4F_OBSOLETE_ENUM(skippableFrame)
|
||||||
|
} LZ4F_frameType_t;
|
||||||
|
|
||||||
|
#ifdef LZ4F_ENABLE_OBSOLETE_ENUMS
|
||||||
|
typedef LZ4F_blockSizeID_t blockSizeID_t;
|
||||||
|
typedef LZ4F_blockMode_t blockMode_t;
|
||||||
|
typedef LZ4F_frameType_t frameType_t;
|
||||||
|
typedef LZ4F_contentChecksum_t contentChecksum_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*! LZ4F_frameInfo_t :
|
||||||
|
* makes it possible to set or read frame parameters.
|
||||||
|
* Structure must be first init to 0, using memset() or LZ4F_INIT_FRAMEINFO,
|
||||||
|
* setting all parameters to default.
|
||||||
|
* It's then possible to update selectively some parameters */
|
||||||
|
typedef struct {
|
||||||
|
LZ4F_blockSizeID_t blockSizeID; /* max64KB, max256KB, max1MB, max4MB; 0 == default */
|
||||||
|
LZ4F_blockMode_t blockMode; /* LZ4F_blockLinked, LZ4F_blockIndependent; 0 == default */
|
||||||
|
LZ4F_contentChecksum_t contentChecksumFlag; /* 1: frame terminated with 32-bit checksum of decompressed data; 0: disabled (default) */
|
||||||
|
LZ4F_frameType_t frameType; /* read-only field : LZ4F_frame or LZ4F_skippableFrame */
|
||||||
|
unsigned long long contentSize; /* Size of uncompressed content ; 0 == unknown */
|
||||||
|
unsigned dictID; /* Dictionary ID, sent by compressor to help decoder select correct dictionary; 0 == no dictID provided */
|
||||||
|
LZ4F_blockChecksum_t blockChecksumFlag; /* 1: each block followed by a checksum of block's compressed data; 0: disabled (default) */
|
||||||
|
} LZ4F_frameInfo_t;
|
||||||
|
|
||||||
|
#define LZ4F_INIT_FRAMEINFO { LZ4F_default, LZ4F_blockLinked, LZ4F_noContentChecksum, LZ4F_frame, 0ULL, 0U, LZ4F_noBlockChecksum } /* v1.8.3+ */
|
||||||
|
|
||||||
|
/*! LZ4F_preferences_t :
|
||||||
|
* makes it possible to supply advanced compression instructions to streaming interface.
|
||||||
|
* Structure must be first init to 0, using memset() or LZ4F_INIT_PREFERENCES,
|
||||||
|
* setting all parameters to default.
|
||||||
|
* All reserved fields must be set to zero. */
|
||||||
|
typedef struct {
|
||||||
|
LZ4F_frameInfo_t frameInfo;
|
||||||
|
int compressionLevel; /* 0: default (fast mode); values > LZ4HC_CLEVEL_MAX count as LZ4HC_CLEVEL_MAX; values < 0 trigger "fast acceleration" */
|
||||||
|
unsigned autoFlush; /* 1: always flush; reduces usage of internal buffers */
|
||||||
|
unsigned favorDecSpeed; /* 1: parser favors decompression speed vs compression ratio. Only works for high compression modes (>= LZ4HC_CLEVEL_OPT_MIN) */ /* v1.8.2+ */
|
||||||
|
unsigned reserved[3]; /* must be zero for forward compatibility */
|
||||||
|
} LZ4F_preferences_t;
|
||||||
|
|
||||||
|
#define LZ4F_INIT_PREFERENCES { LZ4F_INIT_FRAMEINFO, 0, 0u, 0u, { 0u, 0u, 0u } } /* v1.8.3+ */
|
||||||
|
|
||||||
|
|
||||||
|
/*-*********************************
|
||||||
|
* Simple compression function
|
||||||
|
***********************************/
|
||||||
|
|
||||||
|
LZ4FLIB_API int LZ4F_compressionLevel_max(void); /* v1.8.0+ */
|
||||||
|
|
||||||
|
/*! LZ4F_compressFrameBound() :
|
||||||
|
* Returns the maximum possible compressed size with LZ4F_compressFrame() given srcSize and preferences.
|
||||||
|
* `preferencesPtr` is optional. It can be replaced by NULL, in which case, the function will assume default preferences.
|
||||||
|
* Note : this result is only usable with LZ4F_compressFrame().
|
||||||
|
* It may also be relevant to LZ4F_compressUpdate() _only if_ no flush() operation is ever performed.
|
||||||
|
*/
|
||||||
|
LZ4FLIB_API size_t LZ4F_compressFrameBound(size_t srcSize, const LZ4F_preferences_t* preferencesPtr);
|
||||||
|
|
||||||
|
/*! LZ4F_compressFrame() :
|
||||||
|
* Compress srcBuffer content into an LZ4-compressed frame.
|
||||||
|
* It's a one shot operation, all input content is consumed, and all output is generated.
|
||||||
|
*
|
||||||
|
* Note : it's a stateless operation (no LZ4F_cctx state needed).
|
||||||
|
* In order to reduce load on the allocator, LZ4F_compressFrame(), by default,
|
||||||
|
* uses the stack to allocate space for the compression state and some table.
|
||||||
|
* If this usage of the stack is too much for your application,
|
||||||
|
* consider compiling `lz4frame.c` with compile-time macro LZ4F_HEAPMODE set to 1 instead.
|
||||||
|
* All state allocations will use the Heap.
|
||||||
|
* It also means each invocation of LZ4F_compressFrame() will trigger several internal alloc/free invocations.
|
||||||
|
*
|
||||||
|
* @dstCapacity MUST be >= LZ4F_compressFrameBound(srcSize, preferencesPtr).
|
||||||
|
* @preferencesPtr is optional : one can provide NULL, in which case all preferences are set to default.
|
||||||
|
* @return : number of bytes written into dstBuffer.
|
||||||
|
* or an error code if it fails (can be tested using LZ4F_isError())
|
||||||
|
*/
|
||||||
|
LZ4FLIB_API size_t LZ4F_compressFrame(void* dstBuffer, size_t dstCapacity,
|
||||||
|
const void* srcBuffer, size_t srcSize,
|
||||||
|
const LZ4F_preferences_t* preferencesPtr);
|
||||||
|
|
||||||
|
|
||||||
|
/*-***********************************
|
||||||
|
* Advanced compression functions
|
||||||
|
*************************************/
|
||||||
|
typedef struct LZ4F_cctx_s LZ4F_cctx; /* incomplete type */
|
||||||
|
typedef LZ4F_cctx* LZ4F_compressionContext_t; /* for compatibility with older APIs, prefer using LZ4F_cctx */
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
unsigned stableSrc; /* 1 == src content will remain present on future calls to LZ4F_compress(); skip copying src content within tmp buffer */
|
||||||
|
unsigned reserved[3];
|
||||||
|
} LZ4F_compressOptions_t;
|
||||||
|
|
||||||
|
/*--- Resource Management ---*/
|
||||||
|
|
||||||
|
#define LZ4F_VERSION 100 /* This number can be used to check for an incompatible API breaking change */
|
||||||
|
LZ4FLIB_API unsigned LZ4F_getVersion(void);
|
||||||
|
|
||||||
|
/*! LZ4F_createCompressionContext() :
|
||||||
|
* The first thing to do is to create a compressionContext object,
|
||||||
|
* which will keep track of operation state during streaming compression.
|
||||||
|
* This is achieved using LZ4F_createCompressionContext(), which takes as argument a version,
|
||||||
|
* and a pointer to LZ4F_cctx*, to write the resulting pointer into.
|
||||||
|
* @version provided MUST be LZ4F_VERSION. It is intended to track potential version mismatch, notably when using DLL.
|
||||||
|
* The function provides a pointer to a fully allocated LZ4F_cctx object.
|
||||||
|
* @cctxPtr MUST be != NULL.
|
||||||
|
* If @return != zero, context creation failed.
|
||||||
|
* A created compression context can be employed multiple times for consecutive streaming operations.
|
||||||
|
* Once all streaming compression jobs are completed,
|
||||||
|
* the state object can be released using LZ4F_freeCompressionContext().
|
||||||
|
* Note1 : LZ4F_freeCompressionContext() is always successful. Its return value can be ignored.
|
||||||
|
* Note2 : LZ4F_freeCompressionContext() works fine with NULL input pointers (do nothing).
|
||||||
|
**/
|
||||||
|
LZ4FLIB_API LZ4F_errorCode_t LZ4F_createCompressionContext(LZ4F_cctx** cctxPtr, unsigned version);
|
||||||
|
LZ4FLIB_API LZ4F_errorCode_t LZ4F_freeCompressionContext(LZ4F_cctx* cctx);
|
||||||
|
|
||||||
|
|
||||||
|
/*---- Compression ----*/
|
||||||
|
|
||||||
|
#define LZ4F_HEADER_SIZE_MIN 7 /* LZ4 Frame header size can vary, depending on selected parameters */
|
||||||
|
#define LZ4F_HEADER_SIZE_MAX 19
|
||||||
|
|
||||||
|
/* Size in bytes of a block header in little-endian format. Highest bit indicates if block data is uncompressed */
|
||||||
|
#define LZ4F_BLOCK_HEADER_SIZE 4
|
||||||
|
|
||||||
|
/* Size in bytes of a block checksum footer in little-endian format. */
|
||||||
|
#define LZ4F_BLOCK_CHECKSUM_SIZE 4
|
||||||
|
|
||||||
|
/* Size in bytes of the content checksum. */
|
||||||
|
#define LZ4F_CONTENT_CHECKSUM_SIZE 4
|
||||||
|
|
||||||
|
/*! LZ4F_compressBegin() :
|
||||||
|
* will write the frame header into dstBuffer.
|
||||||
|
* dstCapacity must be >= LZ4F_HEADER_SIZE_MAX bytes.
|
||||||
|
* `prefsPtr` is optional : NULL can be provided to set all preferences to default.
|
||||||
|
* @return : number of bytes written into dstBuffer for the header
|
||||||
|
* or an error code (which can be tested using LZ4F_isError())
|
||||||
|
*/
|
||||||
|
LZ4FLIB_API size_t LZ4F_compressBegin(LZ4F_cctx* cctx,
|
||||||
|
void* dstBuffer, size_t dstCapacity,
|
||||||
|
const LZ4F_preferences_t* prefsPtr);
|
||||||
|
|
||||||
|
/*! LZ4F_compressBound() :
|
||||||
|
* Provides minimum dstCapacity required to guarantee success of
|
||||||
|
* LZ4F_compressUpdate(), given a srcSize and preferences, for a worst case scenario.
|
||||||
|
* When srcSize==0, LZ4F_compressBound() provides an upper bound for LZ4F_flush() and LZ4F_compressEnd() instead.
|
||||||
|
* Note that the result is only valid for a single invocation of LZ4F_compressUpdate().
|
||||||
|
* When invoking LZ4F_compressUpdate() multiple times,
|
||||||
|
* if the output buffer is gradually filled up instead of emptied and re-used from its start,
|
||||||
|
* one must check if there is enough remaining capacity before each invocation, using LZ4F_compressBound().
|
||||||
|
* @return is always the same for a srcSize and prefsPtr.
|
||||||
|
* prefsPtr is optional : when NULL is provided, preferences will be set to cover worst case scenario.
|
||||||
|
* tech details :
|
||||||
|
* @return if automatic flushing is not enabled, includes the possibility that internal buffer might already be filled by up to (blockSize-1) bytes.
|
||||||
|
* It also includes frame footer (ending + checksum), since it might be generated by LZ4F_compressEnd().
|
||||||
|
* @return doesn't include frame header, as it was already generated by LZ4F_compressBegin().
|
||||||
|
*/
|
||||||
|
LZ4FLIB_API size_t LZ4F_compressBound(size_t srcSize, const LZ4F_preferences_t* prefsPtr);
|
||||||
|
|
||||||
|
/*! LZ4F_compressUpdate() :
|
||||||
|
* LZ4F_compressUpdate() can be called repetitively to compress as much data as necessary.
|
||||||
|
* Important rule: dstCapacity MUST be large enough to ensure operation success even in worst case situations.
|
||||||
|
* This value is provided by LZ4F_compressBound().
|
||||||
|
* If this condition is not respected, LZ4F_compress() will fail (result is an errorCode).
|
||||||
|
* After an error, the state is left in a UB state, and must be re-initialized or freed.
|
||||||
|
* If previously an uncompressed block was written, buffered data is flushed
|
||||||
|
* before appending compressed data is continued.
|
||||||
|
* `cOptPtr` is optional : NULL can be provided, in which case all options are set to default.
|
||||||
|
* @return : number of bytes written into `dstBuffer` (it can be zero, meaning input data was just buffered).
|
||||||
|
* or an error code if it fails (which can be tested using LZ4F_isError())
|
||||||
|
*/
|
||||||
|
LZ4FLIB_API size_t LZ4F_compressUpdate(LZ4F_cctx* cctx,
|
||||||
|
void* dstBuffer, size_t dstCapacity,
|
||||||
|
const void* srcBuffer, size_t srcSize,
|
||||||
|
const LZ4F_compressOptions_t* cOptPtr);
|
||||||
|
|
||||||
|
/*! LZ4F_flush() :
|
||||||
|
* When data must be generated and sent immediately, without waiting for a block to be completely filled,
|
||||||
|
* it's possible to call LZ4_flush(). It will immediately compress any data buffered within cctx.
|
||||||
|
* `dstCapacity` must be large enough to ensure the operation will be successful.
|
||||||
|
* `cOptPtr` is optional : it's possible to provide NULL, all options will be set to default.
|
||||||
|
* @return : nb of bytes written into dstBuffer (can be zero, when there is no data stored within cctx)
|
||||||
|
* or an error code if it fails (which can be tested using LZ4F_isError())
|
||||||
|
* Note : LZ4F_flush() is guaranteed to be successful when dstCapacity >= LZ4F_compressBound(0, prefsPtr).
|
||||||
|
*/
|
||||||
|
LZ4FLIB_API size_t LZ4F_flush(LZ4F_cctx* cctx,
|
||||||
|
void* dstBuffer, size_t dstCapacity,
|
||||||
|
const LZ4F_compressOptions_t* cOptPtr);
|
||||||
|
|
||||||
|
/*! LZ4F_compressEnd() :
|
||||||
|
* To properly finish an LZ4 frame, invoke LZ4F_compressEnd().
|
||||||
|
* It will flush whatever data remained within `cctx` (like LZ4_flush())
|
||||||
|
* and properly finalize the frame, with an endMark and a checksum.
|
||||||
|
* `cOptPtr` is optional : NULL can be provided, in which case all options will be set to default.
|
||||||
|
* @return : nb of bytes written into dstBuffer, necessarily >= 4 (endMark),
|
||||||
|
* or an error code if it fails (which can be tested using LZ4F_isError())
|
||||||
|
* Note : LZ4F_compressEnd() is guaranteed to be successful when dstCapacity >= LZ4F_compressBound(0, prefsPtr).
|
||||||
|
* A successful call to LZ4F_compressEnd() makes `cctx` available again for another compression task.
|
||||||
|
*/
|
||||||
|
LZ4FLIB_API size_t LZ4F_compressEnd(LZ4F_cctx* cctx,
|
||||||
|
void* dstBuffer, size_t dstCapacity,
|
||||||
|
const LZ4F_compressOptions_t* cOptPtr);
|
||||||
|
|
||||||
|
|
||||||
|
/*-*********************************
|
||||||
|
* Decompression functions
|
||||||
|
***********************************/
|
||||||
|
typedef struct LZ4F_dctx_s LZ4F_dctx; /* incomplete type */
|
||||||
|
typedef LZ4F_dctx* LZ4F_decompressionContext_t; /* compatibility with previous API versions */
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
unsigned stableDst; /* pledges that last 64KB decompressed data will remain available unmodified between invocations.
|
||||||
|
* This optimization skips storage operations in tmp buffers. */
|
||||||
|
unsigned skipChecksums; /* disable checksum calculation and verification, even when one is present in frame, to save CPU time.
|
||||||
|
* Setting this option to 1 once disables all checksums for the rest of the frame. */
|
||||||
|
unsigned reserved1; /* must be set to zero for forward compatibility */
|
||||||
|
unsigned reserved0; /* idem */
|
||||||
|
} LZ4F_decompressOptions_t;
|
||||||
|
|
||||||
|
|
||||||
|
/* Resource management */
|
||||||
|
|
||||||
|
/*! LZ4F_createDecompressionContext() :
|
||||||
|
* Create an LZ4F_dctx object, to track all decompression operations.
|
||||||
|
* @version provided MUST be LZ4F_VERSION.
|
||||||
|
* @dctxPtr MUST be valid.
|
||||||
|
* The function fills @dctxPtr with the value of a pointer to an allocated and initialized LZ4F_dctx object.
|
||||||
|
* The @return is an errorCode, which can be tested using LZ4F_isError().
|
||||||
|
* dctx memory can be released using LZ4F_freeDecompressionContext();
|
||||||
|
* Result of LZ4F_freeDecompressionContext() indicates current state of decompressionContext when being released.
|
||||||
|
* That is, it should be == 0 if decompression has been completed fully and correctly.
|
||||||
|
*/
|
||||||
|
LZ4FLIB_API LZ4F_errorCode_t LZ4F_createDecompressionContext(LZ4F_dctx** dctxPtr, unsigned version);
|
||||||
|
LZ4FLIB_API LZ4F_errorCode_t LZ4F_freeDecompressionContext(LZ4F_dctx* dctx);
|
||||||
|
|
||||||
|
|
||||||
|
/*-***********************************
|
||||||
|
* Streaming decompression functions
|
||||||
|
*************************************/
|
||||||
|
|
||||||
|
#define LZ4F_MAGICNUMBER 0x184D2204U
|
||||||
|
#define LZ4F_MAGIC_SKIPPABLE_START 0x184D2A50U
|
||||||
|
#define LZ4F_MIN_SIZE_TO_KNOW_HEADER_LENGTH 5
|
||||||
|
|
||||||
|
/*! LZ4F_headerSize() : v1.9.0+
|
||||||
|
* Provide the header size of a frame starting at `src`.
|
||||||
|
* `srcSize` must be >= LZ4F_MIN_SIZE_TO_KNOW_HEADER_LENGTH,
|
||||||
|
* which is enough to decode the header length.
|
||||||
|
* @return : size of frame header
|
||||||
|
* or an error code, which can be tested using LZ4F_isError()
|
||||||
|
* note : Frame header size is variable, but is guaranteed to be
|
||||||
|
* >= LZ4F_HEADER_SIZE_MIN bytes, and <= LZ4F_HEADER_SIZE_MAX bytes.
|
||||||
|
*/
|
||||||
|
LZ4FLIB_API size_t LZ4F_headerSize(const void* src, size_t srcSize);
|
||||||
|
|
||||||
|
/*! LZ4F_getFrameInfo() :
|
||||||
|
* This function extracts frame parameters (max blockSize, dictID, etc.).
|
||||||
|
* Its usage is optional: user can also invoke LZ4F_decompress() directly.
|
||||||
|
*
|
||||||
|
* Extracted information will fill an existing LZ4F_frameInfo_t structure.
|
||||||
|
* This can be useful for allocation and dictionary identification purposes.
|
||||||
|
*
|
||||||
|
* LZ4F_getFrameInfo() can work in the following situations :
|
||||||
|
*
|
||||||
|
* 1) At the beginning of a new frame, before any invocation of LZ4F_decompress().
|
||||||
|
* It will decode header from `srcBuffer`,
|
||||||
|
* consuming the header and starting the decoding process.
|
||||||
|
*
|
||||||
|
* Input size must be large enough to contain the full frame header.
|
||||||
|
* Frame header size can be known beforehand by LZ4F_headerSize().
|
||||||
|
* Frame header size is variable, but is guaranteed to be >= LZ4F_HEADER_SIZE_MIN bytes,
|
||||||
|
* and not more than <= LZ4F_HEADER_SIZE_MAX bytes.
|
||||||
|
* Hence, blindly providing LZ4F_HEADER_SIZE_MAX bytes or more will always work.
|
||||||
|
* It's allowed to provide more input data than the header size,
|
||||||
|
* LZ4F_getFrameInfo() will only consume the header.
|
||||||
|
*
|
||||||
|
* If input size is not large enough,
|
||||||
|
* aka if it's smaller than header size,
|
||||||
|
* function will fail and return an error code.
|
||||||
|
*
|
||||||
|
* 2) After decoding has been started,
|
||||||
|
* it's possible to invoke LZ4F_getFrameInfo() anytime
|
||||||
|
* to extract already decoded frame parameters stored within dctx.
|
||||||
|
*
|
||||||
|
* Note that, if decoding has barely started,
|
||||||
|
* and not yet read enough information to decode the header,
|
||||||
|
* LZ4F_getFrameInfo() will fail.
|
||||||
|
*
|
||||||
|
* The number of bytes consumed from srcBuffer will be updated in *srcSizePtr (necessarily <= original value).
|
||||||
|
* LZ4F_getFrameInfo() only consumes bytes when decoding has not yet started,
|
||||||
|
* and when decoding the header has been successful.
|
||||||
|
* Decompression must then resume from (srcBuffer + *srcSizePtr).
|
||||||
|
*
|
||||||
|
* @return : a hint about how many srcSize bytes LZ4F_decompress() expects for next call,
|
||||||
|
* or an error code which can be tested using LZ4F_isError().
|
||||||
|
* note 1 : in case of error, dctx is not modified. Decoding operation can resume from beginning safely.
|
||||||
|
* note 2 : frame parameters are *copied into* an already allocated LZ4F_frameInfo_t structure.
|
||||||
|
*/
|
||||||
|
LZ4FLIB_API size_t
|
||||||
|
LZ4F_getFrameInfo(LZ4F_dctx* dctx,
|
||||||
|
LZ4F_frameInfo_t* frameInfoPtr,
|
||||||
|
const void* srcBuffer, size_t* srcSizePtr);
|
||||||
|
|
||||||
|
/*! LZ4F_decompress() :
|
||||||
|
* Call this function repetitively to regenerate data compressed in `srcBuffer`.
|
||||||
|
*
|
||||||
|
* The function requires a valid dctx state.
|
||||||
|
* It will read up to *srcSizePtr bytes from srcBuffer,
|
||||||
|
* and decompress data into dstBuffer, of capacity *dstSizePtr.
|
||||||
|
*
|
||||||
|
* The nb of bytes consumed from srcBuffer will be written into *srcSizePtr (necessarily <= original value).
|
||||||
|
* The nb of bytes decompressed into dstBuffer will be written into *dstSizePtr (necessarily <= original value).
|
||||||
|
*
|
||||||
|
* The function does not necessarily read all input bytes, so always check value in *srcSizePtr.
|
||||||
|
* Unconsumed source data must be presented again in subsequent invocations.
|
||||||
|
*
|
||||||
|
* `dstBuffer` can freely change between each consecutive function invocation.
|
||||||
|
* `dstBuffer` content will be overwritten.
|
||||||
|
*
|
||||||
|
* Note: if `LZ4F_getFrameInfo()` is called before `LZ4F_decompress()`, srcBuffer must be updated to reflect
|
||||||
|
* the number of bytes consumed after reading the frame header. Failure to update srcBuffer before calling
|
||||||
|
* `LZ4F_decompress()` will cause decompression failure or, even worse, successful but incorrect decompression.
|
||||||
|
* See the `LZ4F_getFrameInfo()` docs for details.
|
||||||
|
*
|
||||||
|
* @return : an hint of how many `srcSize` bytes LZ4F_decompress() expects for next call.
|
||||||
|
* Schematically, it's the size of the current (or remaining) compressed block + header of next block.
|
||||||
|
* Respecting the hint provides some small speed benefit, because it skips intermediate buffers.
|
||||||
|
* This is just a hint though, it's always possible to provide any srcSize.
|
||||||
|
*
|
||||||
|
* When a frame is fully decoded, @return will be 0 (no more data expected).
|
||||||
|
* When provided with more bytes than necessary to decode a frame,
|
||||||
|
* LZ4F_decompress() will stop reading exactly at end of current frame, and @return 0.
|
||||||
|
*
|
||||||
|
* If decompression failed, @return is an error code, which can be tested using LZ4F_isError().
|
||||||
|
* After a decompression error, the `dctx` context is not resumable.
|
||||||
|
* Use LZ4F_resetDecompressionContext() to return to clean state.
|
||||||
|
*
|
||||||
|
* After a frame is fully decoded, dctx can be used again to decompress another frame.
|
||||||
|
*/
|
||||||
|
LZ4FLIB_API size_t
|
||||||
|
LZ4F_decompress(LZ4F_dctx* dctx,
|
||||||
|
void* dstBuffer, size_t* dstSizePtr,
|
||||||
|
const void* srcBuffer, size_t* srcSizePtr,
|
||||||
|
const LZ4F_decompressOptions_t* dOptPtr);
|
||||||
|
|
||||||
|
|
||||||
|
/*! LZ4F_resetDecompressionContext() : added in v1.8.0
|
||||||
|
* In case of an error, the context is left in "undefined" state.
|
||||||
|
* In which case, it's necessary to reset it, before re-using it.
|
||||||
|
* This method can also be used to abruptly stop any unfinished decompression,
|
||||||
|
* and start a new one using same context resources. */
|
||||||
|
LZ4FLIB_API void LZ4F_resetDecompressionContext(LZ4F_dctx* dctx); /* always successful */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#if defined (__cplusplus)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* LZ4F_H_09782039843 */
|
||||||
|
|
||||||
|
#if defined(LZ4F_STATIC_LINKING_ONLY) && !defined(LZ4F_H_STATIC_09782039843)
|
||||||
|
#define LZ4F_H_STATIC_09782039843
|
||||||
|
|
||||||
|
#if defined (__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* These declarations are not stable and may change in the future.
|
||||||
|
* They are therefore only safe to depend on
|
||||||
|
* when the caller is statically linked against the library.
|
||||||
|
* To access their declarations, define LZ4F_STATIC_LINKING_ONLY.
|
||||||
|
*
|
||||||
|
* By default, these symbols aren't published into shared/dynamic libraries.
|
||||||
|
* You can override this behavior and force them to be published
|
||||||
|
* by defining LZ4F_PUBLISH_STATIC_FUNCTIONS.
|
||||||
|
* Use at your own risk.
|
||||||
|
*/
|
||||||
|
#ifdef LZ4F_PUBLISH_STATIC_FUNCTIONS
|
||||||
|
# define LZ4FLIB_STATIC_API LZ4FLIB_API
|
||||||
|
#else
|
||||||
|
# define LZ4FLIB_STATIC_API
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* --- Error List --- */
|
||||||
|
#define LZ4F_LIST_ERRORS(ITEM) \
|
||||||
|
ITEM(OK_NoError) \
|
||||||
|
ITEM(ERROR_GENERIC) \
|
||||||
|
ITEM(ERROR_maxBlockSize_invalid) \
|
||||||
|
ITEM(ERROR_blockMode_invalid) \
|
||||||
|
ITEM(ERROR_contentChecksumFlag_invalid) \
|
||||||
|
ITEM(ERROR_compressionLevel_invalid) \
|
||||||
|
ITEM(ERROR_headerVersion_wrong) \
|
||||||
|
ITEM(ERROR_blockChecksum_invalid) \
|
||||||
|
ITEM(ERROR_reservedFlag_set) \
|
||||||
|
ITEM(ERROR_allocation_failed) \
|
||||||
|
ITEM(ERROR_srcSize_tooLarge) \
|
||||||
|
ITEM(ERROR_dstMaxSize_tooSmall) \
|
||||||
|
ITEM(ERROR_frameHeader_incomplete) \
|
||||||
|
ITEM(ERROR_frameType_unknown) \
|
||||||
|
ITEM(ERROR_frameSize_wrong) \
|
||||||
|
ITEM(ERROR_srcPtr_wrong) \
|
||||||
|
ITEM(ERROR_decompressionFailed) \
|
||||||
|
ITEM(ERROR_headerChecksum_invalid) \
|
||||||
|
ITEM(ERROR_contentChecksum_invalid) \
|
||||||
|
ITEM(ERROR_frameDecoding_alreadyStarted) \
|
||||||
|
ITEM(ERROR_compressionState_uninitialized) \
|
||||||
|
ITEM(ERROR_parameter_null) \
|
||||||
|
ITEM(ERROR_maxCode)
|
||||||
|
|
||||||
|
#define LZ4F_GENERATE_ENUM(ENUM) LZ4F_##ENUM,
|
||||||
|
|
||||||
|
/* enum list is exposed, to handle specific errors */
|
||||||
|
typedef enum { LZ4F_LIST_ERRORS(LZ4F_GENERATE_ENUM)
|
||||||
|
_LZ4F_dummy_error_enum_for_c89_never_used } LZ4F_errorCodes;
|
||||||
|
|
||||||
|
LZ4FLIB_STATIC_API LZ4F_errorCodes LZ4F_getErrorCode(size_t functionResult);
|
||||||
|
|
||||||
|
|
||||||
|
/*! LZ4F_getBlockSize() :
|
||||||
|
* Return, in scalar format (size_t),
|
||||||
|
* the maximum block size associated with blockSizeID.
|
||||||
|
**/
|
||||||
|
LZ4FLIB_STATIC_API size_t LZ4F_getBlockSize(LZ4F_blockSizeID_t blockSizeID);
|
||||||
|
|
||||||
|
/*! LZ4F_uncompressedUpdate() :
|
||||||
|
* LZ4F_uncompressedUpdate() can be called repetitively to add as much data uncompressed data as necessary.
|
||||||
|
* Important rule: dstCapacity MUST be large enough to store the entire source buffer as
|
||||||
|
* no compression is done for this operation
|
||||||
|
* If this condition is not respected, LZ4F_uncompressedUpdate() will fail (result is an errorCode).
|
||||||
|
* After an error, the state is left in a UB state, and must be re-initialized or freed.
|
||||||
|
* If previously a compressed block was written, buffered data is flushed
|
||||||
|
* before appending uncompressed data is continued.
|
||||||
|
* This is only supported when LZ4F_blockIndependent is used
|
||||||
|
* `cOptPtr` is optional : NULL can be provided, in which case all options are set to default.
|
||||||
|
* @return : number of bytes written into `dstBuffer` (it can be zero, meaning input data was just buffered).
|
||||||
|
* or an error code if it fails (which can be tested using LZ4F_isError())
|
||||||
|
*/
|
||||||
|
LZ4FLIB_STATIC_API size_t
|
||||||
|
LZ4F_uncompressedUpdate(LZ4F_cctx* cctx,
|
||||||
|
void* dstBuffer, size_t dstCapacity,
|
||||||
|
const void* srcBuffer, size_t srcSize,
|
||||||
|
const LZ4F_compressOptions_t* cOptPtr);
|
||||||
|
|
||||||
|
/**********************************
|
||||||
|
* Bulk processing dictionary API
|
||||||
|
*********************************/
|
||||||
|
|
||||||
|
/* A Dictionary is useful for the compression of small messages (KB range).
|
||||||
|
* It dramatically improves compression efficiency.
|
||||||
|
*
|
||||||
|
* LZ4 can ingest any input as dictionary, though only the last 64 KB are useful.
|
||||||
|
* Best results are generally achieved by using Zstandard's Dictionary Builder
|
||||||
|
* to generate a high-quality dictionary from a set of samples.
|
||||||
|
*
|
||||||
|
* Loading a dictionary has a cost, since it involves construction of tables.
|
||||||
|
* The Bulk processing dictionary API makes it possible to share this cost
|
||||||
|
* over an arbitrary number of compression jobs, even concurrently,
|
||||||
|
* markedly improving compression latency for these cases.
|
||||||
|
*
|
||||||
|
* The same dictionary will have to be used on the decompression side
|
||||||
|
* for decoding to be successful.
|
||||||
|
* To help identify the correct dictionary at decoding stage,
|
||||||
|
* the frame header allows optional embedding of a dictID field.
|
||||||
|
*/
|
||||||
|
typedef struct LZ4F_CDict_s LZ4F_CDict;
|
||||||
|
|
||||||
|
/*! LZ4_createCDict() :
|
||||||
|
* When compressing multiple messages / blocks using the same dictionary, it's recommended to load it just once.
|
||||||
|
* LZ4_createCDict() will create a digested dictionary, ready to start future compression operations without startup delay.
|
||||||
|
* LZ4_CDict can be created once and shared by multiple threads concurrently, since its usage is read-only.
|
||||||
|
* `dictBuffer` can be released after LZ4_CDict creation, since its content is copied within CDict */
|
||||||
|
LZ4FLIB_STATIC_API LZ4F_CDict* LZ4F_createCDict(const void* dictBuffer, size_t dictSize);
|
||||||
|
LZ4FLIB_STATIC_API void LZ4F_freeCDict(LZ4F_CDict* CDict);
|
||||||
|
|
||||||
|
|
||||||
|
/*! LZ4_compressFrame_usingCDict() :
|
||||||
|
* Compress an entire srcBuffer into a valid LZ4 frame using a digested Dictionary.
|
||||||
|
* cctx must point to a context created by LZ4F_createCompressionContext().
|
||||||
|
* If cdict==NULL, compress without a dictionary.
|
||||||
|
* dstBuffer MUST be >= LZ4F_compressFrameBound(srcSize, preferencesPtr).
|
||||||
|
* If this condition is not respected, function will fail (@return an errorCode).
|
||||||
|
* The LZ4F_preferences_t structure is optional : you may provide NULL as argument,
|
||||||
|
* but it's not recommended, as it's the only way to provide dictID in the frame header.
|
||||||
|
* @return : number of bytes written into dstBuffer.
|
||||||
|
* or an error code if it fails (can be tested using LZ4F_isError()) */
|
||||||
|
LZ4FLIB_STATIC_API size_t
|
||||||
|
LZ4F_compressFrame_usingCDict(LZ4F_cctx* cctx,
|
||||||
|
void* dst, size_t dstCapacity,
|
||||||
|
const void* src, size_t srcSize,
|
||||||
|
const LZ4F_CDict* cdict,
|
||||||
|
const LZ4F_preferences_t* preferencesPtr);
|
||||||
|
|
||||||
|
|
||||||
|
/*! LZ4F_compressBegin_usingCDict() :
|
||||||
|
* Inits streaming dictionary compression, and writes the frame header into dstBuffer.
|
||||||
|
* dstCapacity must be >= LZ4F_HEADER_SIZE_MAX bytes.
|
||||||
|
* `prefsPtr` is optional : you may provide NULL as argument,
|
||||||
|
* however, it's the only way to provide dictID in the frame header.
|
||||||
|
* @return : number of bytes written into dstBuffer for the header,
|
||||||
|
* or an error code (which can be tested using LZ4F_isError()) */
|
||||||
|
LZ4FLIB_STATIC_API size_t
|
||||||
|
LZ4F_compressBegin_usingCDict(LZ4F_cctx* cctx,
|
||||||
|
void* dstBuffer, size_t dstCapacity,
|
||||||
|
const LZ4F_CDict* cdict,
|
||||||
|
const LZ4F_preferences_t* prefsPtr);
|
||||||
|
|
||||||
|
|
||||||
|
/*! LZ4F_decompress_usingDict() :
|
||||||
|
* Same as LZ4F_decompress(), using a predefined dictionary.
|
||||||
|
* Dictionary is used "in place", without any preprocessing.
|
||||||
|
** It must remain accessible throughout the entire frame decoding. */
|
||||||
|
LZ4FLIB_STATIC_API size_t
|
||||||
|
LZ4F_decompress_usingDict(LZ4F_dctx* dctxPtr,
|
||||||
|
void* dstBuffer, size_t* dstSizePtr,
|
||||||
|
const void* srcBuffer, size_t* srcSizePtr,
|
||||||
|
const void* dict, size_t dictSize,
|
||||||
|
const LZ4F_decompressOptions_t* decompressOptionsPtr);
|
||||||
|
|
||||||
|
|
||||||
|
/*! Custom memory allocation : v1.9.4+
|
||||||
|
* These prototypes make it possible to pass custom allocation/free functions.
|
||||||
|
* LZ4F_customMem is provided at state creation time, using LZ4F_create*_advanced() listed below.
|
||||||
|
* All allocation/free operations will be completed using these custom variants instead of regular <stdlib.h> ones.
|
||||||
|
*/
|
||||||
|
typedef void* (*LZ4F_AllocFunction) (void* opaqueState, size_t size);
|
||||||
|
typedef void* (*LZ4F_CallocFunction) (void* opaqueState, size_t size);
|
||||||
|
typedef void (*LZ4F_FreeFunction) (void* opaqueState, void* address);
|
||||||
|
typedef struct {
|
||||||
|
LZ4F_AllocFunction customAlloc;
|
||||||
|
LZ4F_CallocFunction customCalloc; /* optional; when not defined, uses customAlloc + memset */
|
||||||
|
LZ4F_FreeFunction customFree;
|
||||||
|
void* opaqueState;
|
||||||
|
} LZ4F_CustomMem;
|
||||||
|
static
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__((__unused__))
|
||||||
|
#endif
|
||||||
|
LZ4F_CustomMem const LZ4F_defaultCMem = { NULL, NULL, NULL, NULL }; /**< this constant defers to stdlib's functions */
|
||||||
|
|
||||||
|
LZ4FLIB_STATIC_API LZ4F_cctx* LZ4F_createCompressionContext_advanced(LZ4F_CustomMem customMem, unsigned version);
|
||||||
|
LZ4FLIB_STATIC_API LZ4F_dctx* LZ4F_createDecompressionContext_advanced(LZ4F_CustomMem customMem, unsigned version);
|
||||||
|
LZ4FLIB_STATIC_API LZ4F_CDict* LZ4F_createCDict_advanced(LZ4F_CustomMem customMem, const void* dictBuffer, size_t dictSize);
|
||||||
|
|
||||||
|
|
||||||
|
#if defined (__cplusplus)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* defined(LZ4F_STATIC_LINKING_ONLY) && !defined(LZ4F_H_STATIC_09782039843) */
|
47
csbindgen-tests/c/lz4/lz4frame_static.h
Normal file
47
csbindgen-tests/c/lz4/lz4frame_static.h
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
/*
|
||||||
|
LZ4 auto-framing library
|
||||||
|
Header File for static linking only
|
||||||
|
Copyright (C) 2011-2020, Yann Collet.
|
||||||
|
|
||||||
|
BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are
|
||||||
|
met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above
|
||||||
|
copyright notice, this list of conditions and the following disclaimer
|
||||||
|
in the documentation and/or other materials provided with the
|
||||||
|
distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
You can contact the author at :
|
||||||
|
- LZ4 source repository : https://github.com/lz4/lz4
|
||||||
|
- LZ4 public forum : https://groups.google.com/forum/#!forum/lz4c
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef LZ4FRAME_STATIC_H_0398209384
|
||||||
|
#define LZ4FRAME_STATIC_H_0398209384
|
||||||
|
|
||||||
|
/* The declarations that formerly were made here have been merged into
|
||||||
|
* lz4frame.h, protected by the LZ4F_STATIC_LINKING_ONLY macro. Going forward,
|
||||||
|
* it is recommended to simply include that header directly.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define LZ4F_STATIC_LINKING_ONLY
|
||||||
|
#include "lz4frame.h"
|
||||||
|
|
||||||
|
#endif /* LZ4FRAME_STATIC_H_0398209384 */
|
1637
csbindgen-tests/c/lz4/lz4hc.c
Normal file
1637
csbindgen-tests/c/lz4/lz4hc.c
Normal file
File diff suppressed because it is too large
Load Diff
413
csbindgen-tests/c/lz4/lz4hc.h
Normal file
413
csbindgen-tests/c/lz4/lz4hc.h
Normal file
@ -0,0 +1,413 @@
|
|||||||
|
/*
|
||||||
|
LZ4 HC - High Compression Mode of LZ4
|
||||||
|
Header File
|
||||||
|
Copyright (C) 2011-2020, Yann Collet.
|
||||||
|
BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are
|
||||||
|
met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above
|
||||||
|
copyright notice, this list of conditions and the following disclaimer
|
||||||
|
in the documentation and/or other materials provided with the
|
||||||
|
distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
You can contact the author at :
|
||||||
|
- LZ4 source repository : https://github.com/lz4/lz4
|
||||||
|
- LZ4 public forum : https://groups.google.com/forum/#!forum/lz4c
|
||||||
|
*/
|
||||||
|
#ifndef LZ4_HC_H_19834876238432
|
||||||
|
#define LZ4_HC_H_19834876238432
|
||||||
|
|
||||||
|
#if defined (__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* --- Dependency --- */
|
||||||
|
/* note : lz4hc requires lz4.h/lz4.c for compilation */
|
||||||
|
#include "lz4.h" /* stddef, LZ4LIB_API, LZ4_DEPRECATED */
|
||||||
|
|
||||||
|
|
||||||
|
/* --- Useful constants --- */
|
||||||
|
#define LZ4HC_CLEVEL_MIN 3
|
||||||
|
#define LZ4HC_CLEVEL_DEFAULT 9
|
||||||
|
#define LZ4HC_CLEVEL_OPT_MIN 10
|
||||||
|
#define LZ4HC_CLEVEL_MAX 12
|
||||||
|
|
||||||
|
|
||||||
|
/*-************************************
|
||||||
|
* Block Compression
|
||||||
|
**************************************/
|
||||||
|
/*! LZ4_compress_HC() :
|
||||||
|
* Compress data from `src` into `dst`, using the powerful but slower "HC" algorithm.
|
||||||
|
* `dst` must be already allocated.
|
||||||
|
* Compression is guaranteed to succeed if `dstCapacity >= LZ4_compressBound(srcSize)` (see "lz4.h")
|
||||||
|
* Max supported `srcSize` value is LZ4_MAX_INPUT_SIZE (see "lz4.h")
|
||||||
|
* `compressionLevel` : any value between 1 and LZ4HC_CLEVEL_MAX will work.
|
||||||
|
* Values > LZ4HC_CLEVEL_MAX behave the same as LZ4HC_CLEVEL_MAX.
|
||||||
|
* @return : the number of bytes written into 'dst'
|
||||||
|
* or 0 if compression fails.
|
||||||
|
*/
|
||||||
|
LZ4LIB_API int LZ4_compress_HC (const char* src, char* dst, int srcSize, int dstCapacity, int compressionLevel);
|
||||||
|
|
||||||
|
|
||||||
|
/* Note :
|
||||||
|
* Decompression functions are provided within "lz4.h" (BSD license)
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*! LZ4_compress_HC_extStateHC() :
|
||||||
|
* Same as LZ4_compress_HC(), but using an externally allocated memory segment for `state`.
|
||||||
|
* `state` size is provided by LZ4_sizeofStateHC().
|
||||||
|
* Memory segment must be aligned on 8-bytes boundaries (which a normal malloc() should do properly).
|
||||||
|
*/
|
||||||
|
LZ4LIB_API int LZ4_sizeofStateHC(void);
|
||||||
|
LZ4LIB_API int LZ4_compress_HC_extStateHC(void* stateHC, const char* src, char* dst, int srcSize, int maxDstSize, int compressionLevel);
|
||||||
|
|
||||||
|
|
||||||
|
/*! LZ4_compress_HC_destSize() : v1.9.0+
|
||||||
|
* Will compress as much data as possible from `src`
|
||||||
|
* to fit into `targetDstSize` budget.
|
||||||
|
* Result is provided in 2 parts :
|
||||||
|
* @return : the number of bytes written into 'dst' (necessarily <= targetDstSize)
|
||||||
|
* or 0 if compression fails.
|
||||||
|
* `srcSizePtr` : on success, *srcSizePtr is updated to indicate how much bytes were read from `src`
|
||||||
|
*/
|
||||||
|
LZ4LIB_API int LZ4_compress_HC_destSize(void* stateHC,
|
||||||
|
const char* src, char* dst,
|
||||||
|
int* srcSizePtr, int targetDstSize,
|
||||||
|
int compressionLevel);
|
||||||
|
|
||||||
|
|
||||||
|
/*-************************************
|
||||||
|
* Streaming Compression
|
||||||
|
* Bufferless synchronous API
|
||||||
|
**************************************/
|
||||||
|
typedef union LZ4_streamHC_u LZ4_streamHC_t; /* incomplete type (defined later) */
|
||||||
|
|
||||||
|
/*! LZ4_createStreamHC() and LZ4_freeStreamHC() :
|
||||||
|
* These functions create and release memory for LZ4 HC streaming state.
|
||||||
|
* Newly created states are automatically initialized.
|
||||||
|
* A same state can be used multiple times consecutively,
|
||||||
|
* starting with LZ4_resetStreamHC_fast() to start a new stream of blocks.
|
||||||
|
*/
|
||||||
|
LZ4LIB_API LZ4_streamHC_t* LZ4_createStreamHC(void);
|
||||||
|
LZ4LIB_API int LZ4_freeStreamHC (LZ4_streamHC_t* streamHCPtr);
|
||||||
|
|
||||||
|
/*
|
||||||
|
These functions compress data in successive blocks of any size,
|
||||||
|
using previous blocks as dictionary, to improve compression ratio.
|
||||||
|
One key assumption is that previous blocks (up to 64 KB) remain read-accessible while compressing next blocks.
|
||||||
|
There is an exception for ring buffers, which can be smaller than 64 KB.
|
||||||
|
Ring-buffer scenario is automatically detected and handled within LZ4_compress_HC_continue().
|
||||||
|
|
||||||
|
Before starting compression, state must be allocated and properly initialized.
|
||||||
|
LZ4_createStreamHC() does both, though compression level is set to LZ4HC_CLEVEL_DEFAULT.
|
||||||
|
|
||||||
|
Selecting the compression level can be done with LZ4_resetStreamHC_fast() (starts a new stream)
|
||||||
|
or LZ4_setCompressionLevel() (anytime, between blocks in the same stream) (experimental).
|
||||||
|
LZ4_resetStreamHC_fast() only works on states which have been properly initialized at least once,
|
||||||
|
which is automatically the case when state is created using LZ4_createStreamHC().
|
||||||
|
|
||||||
|
After reset, a first "fictional block" can be designated as initial dictionary,
|
||||||
|
using LZ4_loadDictHC() (Optional).
|
||||||
|
|
||||||
|
Invoke LZ4_compress_HC_continue() to compress each successive block.
|
||||||
|
The number of blocks is unlimited.
|
||||||
|
Previous input blocks, including initial dictionary when present,
|
||||||
|
must remain accessible and unmodified during compression.
|
||||||
|
|
||||||
|
It's allowed to update compression level anytime between blocks,
|
||||||
|
using LZ4_setCompressionLevel() (experimental).
|
||||||
|
|
||||||
|
'dst' buffer should be sized to handle worst case scenarios
|
||||||
|
(see LZ4_compressBound(), it ensures compression success).
|
||||||
|
In case of failure, the API does not guarantee recovery,
|
||||||
|
so the state _must_ be reset.
|
||||||
|
To ensure compression success
|
||||||
|
whenever `dst` buffer size cannot be made >= LZ4_compressBound(),
|
||||||
|
consider using LZ4_compress_HC_continue_destSize().
|
||||||
|
|
||||||
|
Whenever previous input blocks can't be preserved unmodified in-place during compression of next blocks,
|
||||||
|
it's possible to copy the last blocks into a more stable memory space, using LZ4_saveDictHC().
|
||||||
|
Return value of LZ4_saveDictHC() is the size of dictionary effectively saved into 'safeBuffer' (<= 64 KB)
|
||||||
|
|
||||||
|
After completing a streaming compression,
|
||||||
|
it's possible to start a new stream of blocks, using the same LZ4_streamHC_t state,
|
||||||
|
just by resetting it, using LZ4_resetStreamHC_fast().
|
||||||
|
*/
|
||||||
|
|
||||||
|
LZ4LIB_API void LZ4_resetStreamHC_fast(LZ4_streamHC_t* streamHCPtr, int compressionLevel); /* v1.9.0+ */
|
||||||
|
LZ4LIB_API int LZ4_loadDictHC (LZ4_streamHC_t* streamHCPtr, const char* dictionary, int dictSize);
|
||||||
|
|
||||||
|
LZ4LIB_API int LZ4_compress_HC_continue (LZ4_streamHC_t* streamHCPtr,
|
||||||
|
const char* src, char* dst,
|
||||||
|
int srcSize, int maxDstSize);
|
||||||
|
|
||||||
|
/*! LZ4_compress_HC_continue_destSize() : v1.9.0+
|
||||||
|
* Similar to LZ4_compress_HC_continue(),
|
||||||
|
* but will read as much data as possible from `src`
|
||||||
|
* to fit into `targetDstSize` budget.
|
||||||
|
* Result is provided into 2 parts :
|
||||||
|
* @return : the number of bytes written into 'dst' (necessarily <= targetDstSize)
|
||||||
|
* or 0 if compression fails.
|
||||||
|
* `srcSizePtr` : on success, *srcSizePtr will be updated to indicate how much bytes were read from `src`.
|
||||||
|
* Note that this function may not consume the entire input.
|
||||||
|
*/
|
||||||
|
LZ4LIB_API int LZ4_compress_HC_continue_destSize(LZ4_streamHC_t* LZ4_streamHCPtr,
|
||||||
|
const char* src, char* dst,
|
||||||
|
int* srcSizePtr, int targetDstSize);
|
||||||
|
|
||||||
|
LZ4LIB_API int LZ4_saveDictHC (LZ4_streamHC_t* streamHCPtr, char* safeBuffer, int maxDictSize);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*^**********************************************
|
||||||
|
* !!!!!! STATIC LINKING ONLY !!!!!!
|
||||||
|
***********************************************/
|
||||||
|
|
||||||
|
/*-******************************************************************
|
||||||
|
* PRIVATE DEFINITIONS :
|
||||||
|
* Do not use these definitions directly.
|
||||||
|
* They are merely exposed to allow static allocation of `LZ4_streamHC_t`.
|
||||||
|
* Declare an `LZ4_streamHC_t` directly, rather than any type below.
|
||||||
|
* Even then, only do so in the context of static linking, as definitions may change between versions.
|
||||||
|
********************************************************************/
|
||||||
|
|
||||||
|
#define LZ4HC_DICTIONARY_LOGSIZE 16
|
||||||
|
#define LZ4HC_MAXD (1<<LZ4HC_DICTIONARY_LOGSIZE)
|
||||||
|
#define LZ4HC_MAXD_MASK (LZ4HC_MAXD - 1)
|
||||||
|
|
||||||
|
#define LZ4HC_HASH_LOG 15
|
||||||
|
#define LZ4HC_HASHTABLESIZE (1 << LZ4HC_HASH_LOG)
|
||||||
|
#define LZ4HC_HASH_MASK (LZ4HC_HASHTABLESIZE - 1)
|
||||||
|
|
||||||
|
|
||||||
|
/* Never ever use these definitions directly !
|
||||||
|
* Declare or allocate an LZ4_streamHC_t instead.
|
||||||
|
**/
|
||||||
|
typedef struct LZ4HC_CCtx_internal LZ4HC_CCtx_internal;
|
||||||
|
struct LZ4HC_CCtx_internal
|
||||||
|
{
|
||||||
|
LZ4_u32 hashTable[LZ4HC_HASHTABLESIZE];
|
||||||
|
LZ4_u16 chainTable[LZ4HC_MAXD];
|
||||||
|
const LZ4_byte* end; /* next block here to continue on current prefix */
|
||||||
|
const LZ4_byte* prefixStart; /* Indexes relative to this position */
|
||||||
|
const LZ4_byte* dictStart; /* alternate reference for extDict */
|
||||||
|
LZ4_u32 dictLimit; /* below that point, need extDict */
|
||||||
|
LZ4_u32 lowLimit; /* below that point, no more dict */
|
||||||
|
LZ4_u32 nextToUpdate; /* index from which to continue dictionary update */
|
||||||
|
short compressionLevel;
|
||||||
|
LZ4_i8 favorDecSpeed; /* favor decompression speed if this flag set,
|
||||||
|
otherwise, favor compression ratio */
|
||||||
|
LZ4_i8 dirty; /* stream has to be fully reset if this flag is set */
|
||||||
|
const LZ4HC_CCtx_internal* dictCtx;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define LZ4_STREAMHC_MINSIZE 262200 /* static size, for inter-version compatibility */
|
||||||
|
union LZ4_streamHC_u {
|
||||||
|
char minStateSize[LZ4_STREAMHC_MINSIZE];
|
||||||
|
LZ4HC_CCtx_internal internal_donotuse;
|
||||||
|
}; /* previously typedef'd to LZ4_streamHC_t */
|
||||||
|
|
||||||
|
/* LZ4_streamHC_t :
|
||||||
|
* This structure allows static allocation of LZ4 HC streaming state.
|
||||||
|
* This can be used to allocate statically on stack, or as part of a larger structure.
|
||||||
|
*
|
||||||
|
* Such state **must** be initialized using LZ4_initStreamHC() before first use.
|
||||||
|
*
|
||||||
|
* Note that invoking LZ4_initStreamHC() is not required when
|
||||||
|
* the state was created using LZ4_createStreamHC() (which is recommended).
|
||||||
|
* Using the normal builder, a newly created state is automatically initialized.
|
||||||
|
*
|
||||||
|
* Static allocation shall only be used in combination with static linking.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* LZ4_initStreamHC() : v1.9.0+
|
||||||
|
* Required before first use of a statically allocated LZ4_streamHC_t.
|
||||||
|
* Before v1.9.0 : use LZ4_resetStreamHC() instead
|
||||||
|
*/
|
||||||
|
LZ4LIB_API LZ4_streamHC_t* LZ4_initStreamHC(void* buffer, size_t size);
|
||||||
|
|
||||||
|
|
||||||
|
/*-************************************
|
||||||
|
* Deprecated Functions
|
||||||
|
**************************************/
|
||||||
|
/* see lz4.h LZ4_DISABLE_DEPRECATE_WARNINGS to turn off deprecation warnings */
|
||||||
|
|
||||||
|
/* deprecated compression functions */
|
||||||
|
LZ4_DEPRECATED("use LZ4_compress_HC() instead") LZ4LIB_API int LZ4_compressHC (const char* source, char* dest, int inputSize);
|
||||||
|
LZ4_DEPRECATED("use LZ4_compress_HC() instead") LZ4LIB_API int LZ4_compressHC_limitedOutput (const char* source, char* dest, int inputSize, int maxOutputSize);
|
||||||
|
LZ4_DEPRECATED("use LZ4_compress_HC() instead") LZ4LIB_API int LZ4_compressHC2 (const char* source, char* dest, int inputSize, int compressionLevel);
|
||||||
|
LZ4_DEPRECATED("use LZ4_compress_HC() instead") LZ4LIB_API int LZ4_compressHC2_limitedOutput(const char* source, char* dest, int inputSize, int maxOutputSize, int compressionLevel);
|
||||||
|
LZ4_DEPRECATED("use LZ4_compress_HC_extStateHC() instead") LZ4LIB_API int LZ4_compressHC_withStateHC (void* state, const char* source, char* dest, int inputSize);
|
||||||
|
LZ4_DEPRECATED("use LZ4_compress_HC_extStateHC() instead") LZ4LIB_API int LZ4_compressHC_limitedOutput_withStateHC (void* state, const char* source, char* dest, int inputSize, int maxOutputSize);
|
||||||
|
LZ4_DEPRECATED("use LZ4_compress_HC_extStateHC() instead") LZ4LIB_API int LZ4_compressHC2_withStateHC (void* state, const char* source, char* dest, int inputSize, int compressionLevel);
|
||||||
|
LZ4_DEPRECATED("use LZ4_compress_HC_extStateHC() instead") LZ4LIB_API int LZ4_compressHC2_limitedOutput_withStateHC(void* state, const char* source, char* dest, int inputSize, int maxOutputSize, int compressionLevel);
|
||||||
|
LZ4_DEPRECATED("use LZ4_compress_HC_continue() instead") LZ4LIB_API int LZ4_compressHC_continue (LZ4_streamHC_t* LZ4_streamHCPtr, const char* source, char* dest, int inputSize);
|
||||||
|
LZ4_DEPRECATED("use LZ4_compress_HC_continue() instead") LZ4LIB_API int LZ4_compressHC_limitedOutput_continue (LZ4_streamHC_t* LZ4_streamHCPtr, const char* source, char* dest, int inputSize, int maxOutputSize);
|
||||||
|
|
||||||
|
/* Obsolete streaming functions; degraded functionality; do not use!
|
||||||
|
*
|
||||||
|
* In order to perform streaming compression, these functions depended on data
|
||||||
|
* that is no longer tracked in the state. They have been preserved as well as
|
||||||
|
* possible: using them will still produce a correct output. However, use of
|
||||||
|
* LZ4_slideInputBufferHC() will truncate the history of the stream, rather
|
||||||
|
* than preserve a window-sized chunk of history.
|
||||||
|
*/
|
||||||
|
#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION)
|
||||||
|
LZ4_DEPRECATED("use LZ4_createStreamHC() instead") LZ4LIB_API void* LZ4_createHC (const char* inputBuffer);
|
||||||
|
LZ4_DEPRECATED("use LZ4_freeStreamHC() instead") LZ4LIB_API int LZ4_freeHC (void* LZ4HC_Data);
|
||||||
|
#endif
|
||||||
|
LZ4_DEPRECATED("use LZ4_saveDictHC() instead") LZ4LIB_API char* LZ4_slideInputBufferHC (void* LZ4HC_Data);
|
||||||
|
LZ4_DEPRECATED("use LZ4_compress_HC_continue() instead") LZ4LIB_API int LZ4_compressHC2_continue (void* LZ4HC_Data, const char* source, char* dest, int inputSize, int compressionLevel);
|
||||||
|
LZ4_DEPRECATED("use LZ4_compress_HC_continue() instead") LZ4LIB_API int LZ4_compressHC2_limitedOutput_continue (void* LZ4HC_Data, const char* source, char* dest, int inputSize, int maxOutputSize, int compressionLevel);
|
||||||
|
LZ4_DEPRECATED("use LZ4_createStreamHC() instead") LZ4LIB_API int LZ4_sizeofStreamStateHC(void);
|
||||||
|
LZ4_DEPRECATED("use LZ4_initStreamHC() instead") LZ4LIB_API int LZ4_resetStreamStateHC(void* state, char* inputBuffer);
|
||||||
|
|
||||||
|
|
||||||
|
/* LZ4_resetStreamHC() is now replaced by LZ4_initStreamHC().
|
||||||
|
* The intention is to emphasize the difference with LZ4_resetStreamHC_fast(),
|
||||||
|
* which is now the recommended function to start a new stream of blocks,
|
||||||
|
* but cannot be used to initialize a memory segment containing arbitrary garbage data.
|
||||||
|
*
|
||||||
|
* It is recommended to switch to LZ4_initStreamHC().
|
||||||
|
* LZ4_resetStreamHC() will generate deprecation warnings in a future version.
|
||||||
|
*/
|
||||||
|
LZ4LIB_API void LZ4_resetStreamHC (LZ4_streamHC_t* streamHCPtr, int compressionLevel);
|
||||||
|
|
||||||
|
|
||||||
|
#if defined (__cplusplus)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* LZ4_HC_H_19834876238432 */
|
||||||
|
|
||||||
|
|
||||||
|
/*-**************************************************
|
||||||
|
* !!!!! STATIC LINKING ONLY !!!!!
|
||||||
|
* Following definitions are considered experimental.
|
||||||
|
* They should not be linked from DLL,
|
||||||
|
* as there is no guarantee of API stability yet.
|
||||||
|
* Prototypes will be promoted to "stable" status
|
||||||
|
* after successful usage in real-life scenarios.
|
||||||
|
***************************************************/
|
||||||
|
#ifdef LZ4_HC_STATIC_LINKING_ONLY /* protection macro */
|
||||||
|
#ifndef LZ4_HC_SLO_098092834
|
||||||
|
#define LZ4_HC_SLO_098092834
|
||||||
|
|
||||||
|
#define LZ4_STATIC_LINKING_ONLY /* LZ4LIB_STATIC_API */
|
||||||
|
#include "lz4.h"
|
||||||
|
|
||||||
|
#if defined (__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*! LZ4_setCompressionLevel() : v1.8.0+ (experimental)
|
||||||
|
* It's possible to change compression level
|
||||||
|
* between successive invocations of LZ4_compress_HC_continue*()
|
||||||
|
* for dynamic adaptation.
|
||||||
|
*/
|
||||||
|
LZ4LIB_STATIC_API void LZ4_setCompressionLevel(
|
||||||
|
LZ4_streamHC_t* LZ4_streamHCPtr, int compressionLevel);
|
||||||
|
|
||||||
|
/*! LZ4_favorDecompressionSpeed() : v1.8.2+ (experimental)
|
||||||
|
* Opt. Parser will favor decompression speed over compression ratio.
|
||||||
|
* Only applicable to levels >= LZ4HC_CLEVEL_OPT_MIN.
|
||||||
|
*/
|
||||||
|
LZ4LIB_STATIC_API void LZ4_favorDecompressionSpeed(
|
||||||
|
LZ4_streamHC_t* LZ4_streamHCPtr, int favor);
|
||||||
|
|
||||||
|
/*! LZ4_resetStreamHC_fast() : v1.9.0+
|
||||||
|
* When an LZ4_streamHC_t is known to be in a internally coherent state,
|
||||||
|
* it can often be prepared for a new compression with almost no work, only
|
||||||
|
* sometimes falling back to the full, expensive reset that is always required
|
||||||
|
* when the stream is in an indeterminate state (i.e., the reset performed by
|
||||||
|
* LZ4_resetStreamHC()).
|
||||||
|
*
|
||||||
|
* LZ4_streamHCs are guaranteed to be in a valid state when:
|
||||||
|
* - returned from LZ4_createStreamHC()
|
||||||
|
* - reset by LZ4_resetStreamHC()
|
||||||
|
* - memset(stream, 0, sizeof(LZ4_streamHC_t))
|
||||||
|
* - the stream was in a valid state and was reset by LZ4_resetStreamHC_fast()
|
||||||
|
* - the stream was in a valid state and was then used in any compression call
|
||||||
|
* that returned success
|
||||||
|
* - the stream was in an indeterminate state and was used in a compression
|
||||||
|
* call that fully reset the state (LZ4_compress_HC_extStateHC()) and that
|
||||||
|
* returned success
|
||||||
|
*
|
||||||
|
* Note:
|
||||||
|
* A stream that was last used in a compression call that returned an error
|
||||||
|
* may be passed to this function. However, it will be fully reset, which will
|
||||||
|
* clear any existing history and settings from the context.
|
||||||
|
*/
|
||||||
|
LZ4LIB_STATIC_API void LZ4_resetStreamHC_fast(
|
||||||
|
LZ4_streamHC_t* LZ4_streamHCPtr, int compressionLevel);
|
||||||
|
|
||||||
|
/*! LZ4_compress_HC_extStateHC_fastReset() :
|
||||||
|
* A variant of LZ4_compress_HC_extStateHC().
|
||||||
|
*
|
||||||
|
* Using this variant avoids an expensive initialization step. It is only safe
|
||||||
|
* to call if the state buffer is known to be correctly initialized already
|
||||||
|
* (see above comment on LZ4_resetStreamHC_fast() for a definition of
|
||||||
|
* "correctly initialized"). From a high level, the difference is that this
|
||||||
|
* function initializes the provided state with a call to
|
||||||
|
* LZ4_resetStreamHC_fast() while LZ4_compress_HC_extStateHC() starts with a
|
||||||
|
* call to LZ4_resetStreamHC().
|
||||||
|
*/
|
||||||
|
LZ4LIB_STATIC_API int LZ4_compress_HC_extStateHC_fastReset (
|
||||||
|
void* state,
|
||||||
|
const char* src, char* dst,
|
||||||
|
int srcSize, int dstCapacity,
|
||||||
|
int compressionLevel);
|
||||||
|
|
||||||
|
/*! LZ4_attach_HC_dictionary() :
|
||||||
|
* This is an experimental API that allows for the efficient use of a
|
||||||
|
* static dictionary many times.
|
||||||
|
*
|
||||||
|
* Rather than re-loading the dictionary buffer into a working context before
|
||||||
|
* each compression, or copying a pre-loaded dictionary's LZ4_streamHC_t into a
|
||||||
|
* working LZ4_streamHC_t, this function introduces a no-copy setup mechanism,
|
||||||
|
* in which the working stream references the dictionary stream in-place.
|
||||||
|
*
|
||||||
|
* Several assumptions are made about the state of the dictionary stream.
|
||||||
|
* Currently, only streams which have been prepared by LZ4_loadDictHC() should
|
||||||
|
* be expected to work.
|
||||||
|
*
|
||||||
|
* Alternatively, the provided dictionary stream pointer may be NULL, in which
|
||||||
|
* case any existing dictionary stream is unset.
|
||||||
|
*
|
||||||
|
* A dictionary should only be attached to a stream without any history (i.e.,
|
||||||
|
* a stream that has just been reset).
|
||||||
|
*
|
||||||
|
* The dictionary will remain attached to the working stream only for the
|
||||||
|
* current stream session. Calls to LZ4_resetStreamHC(_fast) will remove the
|
||||||
|
* dictionary context association from the working stream. The dictionary
|
||||||
|
* stream (and source buffer) must remain in-place / accessible / unchanged
|
||||||
|
* through the lifetime of the stream session.
|
||||||
|
*/
|
||||||
|
LZ4LIB_STATIC_API void LZ4_attach_HC_dictionary(
|
||||||
|
LZ4_streamHC_t *working_stream,
|
||||||
|
const LZ4_streamHC_t *dictionary_stream);
|
||||||
|
|
||||||
|
#if defined (__cplusplus)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* LZ4_HC_SLO_098092834 */
|
||||||
|
#endif /* LZ4_HC_STATIC_LINKING_ONLY */
|
1030
csbindgen-tests/c/lz4/xxhash.c
Normal file
1030
csbindgen-tests/c/lz4/xxhash.c
Normal file
File diff suppressed because it is too large
Load Diff
328
csbindgen-tests/c/lz4/xxhash.h
Normal file
328
csbindgen-tests/c/lz4/xxhash.h
Normal file
@ -0,0 +1,328 @@
|
|||||||
|
/*
|
||||||
|
xxHash - Extremely Fast Hash algorithm
|
||||||
|
Header File
|
||||||
|
Copyright (C) 2012-2016, Yann Collet.
|
||||||
|
|
||||||
|
BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are
|
||||||
|
met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above
|
||||||
|
copyright notice, this list of conditions and the following disclaimer
|
||||||
|
in the documentation and/or other materials provided with the
|
||||||
|
distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
You can contact the author at :
|
||||||
|
- xxHash source repository : https://github.com/Cyan4973/xxHash
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Notice extracted from xxHash homepage :
|
||||||
|
|
||||||
|
xxHash is an extremely fast Hash algorithm, running at RAM speed limits.
|
||||||
|
It also successfully passes all tests from the SMHasher suite.
|
||||||
|
|
||||||
|
Comparison (single thread, Windows Seven 32 bits, using SMHasher on a Core 2 Duo @3GHz)
|
||||||
|
|
||||||
|
Name Speed Q.Score Author
|
||||||
|
xxHash 5.4 GB/s 10
|
||||||
|
CrapWow 3.2 GB/s 2 Andrew
|
||||||
|
MumurHash 3a 2.7 GB/s 10 Austin Appleby
|
||||||
|
SpookyHash 2.0 GB/s 10 Bob Jenkins
|
||||||
|
SBox 1.4 GB/s 9 Bret Mulvey
|
||||||
|
Lookup3 1.2 GB/s 9 Bob Jenkins
|
||||||
|
SuperFastHash 1.2 GB/s 1 Paul Hsieh
|
||||||
|
CityHash64 1.05 GB/s 10 Pike & Alakuijala
|
||||||
|
FNV 0.55 GB/s 5 Fowler, Noll, Vo
|
||||||
|
CRC32 0.43 GB/s 9
|
||||||
|
MD5-32 0.33 GB/s 10 Ronald L. Rivest
|
||||||
|
SHA1-32 0.28 GB/s 10
|
||||||
|
|
||||||
|
Q.Score is a measure of quality of the hash function.
|
||||||
|
It depends on successfully passing SMHasher test set.
|
||||||
|
10 is a perfect score.
|
||||||
|
|
||||||
|
A 64-bit version, named XXH64, is available since r35.
|
||||||
|
It offers much better speed, but for 64-bit applications only.
|
||||||
|
Name Speed on 64 bits Speed on 32 bits
|
||||||
|
XXH64 13.8 GB/s 1.9 GB/s
|
||||||
|
XXH32 6.8 GB/s 6.0 GB/s
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef XXHASH_H_5627135585666179
|
||||||
|
#define XXHASH_H_5627135585666179 1
|
||||||
|
|
||||||
|
#if defined (__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* ****************************
|
||||||
|
* Definitions
|
||||||
|
******************************/
|
||||||
|
#include <stddef.h> /* size_t */
|
||||||
|
typedef enum { XXH_OK=0, XXH_ERROR } XXH_errorcode;
|
||||||
|
|
||||||
|
|
||||||
|
/* ****************************
|
||||||
|
* API modifier
|
||||||
|
******************************/
|
||||||
|
/** XXH_INLINE_ALL (and XXH_PRIVATE_API)
|
||||||
|
* This is useful to include xxhash functions in `static` mode
|
||||||
|
* in order to inline them, and remove their symbol from the public list.
|
||||||
|
* Inlining can offer dramatic performance improvement on small keys.
|
||||||
|
* Methodology :
|
||||||
|
* #define XXH_INLINE_ALL
|
||||||
|
* #include "xxhash.h"
|
||||||
|
* `xxhash.c` is automatically included.
|
||||||
|
* It's not useful to compile and link it as a separate module.
|
||||||
|
*/
|
||||||
|
#if defined(XXH_INLINE_ALL) || defined(XXH_PRIVATE_API)
|
||||||
|
# ifndef XXH_STATIC_LINKING_ONLY
|
||||||
|
# define XXH_STATIC_LINKING_ONLY
|
||||||
|
# endif
|
||||||
|
# if defined(__GNUC__)
|
||||||
|
# define XXH_PUBLIC_API static __inline __attribute__((unused))
|
||||||
|
# elif defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */)
|
||||||
|
# define XXH_PUBLIC_API static inline
|
||||||
|
# elif defined(_MSC_VER)
|
||||||
|
# define XXH_PUBLIC_API static __inline
|
||||||
|
# else
|
||||||
|
/* this version may generate warnings for unused static functions */
|
||||||
|
# define XXH_PUBLIC_API static
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# define XXH_PUBLIC_API /* do nothing */
|
||||||
|
#endif /* XXH_INLINE_ALL || XXH_PRIVATE_API */
|
||||||
|
|
||||||
|
/*! XXH_NAMESPACE, aka Namespace Emulation :
|
||||||
|
*
|
||||||
|
* If you want to include _and expose_ xxHash functions from within your own library,
|
||||||
|
* but also want to avoid symbol collisions with other libraries which may also include xxHash,
|
||||||
|
*
|
||||||
|
* you can use XXH_NAMESPACE, to automatically prefix any public symbol from xxhash library
|
||||||
|
* with the value of XXH_NAMESPACE (therefore, avoid NULL and numeric values).
|
||||||
|
*
|
||||||
|
* Note that no change is required within the calling program as long as it includes `xxhash.h` :
|
||||||
|
* regular symbol name will be automatically translated by this header.
|
||||||
|
*/
|
||||||
|
#ifdef XXH_NAMESPACE
|
||||||
|
# define XXH_CAT(A,B) A##B
|
||||||
|
# define XXH_NAME2(A,B) XXH_CAT(A,B)
|
||||||
|
# define XXH_versionNumber XXH_NAME2(XXH_NAMESPACE, XXH_versionNumber)
|
||||||
|
# define XXH32 XXH_NAME2(XXH_NAMESPACE, XXH32)
|
||||||
|
# define XXH32_createState XXH_NAME2(XXH_NAMESPACE, XXH32_createState)
|
||||||
|
# define XXH32_freeState XXH_NAME2(XXH_NAMESPACE, XXH32_freeState)
|
||||||
|
# define XXH32_reset XXH_NAME2(XXH_NAMESPACE, XXH32_reset)
|
||||||
|
# define XXH32_update XXH_NAME2(XXH_NAMESPACE, XXH32_update)
|
||||||
|
# define XXH32_digest XXH_NAME2(XXH_NAMESPACE, XXH32_digest)
|
||||||
|
# define XXH32_copyState XXH_NAME2(XXH_NAMESPACE, XXH32_copyState)
|
||||||
|
# define XXH32_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH32_canonicalFromHash)
|
||||||
|
# define XXH32_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH32_hashFromCanonical)
|
||||||
|
# define XXH64 XXH_NAME2(XXH_NAMESPACE, XXH64)
|
||||||
|
# define XXH64_createState XXH_NAME2(XXH_NAMESPACE, XXH64_createState)
|
||||||
|
# define XXH64_freeState XXH_NAME2(XXH_NAMESPACE, XXH64_freeState)
|
||||||
|
# define XXH64_reset XXH_NAME2(XXH_NAMESPACE, XXH64_reset)
|
||||||
|
# define XXH64_update XXH_NAME2(XXH_NAMESPACE, XXH64_update)
|
||||||
|
# define XXH64_digest XXH_NAME2(XXH_NAMESPACE, XXH64_digest)
|
||||||
|
# define XXH64_copyState XXH_NAME2(XXH_NAMESPACE, XXH64_copyState)
|
||||||
|
# define XXH64_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH64_canonicalFromHash)
|
||||||
|
# define XXH64_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH64_hashFromCanonical)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* *************************************
|
||||||
|
* Version
|
||||||
|
***************************************/
|
||||||
|
#define XXH_VERSION_MAJOR 0
|
||||||
|
#define XXH_VERSION_MINOR 6
|
||||||
|
#define XXH_VERSION_RELEASE 5
|
||||||
|
#define XXH_VERSION_NUMBER (XXH_VERSION_MAJOR *100*100 + XXH_VERSION_MINOR *100 + XXH_VERSION_RELEASE)
|
||||||
|
XXH_PUBLIC_API unsigned XXH_versionNumber (void);
|
||||||
|
|
||||||
|
|
||||||
|
/*-**********************************************************************
|
||||||
|
* 32-bit hash
|
||||||
|
************************************************************************/
|
||||||
|
typedef unsigned int XXH32_hash_t;
|
||||||
|
|
||||||
|
/*! XXH32() :
|
||||||
|
Calculate the 32-bit hash of sequence "length" bytes stored at memory address "input".
|
||||||
|
The memory between input & input+length must be valid (allocated and read-accessible).
|
||||||
|
"seed" can be used to alter the result predictably.
|
||||||
|
Speed on Core 2 Duo @ 3 GHz (single thread, SMHasher benchmark) : 5.4 GB/s */
|
||||||
|
XXH_PUBLIC_API XXH32_hash_t XXH32 (const void* input, size_t length, unsigned int seed);
|
||||||
|
|
||||||
|
/*====== Streaming ======*/
|
||||||
|
typedef struct XXH32_state_s XXH32_state_t; /* incomplete type */
|
||||||
|
XXH_PUBLIC_API XXH32_state_t* XXH32_createState(void);
|
||||||
|
XXH_PUBLIC_API XXH_errorcode XXH32_freeState(XXH32_state_t* statePtr);
|
||||||
|
XXH_PUBLIC_API void XXH32_copyState(XXH32_state_t* dst_state, const XXH32_state_t* src_state);
|
||||||
|
|
||||||
|
XXH_PUBLIC_API XXH_errorcode XXH32_reset (XXH32_state_t* statePtr, unsigned int seed);
|
||||||
|
XXH_PUBLIC_API XXH_errorcode XXH32_update (XXH32_state_t* statePtr, const void* input, size_t length);
|
||||||
|
XXH_PUBLIC_API XXH32_hash_t XXH32_digest (const XXH32_state_t* statePtr);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Streaming functions generate the xxHash of an input provided in multiple segments.
|
||||||
|
* Note that, for small input, they are slower than single-call functions, due to state management.
|
||||||
|
* For small inputs, prefer `XXH32()` and `XXH64()`, which are better optimized.
|
||||||
|
*
|
||||||
|
* XXH state must first be allocated, using XXH*_createState() .
|
||||||
|
*
|
||||||
|
* Start a new hash by initializing state with a seed, using XXH*_reset().
|
||||||
|
*
|
||||||
|
* Then, feed the hash state by calling XXH*_update() as many times as necessary.
|
||||||
|
* The function returns an error code, with 0 meaning OK, and any other value meaning there is an error.
|
||||||
|
*
|
||||||
|
* Finally, a hash value can be produced anytime, by using XXH*_digest().
|
||||||
|
* This function returns the nn-bits hash as an int or long long.
|
||||||
|
*
|
||||||
|
* It's still possible to continue inserting input into the hash state after a digest,
|
||||||
|
* and generate some new hashes later on, by calling again XXH*_digest().
|
||||||
|
*
|
||||||
|
* When done, free XXH state space if it was allocated dynamically.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*====== Canonical representation ======*/
|
||||||
|
|
||||||
|
typedef struct { unsigned char digest[4]; } XXH32_canonical_t;
|
||||||
|
XXH_PUBLIC_API void XXH32_canonicalFromHash(XXH32_canonical_t* dst, XXH32_hash_t hash);
|
||||||
|
XXH_PUBLIC_API XXH32_hash_t XXH32_hashFromCanonical(const XXH32_canonical_t* src);
|
||||||
|
|
||||||
|
/* Default result type for XXH functions are primitive unsigned 32 and 64 bits.
|
||||||
|
* The canonical representation uses human-readable write convention, aka big-endian (large digits first).
|
||||||
|
* These functions allow transformation of hash result into and from its canonical format.
|
||||||
|
* This way, hash values can be written into a file / memory, and remain comparable on different systems and programs.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef XXH_NO_LONG_LONG
|
||||||
|
/*-**********************************************************************
|
||||||
|
* 64-bit hash
|
||||||
|
************************************************************************/
|
||||||
|
typedef unsigned long long XXH64_hash_t;
|
||||||
|
|
||||||
|
/*! XXH64() :
|
||||||
|
Calculate the 64-bit hash of sequence of length "len" stored at memory address "input".
|
||||||
|
"seed" can be used to alter the result predictably.
|
||||||
|
This function runs faster on 64-bit systems, but slower on 32-bit systems (see benchmark).
|
||||||
|
*/
|
||||||
|
XXH_PUBLIC_API XXH64_hash_t XXH64 (const void* input, size_t length, unsigned long long seed);
|
||||||
|
|
||||||
|
/*====== Streaming ======*/
|
||||||
|
typedef struct XXH64_state_s XXH64_state_t; /* incomplete type */
|
||||||
|
XXH_PUBLIC_API XXH64_state_t* XXH64_createState(void);
|
||||||
|
XXH_PUBLIC_API XXH_errorcode XXH64_freeState(XXH64_state_t* statePtr);
|
||||||
|
XXH_PUBLIC_API void XXH64_copyState(XXH64_state_t* dst_state, const XXH64_state_t* src_state);
|
||||||
|
|
||||||
|
XXH_PUBLIC_API XXH_errorcode XXH64_reset (XXH64_state_t* statePtr, unsigned long long seed);
|
||||||
|
XXH_PUBLIC_API XXH_errorcode XXH64_update (XXH64_state_t* statePtr, const void* input, size_t length);
|
||||||
|
XXH_PUBLIC_API XXH64_hash_t XXH64_digest (const XXH64_state_t* statePtr);
|
||||||
|
|
||||||
|
/*====== Canonical representation ======*/
|
||||||
|
typedef struct { unsigned char digest[8]; } XXH64_canonical_t;
|
||||||
|
XXH_PUBLIC_API void XXH64_canonicalFromHash(XXH64_canonical_t* dst, XXH64_hash_t hash);
|
||||||
|
XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src);
|
||||||
|
#endif /* XXH_NO_LONG_LONG */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef XXH_STATIC_LINKING_ONLY
|
||||||
|
|
||||||
|
/* ================================================================================================
|
||||||
|
This section contains declarations which are not guaranteed to remain stable.
|
||||||
|
They may change in future versions, becoming incompatible with a different version of the library.
|
||||||
|
These declarations should only be used with static linking.
|
||||||
|
Never use them in association with dynamic linking !
|
||||||
|
=================================================================================================== */
|
||||||
|
|
||||||
|
/* These definitions are only present to allow
|
||||||
|
* static allocation of XXH state, on stack or in a struct for example.
|
||||||
|
* Never **ever** use members directly. */
|
||||||
|
|
||||||
|
#if !defined (__VMS) \
|
||||||
|
&& (defined (__cplusplus) \
|
||||||
|
|| (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) )
|
||||||
|
# include <stdint.h>
|
||||||
|
|
||||||
|
struct XXH32_state_s {
|
||||||
|
uint32_t total_len_32;
|
||||||
|
uint32_t large_len;
|
||||||
|
uint32_t v1;
|
||||||
|
uint32_t v2;
|
||||||
|
uint32_t v3;
|
||||||
|
uint32_t v4;
|
||||||
|
uint32_t mem32[4];
|
||||||
|
uint32_t memsize;
|
||||||
|
uint32_t reserved; /* never read nor write, might be removed in a future version */
|
||||||
|
}; /* typedef'd to XXH32_state_t */
|
||||||
|
|
||||||
|
struct XXH64_state_s {
|
||||||
|
uint64_t total_len;
|
||||||
|
uint64_t v1;
|
||||||
|
uint64_t v2;
|
||||||
|
uint64_t v3;
|
||||||
|
uint64_t v4;
|
||||||
|
uint64_t mem64[4];
|
||||||
|
uint32_t memsize;
|
||||||
|
uint32_t reserved[2]; /* never read nor write, might be removed in a future version */
|
||||||
|
}; /* typedef'd to XXH64_state_t */
|
||||||
|
|
||||||
|
# else
|
||||||
|
|
||||||
|
struct XXH32_state_s {
|
||||||
|
unsigned total_len_32;
|
||||||
|
unsigned large_len;
|
||||||
|
unsigned v1;
|
||||||
|
unsigned v2;
|
||||||
|
unsigned v3;
|
||||||
|
unsigned v4;
|
||||||
|
unsigned mem32[4];
|
||||||
|
unsigned memsize;
|
||||||
|
unsigned reserved; /* never read nor write, might be removed in a future version */
|
||||||
|
}; /* typedef'd to XXH32_state_t */
|
||||||
|
|
||||||
|
# ifndef XXH_NO_LONG_LONG /* remove 64-bit support */
|
||||||
|
struct XXH64_state_s {
|
||||||
|
unsigned long long total_len;
|
||||||
|
unsigned long long v1;
|
||||||
|
unsigned long long v2;
|
||||||
|
unsigned long long v3;
|
||||||
|
unsigned long long v4;
|
||||||
|
unsigned long long mem64[4];
|
||||||
|
unsigned memsize;
|
||||||
|
unsigned reserved[2]; /* never read nor write, might be removed in a future version */
|
||||||
|
}; /* typedef'd to XXH64_state_t */
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# endif
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(XXH_INLINE_ALL) || defined(XXH_PRIVATE_API)
|
||||||
|
# include "xxhash.c" /* include xxhash function bodies as `static`, for inlining */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* XXH_STATIC_LINKING_ONLY */
|
||||||
|
|
||||||
|
|
||||||
|
#if defined (__cplusplus)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* XXHASH_H_5627135585666179 */
|
1744
csbindgen-tests/src/ffi.rs
Normal file
1744
csbindgen-tests/src/ffi.rs
Normal file
File diff suppressed because it is too large
Load Diff
21
csbindgen-tests/src/lib.rs
Normal file
21
csbindgen-tests/src/lib.rs
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
#[allow(dead_code)]
|
||||||
|
#[allow(non_snake_case)]
|
||||||
|
#[allow(non_camel_case_types)]
|
||||||
|
#[allow(non_upper_case_globals)]
|
||||||
|
mod lz4;
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
|
#[allow(non_snake_case)]
|
||||||
|
#[allow(non_camel_case_types)]
|
||||||
|
mod ffi;
|
||||||
|
|
||||||
|
pub fn add(left: usize, right: usize) -> usize {
|
||||||
|
left + right
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn it_works() {
|
||||||
|
//let n = ffi::Cysharp_LZ4_versionNumber();
|
||||||
|
//println!("{}", n);
|
||||||
|
}
|
1619
csbindgen-tests/src/lz4/mod.rs
Normal file
1619
csbindgen-tests/src/lz4/mod.rs
Normal file
File diff suppressed because it is too large
Load Diff
13
csbindgen-tests/src/main.rs
Normal file
13
csbindgen-tests/src/main.rs
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
use std::env;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
|
||||||
|
let path = env::current_dir().unwrap();
|
||||||
|
println!("starting dir: {}", path.display());
|
||||||
|
|
||||||
|
csbindgen::run(
|
||||||
|
"csbindgen-tests/src/lz4/mod.rs",
|
||||||
|
"csbindgen-tests/src/ffi.rs",
|
||||||
|
"dotnet-sandbox/bindgen.cs",
|
||||||
|
);
|
||||||
|
}
|
7
csbindgen/Cargo.toml
Normal file
7
csbindgen/Cargo.toml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
[package]
|
||||||
|
name = "csbindgen"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
syn = { version = "1.0.109", features = ["full"] }
|
589
csbindgen/src/lib.rs
Normal file
589
csbindgen/src/lib.rs
Normal file
@ -0,0 +1,589 @@
|
|||||||
|
use std::{
|
||||||
|
collections::{HashMap, HashSet},
|
||||||
|
fmt::Display,
|
||||||
|
fs::{self, File},
|
||||||
|
io::Write,
|
||||||
|
};
|
||||||
|
|
||||||
|
use syn::{ForeignItem, Item, Pat, ReturnType};
|
||||||
|
|
||||||
|
// mod lz4;
|
||||||
|
|
||||||
|
pub fn run(rs_path: &str, output_path: &str, csharp_output_path: &str) {
|
||||||
|
let file_content = fs::read_to_string(rs_path).unwrap();
|
||||||
|
let file_ast = syn::parse_file(file_content.as_str()).unwrap();
|
||||||
|
|
||||||
|
let methods = collect_method(&file_ast);
|
||||||
|
let aliases = collect_type_alias(&file_ast);
|
||||||
|
let structs = collect_struct(&file_ast);
|
||||||
|
|
||||||
|
let mut using_types = HashSet::new();
|
||||||
|
for method in &methods {
|
||||||
|
if let Some(x) = &method.return_type {
|
||||||
|
using_types.insert(x.type_name.clone());
|
||||||
|
}
|
||||||
|
for p in &method.parameters {
|
||||||
|
using_types.insert(p.rust_type.type_name.clone());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for item in &structs {
|
||||||
|
for item in &item.fields {
|
||||||
|
using_types.insert(item.rust_type.type_name.clone());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let aliases = reduce_type_alias(&aliases, &using_types);
|
||||||
|
for alias in &aliases {
|
||||||
|
using_types.insert(alias.1.type_name.clone());
|
||||||
|
}
|
||||||
|
|
||||||
|
let structs = reduce_struct(&structs, &using_types);
|
||||||
|
|
||||||
|
let vecs = emit_rust_method(&methods);
|
||||||
|
|
||||||
|
// TODO: filter methods
|
||||||
|
//if !(t.method_name.starts_with("_") || t.method_name == "") {
|
||||||
|
|
||||||
|
let mut file = File::create(output_path).unwrap();
|
||||||
|
{
|
||||||
|
// TODO:modify here
|
||||||
|
// TODO:modify here
|
||||||
|
file.write_all("#[allow(unused)]\n".as_bytes()).unwrap();
|
||||||
|
file.write_all("use ::std::os::raw::*;\n".as_bytes())
|
||||||
|
.unwrap();
|
||||||
|
file.write_all("use super::lz4;\n\n".as_bytes()).unwrap();
|
||||||
|
for str in vecs {
|
||||||
|
file.write_all(str.as_bytes()).unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
file.flush().unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
let csharp = emit_csharp(&methods, &aliases, &structs);
|
||||||
|
let mut file = File::create(csharp_output_path).unwrap();
|
||||||
|
file.write_all(csharp.as_bytes()).unwrap();
|
||||||
|
file.flush().unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn collect_method(ast: &syn::File) -> Vec<ExternMethod> {
|
||||||
|
let mut list: Vec<ExternMethod> = Vec::new();
|
||||||
|
|
||||||
|
for item in ast.items.iter() {
|
||||||
|
if let Item::ForeignMod(m) = item {
|
||||||
|
for item in m.items.iter() {
|
||||||
|
if let ForeignItem::Fn(m) = item {
|
||||||
|
let method_name = m.sig.ident.to_string();
|
||||||
|
|
||||||
|
let mut parameters: Vec<Parameter> = Vec::new();
|
||||||
|
let mut retrun_type: Option<RustType> = None;
|
||||||
|
|
||||||
|
// argument
|
||||||
|
for arg in m.sig.inputs.iter() {
|
||||||
|
if let syn::FnArg::Typed(t) = arg {
|
||||||
|
let mut parameter_name: String = "".to_string();
|
||||||
|
|
||||||
|
if let Pat::Ident(ident) = &*t.pat {
|
||||||
|
parameter_name = ident.ident.to_string();
|
||||||
|
}
|
||||||
|
|
||||||
|
let rust_type = parse_type(&t.ty);
|
||||||
|
|
||||||
|
parameters.push(Parameter {
|
||||||
|
name: parameter_name,
|
||||||
|
rust_type: rust_type,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// return
|
||||||
|
if let ReturnType::Type(_, b) = &m.sig.output {
|
||||||
|
let rust_type = parse_type(&b);
|
||||||
|
if rust_type.type_name == "" {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
retrun_type = Some(rust_type);
|
||||||
|
}
|
||||||
|
|
||||||
|
let t = ExternMethod {
|
||||||
|
method_name: method_name.clone(),
|
||||||
|
parameters: parameters,
|
||||||
|
return_type: retrun_type,
|
||||||
|
};
|
||||||
|
|
||||||
|
list.push(t.clone());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn collect_type_alias(ast: &syn::File) -> Vec<(String, RustType)> {
|
||||||
|
let mut result = Vec::new();
|
||||||
|
for item in ast.items.iter() {
|
||||||
|
if let Item::Type(t) = item {
|
||||||
|
let name = t.ident.to_string();
|
||||||
|
let alias = parse_type(&t.ty);
|
||||||
|
|
||||||
|
// pointer can not use alias.
|
||||||
|
if !alias.is_pointer || !alias.is_pointer_pointer {
|
||||||
|
result.push((name, alias));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn collect_struct(ast: &syn::File) -> Vec<RustStruct> {
|
||||||
|
// collect union or struct
|
||||||
|
|
||||||
|
let mut result = Vec::new();
|
||||||
|
|
||||||
|
for item in ast.items.iter() {
|
||||||
|
if let Item::Union(t) = item {
|
||||||
|
let name = t.ident.to_string();
|
||||||
|
let fields = collect_fields(&t.fields);
|
||||||
|
|
||||||
|
result.push(RustStruct {
|
||||||
|
struct_name: name,
|
||||||
|
fields: fields,
|
||||||
|
is_union: true,
|
||||||
|
});
|
||||||
|
} else if let Item::Struct(t) = item {
|
||||||
|
if let syn::Fields::Named(f) = &t.fields {
|
||||||
|
let name = t.ident.to_string();
|
||||||
|
let fields = collect_fields(&f);
|
||||||
|
result.push(RustStruct {
|
||||||
|
struct_name: name,
|
||||||
|
fields: fields,
|
||||||
|
is_union: false,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn collect_fields(fields: &syn::FieldsNamed) -> Vec<FieldMember> {
|
||||||
|
let mut result = Vec::new();
|
||||||
|
|
||||||
|
for field in &fields.named {
|
||||||
|
if let Some(x) = &field.ident {
|
||||||
|
let t = parse_type(&field.ty);
|
||||||
|
result.push(FieldMember {
|
||||||
|
name: x.to_string(),
|
||||||
|
rust_type: t,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn reduce_type_alias(
|
||||||
|
aliases: &Vec<(String, RustType)>,
|
||||||
|
using_types: &HashSet<String>,
|
||||||
|
) -> HashMap<String, RustType> {
|
||||||
|
let mut map = HashMap::new();
|
||||||
|
for (name, rust_type) in aliases {
|
||||||
|
if using_types.contains(name) {
|
||||||
|
map.insert(name.clone(), rust_type.clone());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (name, rust_type) in aliases {
|
||||||
|
let pointed = map.get(rust_type.type_name.as_str());
|
||||||
|
if let Some(x) = pointed {
|
||||||
|
map.insert(name.to_string(), x.clone());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn reduce_struct(structs: &Vec<RustStruct>, using_types: &HashSet<String>) -> Vec<RustStruct> {
|
||||||
|
let mut result = Vec::new();
|
||||||
|
for item in structs {
|
||||||
|
if using_types.contains(&item.struct_name) {
|
||||||
|
result.push(item.clone());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_type(t: &syn::Type) -> RustType {
|
||||||
|
let mut has_star = false;
|
||||||
|
let mut has_star_star = false;
|
||||||
|
let mut has_const = false;
|
||||||
|
let mut has_mut = false;
|
||||||
|
let mut digits: String = "".to_string();
|
||||||
|
|
||||||
|
let name = match t {
|
||||||
|
syn::Type::Ptr(t) => {
|
||||||
|
has_star = true;
|
||||||
|
has_const = t.const_token.is_some();
|
||||||
|
has_mut = t.mutability.is_some();
|
||||||
|
|
||||||
|
if let syn::Type::Path(path) = &*t.elem {
|
||||||
|
path.path.segments.last().unwrap().ident.to_string()
|
||||||
|
} else if let syn::Type::Ptr(t) = &*t.elem {
|
||||||
|
has_star = false;
|
||||||
|
has_star_star = true;
|
||||||
|
if let syn::Type::Path(path) = &*t.elem {
|
||||||
|
path.path.segments.last().unwrap().ident.to_string()
|
||||||
|
} else {
|
||||||
|
"".to_string()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
"".to_string()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
syn::Type::Path(t) => t.path.segments.last().unwrap().ident.to_string(),
|
||||||
|
syn::Type::Array(t) => {
|
||||||
|
if let syn::Expr::Lit(x) = &t.len {
|
||||||
|
if let syn::Lit::Int(x) = &x.lit {
|
||||||
|
digits = x.base10_digits().to_string();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
parse_type(&t.elem).type_name // maybe ok, only retrieve type_name
|
||||||
|
}
|
||||||
|
_ => "".to_string(),
|
||||||
|
};
|
||||||
|
|
||||||
|
return RustType {
|
||||||
|
is_const: has_const,
|
||||||
|
is_mut: has_mut,
|
||||||
|
is_pointer: has_star,
|
||||||
|
is_pointer_pointer: has_star_star,
|
||||||
|
is_fixed_array: (digits != ""),
|
||||||
|
type_name: name,
|
||||||
|
fixed_array_digits: digits,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO:rewrite
|
||||||
|
fn emit_rust_method(list: &Vec<ExternMethod>) -> Vec<String> {
|
||||||
|
let mod_name = "lz4";
|
||||||
|
|
||||||
|
let mut result = Vec::new();
|
||||||
|
|
||||||
|
for item in list {
|
||||||
|
let method_name = item.method_name.as_str();
|
||||||
|
let parameters = item.parameters.iter().map(|p| {
|
||||||
|
let mut sb = p.name.to_string();
|
||||||
|
sb.push_str(": ");
|
||||||
|
sb.push_str(p.rust_type.to_string(mod_name).as_str());
|
||||||
|
sb
|
||||||
|
});
|
||||||
|
|
||||||
|
let parameter_only_names = item.parameters.iter().map(|p| p.name.as_str());
|
||||||
|
|
||||||
|
let return_line = match &item.return_type {
|
||||||
|
None => "".to_string(),
|
||||||
|
Some(v) => {
|
||||||
|
let mut sb = " -> ".to_string();
|
||||||
|
sb.push_str(v.to_string(mod_name).as_str());
|
||||||
|
sb
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut sb = String::new();
|
||||||
|
sb.push_str("#[no_mangle]\n");
|
||||||
|
sb.push_str(format!("pub extern \"C\" fn csbindgen_{method_name}(\n").as_str());
|
||||||
|
for parameter in parameters {
|
||||||
|
sb.push_str(" ");
|
||||||
|
sb.push_str(parameter.as_str());
|
||||||
|
sb.push_str(",\n");
|
||||||
|
}
|
||||||
|
sb.push_str(")");
|
||||||
|
if return_line != "" {
|
||||||
|
sb.push_str(return_line.as_str());
|
||||||
|
}
|
||||||
|
sb.push_str("\n");
|
||||||
|
sb.push_str("{\n");
|
||||||
|
sb.push_str(" unsafe {\n");
|
||||||
|
sb.push_str(format!(" return {mod_name}::{method_name}(\n").as_str());
|
||||||
|
for p in parameter_only_names {
|
||||||
|
sb.push_str(" ");
|
||||||
|
sb.push_str(p);
|
||||||
|
sb.push_str(",\n");
|
||||||
|
}
|
||||||
|
sb.push_str(" )\n");
|
||||||
|
sb.push_str(" }\n");
|
||||||
|
sb.push_str_ln("}\n");
|
||||||
|
|
||||||
|
result.push(sb);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn emit_csharp(
|
||||||
|
methods: &Vec<ExternMethod>,
|
||||||
|
aliases: &HashMap<String, RustType>,
|
||||||
|
structs: &Vec<RustStruct>,
|
||||||
|
) -> String {
|
||||||
|
// TODO: options
|
||||||
|
let namespace = "Csbindgen";
|
||||||
|
let class_name = "NativeMethods";
|
||||||
|
let dll_name = "csbindgen_tests";
|
||||||
|
let method_prefix = "csbindgen_";
|
||||||
|
|
||||||
|
let mut method_list_string = String::new();
|
||||||
|
for item in methods {
|
||||||
|
let method_name = &item.method_name;
|
||||||
|
let return_type = match &item.return_type {
|
||||||
|
Some(x) => x.to_csharp_string(),
|
||||||
|
None => "void".to_string(),
|
||||||
|
};
|
||||||
|
|
||||||
|
let parameters = item
|
||||||
|
.parameters
|
||||||
|
.iter()
|
||||||
|
.map(|p| format!("{} {}", p.rust_type.to_csharp_string(), p.name))
|
||||||
|
.collect::<Vec<_>>()
|
||||||
|
.join(", ");
|
||||||
|
|
||||||
|
method_list_string.push_str_ln(
|
||||||
|
" [DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]",
|
||||||
|
);
|
||||||
|
method_list_string.push_str_ln(
|
||||||
|
format!(" public static extern {return_type} {method_prefix}{method_name}({parameters});").as_str(),
|
||||||
|
);
|
||||||
|
method_list_string.push_str("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut alias_string = String::new();
|
||||||
|
let mut aliases: Vec<_> = aliases.iter().collect();
|
||||||
|
aliases.sort_by_key(|x| x.0);
|
||||||
|
for (name, rust_type) in aliases {
|
||||||
|
alias_string.push_str_ln(
|
||||||
|
format!(" using {} = {};", name, rust_type.to_csharp_string()).as_str(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut structs_string = String::new();
|
||||||
|
for item in structs {
|
||||||
|
let name = &item.struct_name;
|
||||||
|
let layout_kind = if item.is_union {
|
||||||
|
"Explicit"
|
||||||
|
} else {
|
||||||
|
"Sequential"
|
||||||
|
};
|
||||||
|
|
||||||
|
structs_string
|
||||||
|
.push_str_ln(format!(" [StructLayout(LayoutKind.{layout_kind})]").as_str());
|
||||||
|
structs_string.push_str_ln(format!(" public unsafe struct {name}").as_str());
|
||||||
|
structs_string.push_str_ln(" {");
|
||||||
|
for field in &item.fields {
|
||||||
|
if item.is_union {
|
||||||
|
structs_string.push_str_ln(" [FieldOffset(0)]");
|
||||||
|
}
|
||||||
|
structs_string.push_str(
|
||||||
|
format!(
|
||||||
|
" public {} {}",
|
||||||
|
field.rust_type.to_csharp_string(),
|
||||||
|
field.name
|
||||||
|
)
|
||||||
|
.as_str(),
|
||||||
|
);
|
||||||
|
if field.rust_type.is_fixed_array {
|
||||||
|
let mut digits = field.rust_type.fixed_array_digits.clone();
|
||||||
|
if digits == "0" {
|
||||||
|
digits = "1".to_string(); // 0 fixed array is not allowed in C#
|
||||||
|
};
|
||||||
|
|
||||||
|
structs_string.push_str(format!("[{}]", digits).as_str());
|
||||||
|
}
|
||||||
|
structs_string.push_str_ln(";");
|
||||||
|
}
|
||||||
|
structs_string.push_str_ln(" }");
|
||||||
|
structs_string.push_str("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
let result = format!(
|
||||||
|
"// <auto-generated>
|
||||||
|
// This code is generated via csbindgen.
|
||||||
|
// DON'T CHANGE THIS DIRECTLY.
|
||||||
|
// </auto-generated>
|
||||||
|
using System;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
namespace {namespace}
|
||||||
|
{{
|
||||||
|
{alias_string}
|
||||||
|
|
||||||
|
public static unsafe partial class {class_name}
|
||||||
|
{{
|
||||||
|
const string __DllName = \"{dll_name}\";
|
||||||
|
|
||||||
|
{method_list_string}
|
||||||
|
}}
|
||||||
|
|
||||||
|
{structs_string}
|
||||||
|
}}
|
||||||
|
"
|
||||||
|
);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
trait PushStrLn {
|
||||||
|
fn push_str_ln(&mut self, string: &str);
|
||||||
|
}
|
||||||
|
|
||||||
|
impl PushStrLn for String {
|
||||||
|
fn push_str_ln(&mut self, string: &str) {
|
||||||
|
self.push_str(string);
|
||||||
|
self.push('\n');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
pub struct Parameter {
|
||||||
|
pub name: String,
|
||||||
|
pub rust_type: RustType,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
pub struct FieldMember {
|
||||||
|
pub name: String,
|
||||||
|
pub rust_type: RustType,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
pub struct ExternMethod {
|
||||||
|
pub method_name: String,
|
||||||
|
pub parameters: Vec<Parameter>,
|
||||||
|
pub return_type: Option<RustType>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
|
||||||
|
pub struct RustType {
|
||||||
|
pub type_name: String,
|
||||||
|
pub is_pointer: bool,
|
||||||
|
pub is_pointer_pointer: bool,
|
||||||
|
pub is_const: bool,
|
||||||
|
pub is_mut: bool,
|
||||||
|
pub is_fixed_array: bool,
|
||||||
|
pub fixed_array_digits: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
pub struct RustStruct {
|
||||||
|
pub struct_name: String,
|
||||||
|
pub fields: Vec<FieldMember>,
|
||||||
|
pub is_union: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl RustType {
|
||||||
|
pub fn to_string(&self, mod_prefix: &str) -> String {
|
||||||
|
let mut sb = String::new();
|
||||||
|
|
||||||
|
if self.is_pointer || self.is_pointer_pointer {
|
||||||
|
sb.push_str("*");
|
||||||
|
}
|
||||||
|
if self.is_const {
|
||||||
|
sb.push_str("const");
|
||||||
|
}
|
||||||
|
if self.is_mut {
|
||||||
|
sb.push_str("mut");
|
||||||
|
}
|
||||||
|
if self.is_pointer_pointer {
|
||||||
|
if self.is_const {
|
||||||
|
sb.push_str(" *const");
|
||||||
|
} else {
|
||||||
|
sb.push_str(" *mut");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sb.push_str(" ");
|
||||||
|
|
||||||
|
if self.is_fixed_array {
|
||||||
|
sb.push_str("[");
|
||||||
|
sb.push_str(self.type_name.as_str());
|
||||||
|
sb.push_str("; ");
|
||||||
|
sb.push_str(self.fixed_array_digits.as_str());
|
||||||
|
sb.push_str("]");
|
||||||
|
} else {
|
||||||
|
if !self.type_name.starts_with("c_")
|
||||||
|
&& !(self.type_name == "usize" || self.type_name == "isize")
|
||||||
|
{
|
||||||
|
sb.push_str(mod_prefix);
|
||||||
|
sb.push_str("::");
|
||||||
|
}
|
||||||
|
sb.push_str(self.type_name.as_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
sb
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn to_csharp_string(&self) -> String {
|
||||||
|
fn convert_type_name(type_name: &str) -> &str {
|
||||||
|
let name = match type_name {
|
||||||
|
// std::os::raw https://doc.rust-lang.org/std/os/raw/index.html
|
||||||
|
"c_char" => "Byte",
|
||||||
|
"c_schar" => "SByte",
|
||||||
|
"c_uchar" => "Byte",
|
||||||
|
"c_short" => "Int16",
|
||||||
|
"c_ushort" => "UInt16",
|
||||||
|
"c_int" => "Int32",
|
||||||
|
"c_uint" => "UInt32",
|
||||||
|
"c_long" => "Int32", // int? long? nint? TODO:configure
|
||||||
|
"c_ulong" => "UInt32", // uint? ulong? nuint? TODO:configure
|
||||||
|
"c_longlong" => "Int64",
|
||||||
|
"c_ulonglong" => "UInt64",
|
||||||
|
"c_float" => "Float",
|
||||||
|
"c_double" => "Double",
|
||||||
|
"c_void" => "void",
|
||||||
|
// rust primitives
|
||||||
|
"i8" => "SByte",
|
||||||
|
"i16" => "Int16",
|
||||||
|
"i32" => "Int32",
|
||||||
|
"i64" => "Int64",
|
||||||
|
"i128" => "Int128", // .NET 7
|
||||||
|
"isize" => "IntPtr",
|
||||||
|
"u8" => "Byte",
|
||||||
|
"u16" => "UInt16",
|
||||||
|
"u32" => "UInt32",
|
||||||
|
"u64" => "UInt64",
|
||||||
|
"u128" => "UInt128", // .NET 7
|
||||||
|
"f32" => "Float",
|
||||||
|
"f64" => "Double",
|
||||||
|
"bool" => "Boolean",
|
||||||
|
"usize" => "UIntPtr",
|
||||||
|
"()" => "void", // if type is parameter, can't use in C#
|
||||||
|
_ => type_name, // as is
|
||||||
|
};
|
||||||
|
name
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut sb = String::new();
|
||||||
|
|
||||||
|
if self.is_fixed_array {
|
||||||
|
sb.push_str("fixed ");
|
||||||
|
sb.push_str(convert_type_name(self.type_name.as_str()));
|
||||||
|
} else {
|
||||||
|
sb.push_str(convert_type_name(self.type_name.as_str()));
|
||||||
|
if self.is_pointer {
|
||||||
|
sb.push_str("*");
|
||||||
|
}
|
||||||
|
if self.is_pointer_pointer {
|
||||||
|
sb.push_str("**");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sb
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Display for RustType {
|
||||||
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
|
write!(f, "{}", self.to_string(""))
|
||||||
|
}
|
||||||
|
}
|
20
dotnet-sandbox/CsbindgenDotnetConsoleApp.csproj
Normal file
20
dotnet-sandbox/CsbindgenDotnetConsoleApp.csproj
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net7.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="../target/debug/csbindgen_tests.dll">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Include="../target/debug/csbindgen_tests.pdb">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
25
dotnet-sandbox/CsbindgenDotnetConsoleApp.sln
Normal file
25
dotnet-sandbox/CsbindgenDotnetConsoleApp.sln
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio Version 17
|
||||||
|
VisualStudioVersion = 17.5.33414.496
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CsbindgenDotnetConsoleApp", "CsbindgenDotnetConsoleApp.csproj", "{3ED7C644-A880-426C-9BF1-24675D7A6299}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
Release|Any CPU = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{3ED7C644-A880-426C-9BF1-24675D7A6299}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{3ED7C644-A880-426C-9BF1-24675D7A6299}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{3ED7C644-A880-426C-9BF1-24675D7A6299}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{3ED7C644-A880-426C-9BF1-24675D7A6299}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
|
SolutionGuid = {DD647440-C307-4A09-9D97-DEA74660F797}
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
26
dotnet-sandbox/Program.cs
Normal file
26
dotnet-sandbox/Program.cs
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
// See https://aka.ms/new-console-template for more information
|
||||||
|
using Csbindgen;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
unsafe
|
||||||
|
{
|
||||||
|
var v = NativeMethods.csbindgen_LZ4_versionString();
|
||||||
|
|
||||||
|
|
||||||
|
//var bytes = new byte[] { 1, 10, 100, 100, 100, 100, 100, 100 };
|
||||||
|
//var dest = new byte[100];
|
||||||
|
|
||||||
|
//fixed (byte* p = bytes)
|
||||||
|
//fixed (byte* d = dest)
|
||||||
|
//{
|
||||||
|
|
||||||
|
// var len = NativeMethods.csbindgen_LZ4_compress_default(p, d, bytes.Length, dest.Length);
|
||||||
|
|
||||||
|
//}
|
||||||
|
|
||||||
|
|
||||||
|
var vvv = new string((sbyte*)v);
|
||||||
|
|
||||||
|
Console.WriteLine(vvv);
|
||||||
|
|
||||||
|
}
|
8
dotnet-sandbox/Properties/launchSettings.json
Normal file
8
dotnet-sandbox/Properties/launchSettings.json
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"profiles": {
|
||||||
|
"CsbindgenDotnetConsoleApp": {
|
||||||
|
"commandName": "Project",
|
||||||
|
"nativeDebugging": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
520
dotnet-sandbox/bindgen.cs
Normal file
520
dotnet-sandbox/bindgen.cs
Normal file
@ -0,0 +1,520 @@
|
|||||||
|
// <auto-generated>
|
||||||
|
// This code is generated via csbindgen.
|
||||||
|
// DON'T CHANGE THIS DIRECTLY.
|
||||||
|
// </auto-generated>
|
||||||
|
using System;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
namespace Csbindgen
|
||||||
|
{
|
||||||
|
using LZ4F_blockChecksum_t = Int32;
|
||||||
|
using LZ4F_blockMode_t = Int32;
|
||||||
|
using LZ4F_blockSizeID_t = Int32;
|
||||||
|
using LZ4F_cctx = LZ4F_cctx_s;
|
||||||
|
using LZ4F_compressionContext_t = LZ4F_cctx_s;
|
||||||
|
using LZ4F_contentChecksum_t = Int32;
|
||||||
|
using LZ4F_dctx = LZ4F_dctx_s;
|
||||||
|
using LZ4F_decompressionContext_t = LZ4F_dctx_s;
|
||||||
|
using LZ4F_errorCode_t = UIntPtr;
|
||||||
|
using LZ4F_frameType_t = Int32;
|
||||||
|
using LZ4_byte = Byte;
|
||||||
|
using LZ4_i8 = SByte;
|
||||||
|
using LZ4_streamDecode_t = LZ4_streamDecode_u;
|
||||||
|
using LZ4_streamHC_t = LZ4_streamHC_u;
|
||||||
|
using LZ4_stream_t = LZ4_stream_u;
|
||||||
|
using LZ4_u16 = UInt16;
|
||||||
|
using LZ4_u32 = UInt32;
|
||||||
|
using XXH32_hash_t = UInt32;
|
||||||
|
using XXH32_state_t = XXH32_state_s;
|
||||||
|
using XXH64_hash_t = UInt64;
|
||||||
|
using XXH64_state_t = XXH64_state_s;
|
||||||
|
using XXH_errorcode = Int32;
|
||||||
|
|
||||||
|
|
||||||
|
public static unsafe partial class NativeMethods
|
||||||
|
{
|
||||||
|
const string __DllName = "csbindgen_tests";
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_versionNumber();
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Byte* csbindgen_LZ4_versionString();
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_compress_default(Byte* src, Byte* dst, Int32 srcSize, Int32 dstCapacity);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_decompress_safe(Byte* src, Byte* dst, Int32 compressedSize, Int32 dstCapacity);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_compressBound(Int32 inputSize);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_compress_fast(Byte* src, Byte* dst, Int32 srcSize, Int32 dstCapacity, Int32 acceleration);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_sizeofState();
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_compress_fast_extState(void* state, Byte* src, Byte* dst, Int32 srcSize, Int32 dstCapacity, Int32 acceleration);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_compress_destSize(Byte* src, Byte* dst, Int32* srcSizePtr, Int32 targetDstSize);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_decompress_safe_partial(Byte* src, Byte* dst, Int32 srcSize, Int32 targetOutputSize, Int32 dstCapacity);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern LZ4_stream_t* csbindgen_LZ4_createStream();
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_freeStream(LZ4_stream_t* streamPtr);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern void csbindgen_LZ4_resetStream_fast(LZ4_stream_t* streamPtr);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_loadDict(LZ4_stream_t* streamPtr, Byte* dictionary, Int32 dictSize);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_compress_fast_continue(LZ4_stream_t* streamPtr, Byte* src, Byte* dst, Int32 srcSize, Int32 dstCapacity, Int32 acceleration);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_saveDict(LZ4_stream_t* streamPtr, Byte* safeBuffer, Int32 maxDictSize);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern LZ4_streamDecode_t* csbindgen_LZ4_createStreamDecode();
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_freeStreamDecode(LZ4_streamDecode_t* LZ4_stream);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_setStreamDecode(LZ4_streamDecode_t* LZ4_streamDecode, Byte* dictionary, Int32 dictSize);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_decoderRingBufferSize(Int32 maxBlockSize);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_decompress_safe_continue(LZ4_streamDecode_t* LZ4_streamDecode, Byte* src, Byte* dst, Int32 srcSize, Int32 dstCapacity);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_decompress_safe_usingDict(Byte* src, Byte* dst, Int32 srcSize, Int32 dstCapacity, Byte* dictStart, Int32 dictSize);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_decompress_safe_partial_usingDict(Byte* src, Byte* dst, Int32 compressedSize, Int32 targetOutputSize, Int32 maxOutputSize, Byte* dictStart, Int32 dictSize);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern void csbindgen___va_start(Byte** arg1);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern void csbindgen___security_init_cookie();
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern void csbindgen___security_check_cookie(UIntPtr _StackCookie);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern LZ4_stream_t* csbindgen_LZ4_initStream(void* buffer, UIntPtr size);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_compress(Byte* src, Byte* dest, Int32 srcSize);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_compress_limitedOutput(Byte* src, Byte* dest, Int32 srcSize, Int32 maxOutputSize);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_compress_withState(void* state, Byte* source, Byte* dest, Int32 inputSize);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_compress_limitedOutput_withState(void* state, Byte* source, Byte* dest, Int32 inputSize, Int32 maxOutputSize);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_compress_continue(LZ4_stream_t* LZ4_streamPtr, Byte* source, Byte* dest, Int32 inputSize);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_compress_limitedOutput_continue(LZ4_stream_t* LZ4_streamPtr, Byte* source, Byte* dest, Int32 inputSize, Int32 maxOutputSize);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_uncompress(Byte* source, Byte* dest, Int32 outputSize);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_uncompress_unknownOutputSize(Byte* source, Byte* dest, Int32 isize_, Int32 maxOutputSize);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern void* csbindgen_LZ4_create(Byte* inputBuffer);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_sizeofStreamState();
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_resetStreamState(void* state, Byte* inputBuffer);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Byte* csbindgen_LZ4_slideInputBuffer(void* state);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_decompress_safe_withPrefix64k(Byte* src, Byte* dst, Int32 compressedSize, Int32 maxDstSize);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_decompress_fast_withPrefix64k(Byte* src, Byte* dst, Int32 originalSize);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_decompress_fast(Byte* src, Byte* dst, Int32 originalSize);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_decompress_fast_continue(LZ4_streamDecode_t* LZ4_streamDecode, Byte* src, Byte* dst, Int32 originalSize);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_decompress_fast_usingDict(Byte* src, Byte* dst, Int32 originalSize, Byte* dictStart, Int32 dictSize);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern void csbindgen_LZ4_resetStream(LZ4_stream_t* streamPtr);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_compress_HC(Byte* src, Byte* dst, Int32 srcSize, Int32 dstCapacity, Int32 compressionLevel);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_sizeofStateHC();
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_compress_HC_extStateHC(void* stateHC, Byte* src, Byte* dst, Int32 srcSize, Int32 maxDstSize, Int32 compressionLevel);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_compress_HC_destSize(void* stateHC, Byte* src, Byte* dst, Int32* srcSizePtr, Int32 targetDstSize, Int32 compressionLevel);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern LZ4_streamHC_t* csbindgen_LZ4_createStreamHC();
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_freeStreamHC(LZ4_streamHC_t* streamHCPtr);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern void csbindgen_LZ4_resetStreamHC_fast(LZ4_streamHC_t* streamHCPtr, Int32 compressionLevel);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_loadDictHC(LZ4_streamHC_t* streamHCPtr, Byte* dictionary, Int32 dictSize);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_compress_HC_continue(LZ4_streamHC_t* streamHCPtr, Byte* src, Byte* dst, Int32 srcSize, Int32 maxDstSize);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_compress_HC_continue_destSize(LZ4_streamHC_t* LZ4_streamHCPtr, Byte* src, Byte* dst, Int32* srcSizePtr, Int32 targetDstSize);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_saveDictHC(LZ4_streamHC_t* streamHCPtr, Byte* safeBuffer, Int32 maxDictSize);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern LZ4_streamHC_t* csbindgen_LZ4_initStreamHC(void* buffer, UIntPtr size);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_compressHC(Byte* source, Byte* dest, Int32 inputSize);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_compressHC_limitedOutput(Byte* source, Byte* dest, Int32 inputSize, Int32 maxOutputSize);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_compressHC2(Byte* source, Byte* dest, Int32 inputSize, Int32 compressionLevel);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_compressHC2_limitedOutput(Byte* source, Byte* dest, Int32 inputSize, Int32 maxOutputSize, Int32 compressionLevel);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_compressHC_withStateHC(void* state, Byte* source, Byte* dest, Int32 inputSize);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_compressHC_limitedOutput_withStateHC(void* state, Byte* source, Byte* dest, Int32 inputSize, Int32 maxOutputSize);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_compressHC2_withStateHC(void* state, Byte* source, Byte* dest, Int32 inputSize, Int32 compressionLevel);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_compressHC2_limitedOutput_withStateHC(void* state, Byte* source, Byte* dest, Int32 inputSize, Int32 maxOutputSize, Int32 compressionLevel);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_compressHC_continue(LZ4_streamHC_t* LZ4_streamHCPtr, Byte* source, Byte* dest, Int32 inputSize);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_compressHC_limitedOutput_continue(LZ4_streamHC_t* LZ4_streamHCPtr, Byte* source, Byte* dest, Int32 inputSize, Int32 maxOutputSize);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern void* csbindgen_LZ4_createHC(Byte* inputBuffer);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_freeHC(void* LZ4HC_Data);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Byte* csbindgen_LZ4_slideInputBufferHC(void* LZ4HC_Data);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_compressHC2_continue(void* LZ4HC_Data, Byte* source, Byte* dest, Int32 inputSize, Int32 compressionLevel);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_compressHC2_limitedOutput_continue(void* LZ4HC_Data, Byte* source, Byte* dest, Int32 inputSize, Int32 maxOutputSize, Int32 compressionLevel);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_sizeofStreamStateHC();
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4_resetStreamStateHC(void* state, Byte* inputBuffer);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern void csbindgen_LZ4_resetStreamHC(LZ4_streamHC_t* streamHCPtr, Int32 compressionLevel);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern UInt32 csbindgen_LZ4F_isError(LZ4F_errorCode_t code);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Byte* csbindgen_LZ4F_getErrorName(LZ4F_errorCode_t code);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern Int32 csbindgen_LZ4F_compressionLevel_max();
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern UIntPtr csbindgen_LZ4F_compressFrameBound(UIntPtr srcSize, LZ4F_preferences_t* preferencesPtr);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern UIntPtr csbindgen_LZ4F_compressFrame(void* dstBuffer, UIntPtr dstCapacity, void* srcBuffer, UIntPtr srcSize, LZ4F_preferences_t* preferencesPtr);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern UInt32 csbindgen_LZ4F_getVersion();
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern LZ4F_errorCode_t csbindgen_LZ4F_createCompressionContext(LZ4F_cctx** cctxPtr, UInt32 version);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern LZ4F_errorCode_t csbindgen_LZ4F_freeCompressionContext(LZ4F_cctx* cctx);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern UIntPtr csbindgen_LZ4F_compressBegin(LZ4F_cctx* cctx, void* dstBuffer, UIntPtr dstCapacity, LZ4F_preferences_t* prefsPtr);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern UIntPtr csbindgen_LZ4F_compressBound(UIntPtr srcSize, LZ4F_preferences_t* prefsPtr);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern UIntPtr csbindgen_LZ4F_compressUpdate(LZ4F_cctx* cctx, void* dstBuffer, UIntPtr dstCapacity, void* srcBuffer, UIntPtr srcSize, LZ4F_compressOptions_t* cOptPtr);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern UIntPtr csbindgen_LZ4F_flush(LZ4F_cctx* cctx, void* dstBuffer, UIntPtr dstCapacity, LZ4F_compressOptions_t* cOptPtr);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern UIntPtr csbindgen_LZ4F_compressEnd(LZ4F_cctx* cctx, void* dstBuffer, UIntPtr dstCapacity, LZ4F_compressOptions_t* cOptPtr);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern LZ4F_errorCode_t csbindgen_LZ4F_createDecompressionContext(LZ4F_dctx** dctxPtr, UInt32 version);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern LZ4F_errorCode_t csbindgen_LZ4F_freeDecompressionContext(LZ4F_dctx* dctx);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern UIntPtr csbindgen_LZ4F_headerSize(void* src, UIntPtr srcSize);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern UIntPtr csbindgen_LZ4F_getFrameInfo(LZ4F_dctx* dctx, LZ4F_frameInfo_t* frameInfoPtr, void* srcBuffer, UIntPtr* srcSizePtr);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern UIntPtr csbindgen_LZ4F_decompress(LZ4F_dctx* dctx, void* dstBuffer, UIntPtr* dstSizePtr, void* srcBuffer, UIntPtr* srcSizePtr, LZ4F_decompressOptions_t* dOptPtr);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern void csbindgen_LZ4F_resetDecompressionContext(LZ4F_dctx* dctx);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern UInt32 csbindgen_XXH_versionNumber();
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern XXH32_hash_t csbindgen_XXH32(void* input, UIntPtr length, UInt32 seed);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern XXH32_state_t* csbindgen_XXH32_createState();
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern XXH_errorcode csbindgen_XXH32_freeState(XXH32_state_t* statePtr);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern void csbindgen_XXH32_copyState(XXH32_state_t* dst_state, XXH32_state_t* src_state);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern XXH_errorcode csbindgen_XXH32_reset(XXH32_state_t* statePtr, UInt32 seed);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern XXH_errorcode csbindgen_XXH32_update(XXH32_state_t* statePtr, void* input, UIntPtr length);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern XXH32_hash_t csbindgen_XXH32_digest(XXH32_state_t* statePtr);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern void csbindgen_XXH32_canonicalFromHash(XXH32_canonical_t* dst, XXH32_hash_t hash);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern XXH32_hash_t csbindgen_XXH32_hashFromCanonical(XXH32_canonical_t* src);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern XXH64_hash_t csbindgen_XXH64(void* input, UIntPtr length, UInt64 seed);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern XXH64_state_t* csbindgen_XXH64_createState();
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern XXH_errorcode csbindgen_XXH64_freeState(XXH64_state_t* statePtr);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern void csbindgen_XXH64_copyState(XXH64_state_t* dst_state, XXH64_state_t* src_state);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern XXH_errorcode csbindgen_XXH64_reset(XXH64_state_t* statePtr, UInt64 seed);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern XXH_errorcode csbindgen_XXH64_update(XXH64_state_t* statePtr, void* input, UIntPtr length);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern XXH64_hash_t csbindgen_XXH64_digest(XXH64_state_t* statePtr);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern void csbindgen_XXH64_canonicalFromHash(XXH64_canonical_t* dst, XXH64_hash_t hash);
|
||||||
|
|
||||||
|
[DllImport(__DllName, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern XXH64_hash_t csbindgen_XXH64_hashFromCanonical(XXH64_canonical_t* src);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
public unsafe struct LZ4_stream_t_internal
|
||||||
|
{
|
||||||
|
public fixed LZ4_u32 hashTable[4096];
|
||||||
|
public LZ4_byte* dictionary;
|
||||||
|
public LZ4_stream_t_internal* dictCtx;
|
||||||
|
public LZ4_u32 currentOffset;
|
||||||
|
public LZ4_u32 tableType;
|
||||||
|
public LZ4_u32 dictSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Explicit)]
|
||||||
|
public unsafe struct LZ4_stream_u
|
||||||
|
{
|
||||||
|
[FieldOffset(0)]
|
||||||
|
public fixed Byte minStateSize[16416];
|
||||||
|
[FieldOffset(0)]
|
||||||
|
public LZ4_stream_t_internal internal_donotuse;
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
public unsafe struct LZ4_streamDecode_t_internal
|
||||||
|
{
|
||||||
|
public LZ4_byte* externalDict;
|
||||||
|
public LZ4_byte* prefixEnd;
|
||||||
|
public UIntPtr extDictSize;
|
||||||
|
public UIntPtr prefixSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Explicit)]
|
||||||
|
public unsafe struct LZ4_streamDecode_u
|
||||||
|
{
|
||||||
|
[FieldOffset(0)]
|
||||||
|
public fixed Byte minStateSize[32];
|
||||||
|
[FieldOffset(0)]
|
||||||
|
public LZ4_streamDecode_t_internal internal_donotuse;
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
public unsafe struct LZ4HC_CCtx_internal
|
||||||
|
{
|
||||||
|
public fixed LZ4_u32 hashTable[32768];
|
||||||
|
public fixed LZ4_u16 chainTable[65536];
|
||||||
|
public LZ4_byte* end;
|
||||||
|
public LZ4_byte* prefixStart;
|
||||||
|
public LZ4_byte* dictStart;
|
||||||
|
public LZ4_u32 dictLimit;
|
||||||
|
public LZ4_u32 lowLimit;
|
||||||
|
public LZ4_u32 nextToUpdate;
|
||||||
|
public Int16 compressionLevel;
|
||||||
|
public LZ4_i8 favorDecSpeed;
|
||||||
|
public LZ4_i8 dirty;
|
||||||
|
public LZ4HC_CCtx_internal* dictCtx;
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Explicit)]
|
||||||
|
public unsafe struct LZ4_streamHC_u
|
||||||
|
{
|
||||||
|
[FieldOffset(0)]
|
||||||
|
public fixed Byte minStateSize[262200];
|
||||||
|
[FieldOffset(0)]
|
||||||
|
public LZ4HC_CCtx_internal internal_donotuse;
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
public unsafe struct LZ4F_frameInfo_t
|
||||||
|
{
|
||||||
|
public LZ4F_blockSizeID_t blockSizeID;
|
||||||
|
public LZ4F_blockMode_t blockMode;
|
||||||
|
public LZ4F_contentChecksum_t contentChecksumFlag;
|
||||||
|
public LZ4F_frameType_t frameType;
|
||||||
|
public UInt64 contentSize;
|
||||||
|
public UInt32 dictID;
|
||||||
|
public LZ4F_blockChecksum_t blockChecksumFlag;
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
public unsafe struct LZ4F_preferences_t
|
||||||
|
{
|
||||||
|
public LZ4F_frameInfo_t frameInfo;
|
||||||
|
public Int32 compressionLevel;
|
||||||
|
public UInt32 autoFlush;
|
||||||
|
public UInt32 favorDecSpeed;
|
||||||
|
public fixed UInt32 reserved[3];
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
public unsafe struct LZ4F_cctx_s
|
||||||
|
{
|
||||||
|
public fixed Byte _unused[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
public unsafe struct LZ4F_compressOptions_t
|
||||||
|
{
|
||||||
|
public UInt32 stableSrc;
|
||||||
|
public fixed UInt32 reserved[3];
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
public unsafe struct LZ4F_dctx_s
|
||||||
|
{
|
||||||
|
public fixed Byte _unused[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
public unsafe struct LZ4F_decompressOptions_t
|
||||||
|
{
|
||||||
|
public UInt32 stableDst;
|
||||||
|
public UInt32 skipChecksums;
|
||||||
|
public UInt32 reserved1;
|
||||||
|
public UInt32 reserved0;
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
public unsafe struct XXH32_state_s
|
||||||
|
{
|
||||||
|
public fixed Byte _unused[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
public unsafe struct XXH32_canonical_t
|
||||||
|
{
|
||||||
|
public fixed Byte digest[4];
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
public unsafe struct XXH64_state_s
|
||||||
|
{
|
||||||
|
public fixed Byte _unused[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
public unsafe struct XXH64_canonical_t
|
||||||
|
{
|
||||||
|
public fixed Byte digest[8];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user