/* SPDX-License-Identifier: GPL-2.0+ */
|
/*
|
* Copyright 2019 Google LLC
|
*/
|
|
#ifndef __LZ4_H
|
#define __LZ4_H
|
|
#define LZ4F_MAGIC 0x184D2204
|
|
struct lz4_frame_header {
|
u32 magic;
|
union {
|
u8 flags;
|
struct {
|
u8 reserved0:2;
|
u8 has_content_checksum:1;
|
u8 has_content_size:1;
|
u8 has_block_checksum:1;
|
u8 independent_blocks:1;
|
u8 version:2;
|
};
|
};
|
union {
|
u8 block_descriptor;
|
struct {
|
u8 reserved1:4;
|
u8 max_block_size:3;
|
u8 reserved2:1;
|
};
|
};
|
/* + u64 content_size iff has_content_size is set */
|
/* + u8 header_checksum */
|
} __packed;
|
|
struct lz4_block_header {
|
union {
|
u32 raw;
|
struct {
|
u32 size:31;
|
u32 not_compressed:1;
|
};
|
};
|
/* + size bytes of data */
|
/* + u32 block_checksum iff has_block_checksum is set */
|
} __packed;
|
|
bool lz4_is_valid_header(const unsigned char *h);
|
|
/**
|
* ulz4fn() - Decompress LZ4 data
|
*
|
* @src: Source data to decompress
|
* @srcn: Length of source data
|
* @dst: Destination for uncompressed data
|
* @dstn: Returns length of uncompressed data
|
* @return 0 if OK, -EPROTONOSUPPORT if the magic number or version number are
|
* not recognised or independent blocks are used, -EINVAL if the reserved
|
* fields are non-zero, or input is overrun, -EENOBUFS if the destination
|
* buffer is overrun, -EEPROTO if the compressed data causes an error in
|
* the decompression algorithm
|
*/
|
int ulz4fn(const void *src, size_t srcn, void *dst, size_t *dstn);
|
|
#endif
|