1/*
2 * uzlib - tiny deflate/inflate library (deflate, gzip, zlib)
3 *
4 * Copyright (c) 2003 by Joergen Ibsen / Jibz
5 * All Rights Reserved
6 * http://www.ibsensoftware.com/
7 *
8 * Copyright (c) 2014-2018 by Paul Sokolovsky
9 *
10 * This software is provided 'as-is', without any express
11 * or implied warranty. In no event will the authors be
12 * held liable for any damages arising from the use of
13 * this software.
14 *
15 * Permission is granted to anyone to use this software
16 * for any purpose, including commercial applications,
17 * and to alter it and redistribute it freely, subject to
18 * the following restrictions:
19 *
20 * 1. The origin of this software must not be
21 * misrepresented; you must not claim that you
22 * wrote the original software. If you use this
23 * software in a product, an acknowledgment in
24 * the product documentation would be appreciated
25 * but is not required.
26 *
27 * 2. Altered source versions must be plainly marked
28 * as such, and must not be misrepresented as
29 * being the original software.
30 *
31 * 3. This notice may not be removed or altered from
32 * any source distribution.
33 */
34
35#ifndef UZLIB_H_INCLUDED
36#define UZLIB_H_INCLUDED
37
38#include <stdlib.h>
39#include <stdint.h>
40#include <stdbool.h>
41
42#include "defl_static.h"
43
44#include "uzlib_conf.h"
45#if UZLIB_CONF_DEBUG_LOG
46#include <stdio.h>
47#endif
48
49/* calling convention */
50#ifndef TINFCC
51 #ifdef __WATCOMC__
52 #define TINFCC __cdecl
53 #else
54 #define TINFCC
55 #endif
56#endif
57
58#ifdef __cplusplus
59extern "C" {
60#endif
61
62/* ok status, more data produced */
63#define TINF_OK 0
64/* end of compressed stream reached */
65#define TINF_DONE 1
66#define TINF_DATA_ERROR (-3)
67#define TINF_CHKSUM_ERROR (-4)
68#define TINF_DICT_ERROR (-5)
69
70/* checksum types */
71#define TINF_CHKSUM_NONE 0
72#define TINF_CHKSUM_ADLER 1
73#define TINF_CHKSUM_CRC 2
74
75/* helper macros */
76#define TINF_ARRAY_SIZE(arr) (sizeof(arr) / sizeof(*(arr)))
77
78/* data structures */
79
80typedef struct {
81 unsigned short table[16]; /* table of code length counts */
82 unsigned short trans[288]; /* code -> symbol translation table */
83} TINF_TREE;
84
85struct uzlib_uncomp {
86 /* Pointer to the next byte in the input buffer */
87 const unsigned char *source;
88 /* Pointer to the next byte past the input buffer (source_limit = source + len) */
89 const unsigned char *source_limit;
90 /* If source_limit == NULL, or source >= source_limit, this function
91 will be used to read next byte from source stream. The function may
92 also return -1 in case of EOF (or irrecoverable error). Note that
93 besides returning the next byte, it may also update source and
94 source_limit fields, thus allowing for buffered operation. */
95 int (*source_read_cb)(struct uzlib_uncomp *uncomp);
96
97 unsigned int tag;
98 unsigned int bitcount;
99
100 /* Destination (output) buffer start */
101 unsigned char *dest_start;
102 /* Current pointer in dest buffer */
103 unsigned char *dest;
104 /* Pointer past the end of the dest buffer, similar to source_limit */
105 unsigned char *dest_limit;
106
107 /* Accumulating checksum */
108 unsigned int checksum;
109 char checksum_type;
110 bool eof;
111
112 int btype;
113 int bfinal;
114 unsigned int curlen;
115 int lzOff;
116 unsigned char *dict_ring;
117 unsigned int dict_size;
118 unsigned int dict_idx;
119
120 TINF_TREE ltree; /* dynamic length/symbol tree */
121 TINF_TREE dtree; /* dynamic distance tree */
122};
123
124#include "tinf_compat.h"
125
126#define TINF_PUT(d, c) \
127 { \
128 *d->dest++ = c; \
129 if (d->dict_ring) { d->dict_ring[d->dict_idx++] = c; if (d->dict_idx == d->dict_size) d->dict_idx = 0; } \
130 }
131
132unsigned char TINFCC uzlib_get_byte(TINF_DATA *d);
133
134/* Decompression API */
135
136void TINFCC uzlib_init(void);
137void TINFCC uzlib_uncompress_init(TINF_DATA *d, void *dict, unsigned int dictLen);
138int TINFCC uzlib_uncompress(TINF_DATA *d);
139int TINFCC uzlib_uncompress_chksum(TINF_DATA *d);
140
141int TINFCC uzlib_zlib_parse_header(TINF_DATA *d);
142int TINFCC uzlib_gzip_parse_header(TINF_DATA *d);
143
144/* Compression API */
145
146typedef const uint8_t *uzlib_hash_entry_t;
147
148struct uzlib_comp {
149 struct Outbuf out;
150
151 uzlib_hash_entry_t *hash_table;
152 unsigned int hash_bits;
153 unsigned int dict_size;
154};
155
156void TINFCC uzlib_compress(struct uzlib_comp *c, const uint8_t *src, unsigned slen);
157
158/* Checksum API */
159
160/* prev_sum is previous value for incremental computation, 1 initially */
161uint32_t TINFCC uzlib_adler32(const void *data, unsigned int length, uint32_t prev_sum);
162/* crc is previous value for incremental computation, 0xffffffff initially */
163uint32_t TINFCC uzlib_crc32(const void *data, unsigned int length, uint32_t crc);
164
165#ifdef __cplusplus
166} /* extern "C" */
167#endif
168
169#endif /* UZLIB_H_INCLUDED */
170