blob: dcf60b528fd47abc7c5e45b1fe57ca96d692ac3b [file] [edit]
// Note: These manual bindings and the `cc` build dependency are a temporary measure.
// We can revert to using `brotlic-sys` if https://github.com/AronParker/brotlic/pull/5
// is ever merged.
#![allow(non_camel_case_types)]
#![allow(dead_code)]
#![allow(non_upper_case_globals)]
use std::os::raw::{c_int, c_void};
/// Opaque structure that holds decoder state.
pub type BrotliDecoderState = c_void;
// From brotli/c/include/brotli/decode.h
pub type BrotliDecoderResult = c_int;
pub const BrotliDecoderResult_BROTLI_DECODER_RESULT_ERROR: BrotliDecoderResult = 0;
pub const BrotliDecoderResult_BROTLI_DECODER_RESULT_SUCCESS: BrotliDecoderResult = 1;
pub const BrotliDecoderResult_BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT: BrotliDecoderResult = 2;
pub const BrotliDecoderResult_BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT: BrotliDecoderResult = 3;
// From brotli/c/include/brotli/shared_dictionary.h
pub type BrotliSharedDictionaryType = c_int;
pub const BrotliSharedDictionaryType_BROTLI_SHARED_DICTIONARY_RAW: BrotliSharedDictionaryType = 0;
pub const BrotliSharedDictionaryType_BROTLI_SHARED_DICTIONARY_SERIALIZED:
BrotliSharedDictionaryType = 1;
// From brotli/c/include/brotli/types.h
pub type BROTLI_BOOL = c_int;
pub const BROTLI_TRUE: BROTLI_BOOL = 1;
pub const BROTLI_FALSE: BROTLI_BOOL = 0;
// From brotli/c/include/brotli/types.h
pub type brotli_alloc_func =
Option<unsafe extern "C" fn(opaque: *mut c_void, size: usize) -> *mut c_void>;
pub type brotli_free_func = Option<unsafe extern "C" fn(opaque: *mut c_void, address: *mut c_void)>;
// Functions from brotli/c/include/brotli/decode.h
extern "C" {
/// Creates an instance of [`BrotliDecoderState`] and initializes it.
///
/// The instance can be used once for decoding and should then be destroyed with
/// [`BrotliDecoderDestroyInstance`]. It cannot be reused for a new decoding
/// session.
///
/// # Safety
///
/// `alloc_func` and `free_func` MUST be both `Some` or both `None`. In the
/// case they are both `None`, default memory allocators are used. `opaque` is
/// passed to `alloc_func` and `free_func` when they are called. `free_func`
/// has to return without doing anything when asked to free a null pointer.
///
/// # Arguments
///
/// * `alloc_func` - Custom memory allocation function.
/// * `free_func` - Custom memory free function.
/// * `opaque` - Custom memory manager handle.
///
/// # Returns
///
/// `null` if the instance cannot be allocated or initialized; otherwise, a
/// pointer to an initialized [`BrotliDecoderState`].
pub fn BrotliDecoderCreateInstance(
alloc_func: brotli_alloc_func,
free_func: brotli_free_func,
opaque: *mut c_void,
) -> *mut BrotliDecoderState;
/// Adds LZ77 prefix dictionary, adds or replaces built-in static dictionary and
/// transforms.
///
/// Attached dictionary ownership is not transferred.
///
/// # Note
///
/// Dictionaries can NOT be attached after actual decoding is started.
///
/// # Safety
///
/// * `state` must be a valid pointer to a [`BrotliDecoderState`].
/// * `data` must point to a valid memory region of at least `data_size` bytes.
/// * The memory pointed to by `data` must be kept accessible until decoding
/// is finished and the decoder instance is destroyed.
///
/// # Arguments
///
/// * `state` - Decoder instance.
/// * `type_` - Dictionary data format.
/// * `data_size` - Length of memory region pointed by `data`.
/// * `data` - Dictionary data in format corresponding to `type_`.
///
/// # Returns
///
/// [`BROTLI_FALSE`] if the dictionary is corrupted, or the dictionary count
/// limit is reached; otherwise, [`BROTLI_TRUE`].
pub fn BrotliDecoderAttachDictionary(
state: *mut BrotliDecoderState,
type_: BrotliSharedDictionaryType,
data_size: usize,
data: *const u8,
) -> BROTLI_BOOL;
/// Decompresses the input stream to the output stream.
///
/// The values `available_in` and `available_out` must specify the number of
/// bytes addressable at `next_in` and `next_out` respectively.
///
/// After each call, `available_in` will be decremented by the amount of input
/// bytes consumed, and the `next_in` pointer will be incremented by that
/// amount. Similarly, `available_out` will be decremented by the amount of
/// output bytes written, and the `next_out` pointer will be incremented by
/// that amount.
///
/// `total_out`, if it is not a null-pointer, will be set to the number
/// of bytes decompressed since the last `state` initialization.
///
/// # Note
///
/// Input is never overconsumed, so `next_in` and `available_in` could be
/// passed to the next consumer after decoding is complete.
///
/// # Safety
///
/// * `state` must be a valid pointer to a [`BrotliDecoderState`].
/// * `available_in`, `next_in`, `available_out`, and `next_out` must all be
/// valid, non-null pointers to their respective types.
/// * The memory region pointed to by `*next_in` must be at least
/// `*available_in` bytes long.
/// * The memory region pointed to by `*next_out` must be at least
/// `*available_out` bytes long, unless `*available_out` is 0, in which
/// case `*next_out` may be `null`.
/// * `total_out` may be `null`; if not, it must be a valid pointer to a
/// [`usize`].
///
/// # Arguments
///
/// * `state` - Decoder instance.
/// * `available_in` - **in:** amount of available input; **out:** amount of unused input.
/// * `next_in` - **in/out:** pointer to the next compressed byte.
/// * `available_out` - **in:** length of output buffer; **out:** remaining size of output buffer.
/// * `next_out` - **in/out:** output buffer cursor; can be `null` if `available_out` is 0.
/// * `total_out` - **out:** number of bytes decompressed so far; can be `null`.
///
/// # Returns
///
/// * [`BrotliDecoderResult_BROTLI_DECODER_RESULT_ERROR`] - Input is corrupted,
/// memory allocation failed, arguments were invalid, etc.
/// * [`BrotliDecoderResult_BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT`] - Decoding
/// is blocked until more input data is provided.
/// * [`BrotliDecoderResult_BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT`] - Decoding
/// is blocked until more output space is provided.
/// * [`BrotliDecoderResult_BROTLI_DECODER_RESULT_SUCCESS`] - Decoding is
/// finished; no more input might be consumed and no more output will be produced.
pub fn BrotliDecoderDecompressStream(
state: *mut BrotliDecoderState,
available_in: *mut usize,
next_in: *mut *const u8,
available_out: *mut usize,
next_out: *mut *mut u8,
total_out: *mut usize,
) -> BrotliDecoderResult;
/// Deinitializes and frees a [`BrotliDecoderState`] instance.
///
/// # Safety
///
/// The `state` pointer must be either `null` or a pointer to a valid
/// [`BrotliDecoderState`] previously allocated with [`BrotliDecoderCreateInstance`].
///
/// # Arguments
///
/// * `state` - Decoder instance to be cleaned up and deallocated.
pub fn BrotliDecoderDestroyInstance(state: *mut BrotliDecoderState);
}