You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
130 lines
3.4 KiB
130 lines
3.4 KiB
/* |
|
* 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-2016 by Paul Sokolovsky |
|
*/ |
|
|
|
#ifndef TINF_H_INCLUDED |
|
#define TINF_H_INCLUDED |
|
|
|
#include <stdlib.h> |
|
#include <stdint.h> |
|
#include <stdbool.h> |
|
|
|
/* calling convention */ |
|
#ifndef TINFCC |
|
#ifdef __WATCOMC__ |
|
#define TINFCC __cdecl |
|
#else |
|
#define TINFCC |
|
#endif |
|
#endif |
|
|
|
#ifdef __cplusplus |
|
extern "C" { |
|
#endif |
|
|
|
/* ok status, more data produced */ |
|
#define TINF_OK 0 |
|
/* end of compressed stream reached */ |
|
#define TINF_DONE 1 |
|
#define TINF_DATA_ERROR (-3) |
|
#define TINF_CHKSUM_ERROR (-4) |
|
#define TINF_DICT_ERROR (-5) |
|
|
|
/* checksum types */ |
|
#define TINF_CHKSUM_NONE 0 |
|
#define TINF_CHKSUM_ADLER 1 |
|
#define TINF_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; |
|
|
|
struct TINF_DATA; |
|
typedef struct TINF_DATA { |
|
/* 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 sourceRemaining fields, |
|
thus allowing for buffered operation. */ |
|
int (*readSource)(struct TINF_DATA *data); |
|
|
|
unsigned int tag; |
|
unsigned int bitcount; |
|
|
|
/* Buffer start */ |
|
unsigned char *destStart; |
|
/* Buffer total size */ |
|
unsigned int destSize; |
|
/* Current pointer in buffer */ |
|
unsigned char *dest; |
|
/* Remaining bytes in buffer */ |
|
unsigned int destRemaining; |
|
|
|
/* 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 */ |
|
} TINF_DATA; |
|
|
|
#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 TINFCC uzlib_get_byte(TINF_DATA *d); |
|
|
|
/* Decompression API */ |
|
|
|
void TINFCC uzlib_init(void); |
|
void TINFCC uzlib_uncompress_init(TINF_DATA *d, void *dict, unsigned int dictLen); |
|
int TINFCC uzlib_uncompress(TINF_DATA *d); |
|
int TINFCC uzlib_uncompress_chksum(TINF_DATA *d); |
|
|
|
int TINFCC uzlib_zlib_parse_header(TINF_DATA *d); |
|
int TINFCC uzlib_gzip_parse_header(TINF_DATA *d); |
|
|
|
/* Compression API */ |
|
|
|
void TINFCC uzlib_compress(void *data, const uint8_t *src, unsigned slen); |
|
|
|
/* Checksum API */ |
|
|
|
/* prev_sum is previous value for incremental computation, 1 initially */ |
|
uint32_t TINFCC uzlib_adler32(const void *data, unsigned int length, uint32_t prev_sum); |
|
/* crc is previous value for incremental computation, 0xffffffff initially */ |
|
uint32_t TINFCC uzlib_crc32(const void *data, unsigned int length, uint32_t crc); |
|
|
|
#ifdef __cplusplus |
|
} /* extern "C" */ |
|
#endif |
|
|
|
#endif /* TINF_H_INCLUDED */
|
|
|