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 |
59 | extern "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 | |
80 | typedef struct { |
81 | unsigned short table[16]; /* table of code length counts */ |
82 | unsigned short trans[288]; /* code -> symbol translation table */ |
83 | } TINF_TREE; |
84 | |
85 | struct 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 | |
132 | unsigned char TINFCC uzlib_get_byte(TINF_DATA *d); |
133 | |
134 | /* Decompression API */ |
135 | |
136 | void TINFCC uzlib_init(void); |
137 | void TINFCC uzlib_uncompress_init(TINF_DATA *d, void *dict, unsigned int dictLen); |
138 | int TINFCC uzlib_uncompress(TINF_DATA *d); |
139 | int TINFCC uzlib_uncompress_chksum(TINF_DATA *d); |
140 | |
141 | int TINFCC (TINF_DATA *d); |
142 | int TINFCC (TINF_DATA *d); |
143 | |
144 | /* Compression API */ |
145 | |
146 | typedef const uint8_t *uzlib_hash_entry_t; |
147 | |
148 | struct 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 | |
156 | void 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 */ |
161 | uint32_t TINFCC uzlib_adler32(const void *data, unsigned int length, uint32_t prev_sum); |
162 | /* crc is previous value for incremental computation, 0xffffffff initially */ |
163 | uint32_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 | |