/* * uzlib - tiny deflate/inflate library (deflate, gzip, zlib) * * Copyright (c) 2003 by Joergen Ibsen / Jibz * All Rights Reserved * http://www.ibsensoftware.com/ * * Copyright (c) 2014-2018 by Paul Sokolovsky * * Optimised for MicroPython: * Copyright (c) 2023 by Jim Mussared * * This software is provided 'as-is', without any express * or implied warranty. In no event will the authors be * held liable for any damages arising from the use of * this software. * * Permission is granted to anyone to use this software * for any purpose, including commercial applications, * and to alter it and redistribute it freely, subject to * the following restrictions: * * 1. The origin of this software must not be * misrepresented; you must not claim that you * wrote the original software. If you use this * software in a product, an acknowledgment in * the product documentation would be appreciated * but is not required. * * 2. Altered source versions must be plainly marked * as such, and must not be misrepresented as * being the original software. * * 3. This notice may not be removed or altered from * any source distribution. */ #ifndef UZLIB_H_INCLUDED #define UZLIB_H_INCLUDED #include #include #include #include "defl_static.h" #include "uzlib_conf.h" #if UZLIB_CONF_DEBUG_LOG #include #endif #ifdef __cplusplus extern "C" { #endif /* ok status, more data produced */ #define UZLIB_OK 0 /* end of compressed stream reached */ #define UZLIB_DONE 1 #define UZLIB_DATA_ERROR (-3) #define UZLIB_CHKSUM_ERROR (-4) #define UZLIB_DICT_ERROR (-5) /* checksum types */ #define UZLIB_CHKSUM_NONE 0 #define UZLIB_CHKSUM_ADLER 1 #define UZLIB_CHKSUM_CRC 2 /* helper macros */ #define TINF_ARRAY_SIZE(arr) (sizeof(arr) / sizeof(*(arr))) /* data structures */ typedef struct { unsigned short table[16]; /* table of code length counts */ unsigned short trans[288]; /* code -> symbol translation table */ } TINF_TREE; typedef struct _uzlib_uncomp_t { /* Pointer to the next byte in the input buffer */ const unsigned char *source; /* Pointer to the next byte past the input buffer (source_limit = source + len) */ const unsigned char *source_limit; /* If source_limit == NULL, or source >= source_limit, this function will be used to read next byte from source stream. The function may also return -1 in case of EOF (or irrecoverable error). Note that besides returning the next byte, it may also update source and source_limit fields, thus allowing for buffered operation. */ int (*source_read_cb)(struct _uzlib_uncomp_t *uncomp); unsigned int tag; unsigned int bitcount; /* Destination (output) buffer start */ unsigned char *dest_start; /* Current pointer in dest buffer */ unsigned char *dest; /* Pointer past the end of the dest buffer, similar to source_limit */ unsigned char *dest_limit; /* Accumulating checksum */ unsigned int checksum; char checksum_type; bool eof; int btype; int bfinal; unsigned int curlen; int lzOff; unsigned char *dict_ring; unsigned int dict_size; unsigned int dict_idx; TINF_TREE ltree; /* dynamic length/symbol tree */ TINF_TREE dtree; /* dynamic distance tree */ } uzlib_uncomp_t; #define TINF_PUT(d, c) \ { \ *d->dest++ = c; \ if (d->dict_ring) { d->dict_ring[d->dict_idx++] = c; if (d->dict_idx == d->dict_size) d->dict_idx = 0; } \ } unsigned char uzlib_get_byte(uzlib_uncomp_t *d); /* Decompression API */ void uzlib_init(void); void uzlib_uncompress_init(uzlib_uncomp_t *d, void *dict, unsigned int dictLen); int uzlib_uncompress(uzlib_uncomp_t *d); int uzlib_uncompress_chksum(uzlib_uncomp_t *d); #define UZLIB_HEADER_ZLIB 0 #define UZLIB_HEADER_GZIP 1 int uzlib_parse_zlib_gzip_header(uzlib_uncomp_t *d, int *wbits); /* Compression API */ struct uzlib_lz77_state { struct Outbuf outbuf; uint8_t *hist_buf; size_t hist_max; size_t hist_start; size_t hist_len; }; void uzlib_lz77_init(struct uzlib_lz77_state *state, uint8_t *hist, size_t hist_max); void uzlib_lz77_compress(struct uzlib_lz77_state *state, const uint8_t *src, unsigned len); /* Checksum API */ /* prev_sum is previous value for incremental computation, 1 initially */ uint32_t uzlib_adler32(const void *data, unsigned int length, uint32_t prev_sum); /* crc is previous value for incremental computation, 0xffffffff initially */ uint32_t uzlib_crc32(const void *data, unsigned int length, uint32_t crc); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* UZLIB_H_INCLUDED */