zstdlib 0.13.0-x86_64-linux

Sign up to get free protection for your applications and to get access to all the features.
Files changed (129) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +6 -0
  3. data/CHANGES.md +107 -0
  4. data/Gemfile +3 -0
  5. data/README.md +107 -0
  6. data/Rakefile +59 -0
  7. data/ext/zstdlib_c/extconf.rb +59 -0
  8. data/ext/zstdlib_c/ruby/zlib-2.2/zstdlib.c +4675 -0
  9. data/ext/zstdlib_c/ruby/zlib-2.3/zstdlib.c +4702 -0
  10. data/ext/zstdlib_c/ruby/zlib-2.4/zstdlib.c +4859 -0
  11. data/ext/zstdlib_c/ruby/zlib-2.5/zstdlib.c +4864 -0
  12. data/ext/zstdlib_c/ruby/zlib-2.6/zstdlib.c +4906 -0
  13. data/ext/zstdlib_c/ruby/zlib-2.7/zstdlib.c +4895 -0
  14. data/ext/zstdlib_c/ruby/zlib-3.0/zstdlib.c +4994 -0
  15. data/ext/zstdlib_c/ruby/zlib-3.1/zstdlib.c +5076 -0
  16. data/ext/zstdlib_c/ruby/zlib-3.2/zstdlib.c +5090 -0
  17. data/ext/zstdlib_c/ruby/zlib-3.3/zstdlib.c +5090 -0
  18. data/ext/zstdlib_c/zlib-1.3.1/adler32.c +164 -0
  19. data/ext/zstdlib_c/zlib-1.3.1/compress.c +75 -0
  20. data/ext/zstdlib_c/zlib-1.3.1/crc32.c +1049 -0
  21. data/ext/zstdlib_c/zlib-1.3.1/crc32.h +9446 -0
  22. data/ext/zstdlib_c/zlib-1.3.1/deflate.c +2139 -0
  23. data/ext/zstdlib_c/zlib-1.3.1/deflate.h +377 -0
  24. data/ext/zstdlib_c/zlib-1.3.1/gzclose.c +23 -0
  25. data/ext/zstdlib_c/zlib-1.3.1/gzguts.h +214 -0
  26. data/ext/zstdlib_c/zlib-1.3.1/gzlib.c +582 -0
  27. data/ext/zstdlib_c/zlib-1.3.1/gzread.c +602 -0
  28. data/ext/zstdlib_c/zlib-1.3.1/gzwrite.c +631 -0
  29. data/ext/zstdlib_c/zlib-1.3.1/infback.c +628 -0
  30. data/ext/zstdlib_c/zlib-1.3.1/inffast.c +320 -0
  31. data/ext/zstdlib_c/zlib-1.3.1/inffast.h +11 -0
  32. data/ext/zstdlib_c/zlib-1.3.1/inffixed.h +94 -0
  33. data/ext/zstdlib_c/zlib-1.3.1/inflate.c +1526 -0
  34. data/ext/zstdlib_c/zlib-1.3.1/inflate.h +126 -0
  35. data/ext/zstdlib_c/zlib-1.3.1/inftrees.c +299 -0
  36. data/ext/zstdlib_c/zlib-1.3.1/inftrees.h +62 -0
  37. data/ext/zstdlib_c/zlib-1.3.1/trees.c +1117 -0
  38. data/ext/zstdlib_c/zlib-1.3.1/trees.h +128 -0
  39. data/ext/zstdlib_c/zlib-1.3.1/uncompr.c +85 -0
  40. data/ext/zstdlib_c/zlib-1.3.1/zconf.h +543 -0
  41. data/ext/zstdlib_c/zlib-1.3.1/zlib.h +1938 -0
  42. data/ext/zstdlib_c/zlib-1.3.1/zutil.c +299 -0
  43. data/ext/zstdlib_c/zlib-1.3.1/zutil.h +254 -0
  44. data/ext/zstdlib_c/zlib.mk +14 -0
  45. data/ext/zstdlib_c/zlibwrapper/zlibwrapper.c +10 -0
  46. data/ext/zstdlib_c/zlibwrapper.mk +14 -0
  47. data/ext/zstdlib_c/zstd-1.5.6/lib/common/allocations.h +55 -0
  48. data/ext/zstdlib_c/zstd-1.5.6/lib/common/bits.h +200 -0
  49. data/ext/zstdlib_c/zstd-1.5.6/lib/common/bitstream.h +457 -0
  50. data/ext/zstdlib_c/zstd-1.5.6/lib/common/compiler.h +450 -0
  51. data/ext/zstdlib_c/zstd-1.5.6/lib/common/cpu.h +249 -0
  52. data/ext/zstdlib_c/zstd-1.5.6/lib/common/debug.c +30 -0
  53. data/ext/zstdlib_c/zstd-1.5.6/lib/common/debug.h +116 -0
  54. data/ext/zstdlib_c/zstd-1.5.6/lib/common/entropy_common.c +340 -0
  55. data/ext/zstdlib_c/zstd-1.5.6/lib/common/error_private.c +63 -0
  56. data/ext/zstdlib_c/zstd-1.5.6/lib/common/error_private.h +168 -0
  57. data/ext/zstdlib_c/zstd-1.5.6/lib/common/fse.h +640 -0
  58. data/ext/zstdlib_c/zstd-1.5.6/lib/common/fse_decompress.c +313 -0
  59. data/ext/zstdlib_c/zstd-1.5.6/lib/common/huf.h +286 -0
  60. data/ext/zstdlib_c/zstd-1.5.6/lib/common/mem.h +426 -0
  61. data/ext/zstdlib_c/zstd-1.5.6/lib/common/pool.c +371 -0
  62. data/ext/zstdlib_c/zstd-1.5.6/lib/common/pool.h +90 -0
  63. data/ext/zstdlib_c/zstd-1.5.6/lib/common/portability_macros.h +158 -0
  64. data/ext/zstdlib_c/zstd-1.5.6/lib/common/threading.c +182 -0
  65. data/ext/zstdlib_c/zstd-1.5.6/lib/common/threading.h +150 -0
  66. data/ext/zstdlib_c/zstd-1.5.6/lib/common/xxhash.c +18 -0
  67. data/ext/zstdlib_c/zstd-1.5.6/lib/common/xxhash.h +7020 -0
  68. data/ext/zstdlib_c/zstd-1.5.6/lib/common/zstd_common.c +48 -0
  69. data/ext/zstdlib_c/zstd-1.5.6/lib/common/zstd_deps.h +111 -0
  70. data/ext/zstdlib_c/zstd-1.5.6/lib/common/zstd_internal.h +392 -0
  71. data/ext/zstdlib_c/zstd-1.5.6/lib/common/zstd_trace.h +163 -0
  72. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/clevels.h +134 -0
  73. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/fse_compress.c +625 -0
  74. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/hist.c +181 -0
  75. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/hist.h +75 -0
  76. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/huf_compress.c +1464 -0
  77. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/zstd_compress.c +7153 -0
  78. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/zstd_compress_internal.h +1534 -0
  79. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/zstd_compress_literals.c +235 -0
  80. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/zstd_compress_literals.h +39 -0
  81. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/zstd_compress_sequences.c +442 -0
  82. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/zstd_compress_sequences.h +54 -0
  83. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/zstd_compress_superblock.c +688 -0
  84. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/zstd_compress_superblock.h +32 -0
  85. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/zstd_cwksp.h +748 -0
  86. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/zstd_double_fast.c +770 -0
  87. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/zstd_double_fast.h +50 -0
  88. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/zstd_fast.c +968 -0
  89. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/zstd_fast.h +38 -0
  90. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/zstd_lazy.c +2199 -0
  91. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/zstd_lazy.h +202 -0
  92. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/zstd_ldm.c +730 -0
  93. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/zstd_ldm.h +117 -0
  94. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/zstd_ldm_geartab.h +106 -0
  95. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/zstd_opt.c +1576 -0
  96. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/zstd_opt.h +80 -0
  97. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/zstdmt_compress.c +1882 -0
  98. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/zstdmt_compress.h +113 -0
  99. data/ext/zstdlib_c/zstd-1.5.6/lib/decompress/huf_decompress.c +1944 -0
  100. data/ext/zstdlib_c/zstd-1.5.6/lib/decompress/huf_decompress_amd64.S +595 -0
  101. data/ext/zstdlib_c/zstd-1.5.6/lib/decompress/zstd_ddict.c +244 -0
  102. data/ext/zstdlib_c/zstd-1.5.6/lib/decompress/zstd_ddict.h +44 -0
  103. data/ext/zstdlib_c/zstd-1.5.6/lib/decompress/zstd_decompress.c +2407 -0
  104. data/ext/zstdlib_c/zstd-1.5.6/lib/decompress/zstd_decompress_block.c +2215 -0
  105. data/ext/zstdlib_c/zstd-1.5.6/lib/decompress/zstd_decompress_block.h +73 -0
  106. data/ext/zstdlib_c/zstd-1.5.6/lib/decompress/zstd_decompress_internal.h +240 -0
  107. data/ext/zstdlib_c/zstd-1.5.6/lib/zdict.h +474 -0
  108. data/ext/zstdlib_c/zstd-1.5.6/lib/zstd.h +3089 -0
  109. data/ext/zstdlib_c/zstd-1.5.6/lib/zstd_errors.h +114 -0
  110. data/ext/zstdlib_c/zstd-1.5.6/zlibWrapper/gzclose.c +26 -0
  111. data/ext/zstdlib_c/zstd-1.5.6/zlibWrapper/gzcompatibility.h +68 -0
  112. data/ext/zstdlib_c/zstd-1.5.6/zlibWrapper/gzguts.h +229 -0
  113. data/ext/zstdlib_c/zstd-1.5.6/zlibWrapper/gzlib.c +587 -0
  114. data/ext/zstdlib_c/zstd-1.5.6/zlibWrapper/gzread.c +637 -0
  115. data/ext/zstdlib_c/zstd-1.5.6/zlibWrapper/gzwrite.c +631 -0
  116. data/ext/zstdlib_c/zstd-1.5.6/zlibWrapper/zstd_zlibwrapper.c +1200 -0
  117. data/ext/zstdlib_c/zstd-1.5.6/zlibWrapper/zstd_zlibwrapper.h +91 -0
  118. data/ext/zstdlib_c/zstd.mk +15 -0
  119. data/lib/2.4/zstdlib_c.so +0 -0
  120. data/lib/2.5/zstdlib_c.so +0 -0
  121. data/lib/2.6/zstdlib_c.so +0 -0
  122. data/lib/2.7/zstdlib_c.so +0 -0
  123. data/lib/3.0/zstdlib_c.so +0 -0
  124. data/lib/3.1/zstdlib_c.so +0 -0
  125. data/lib/3.2/zstdlib_c.so +0 -0
  126. data/lib/3.3/zstdlib_c.so +0 -0
  127. data/lib/zstdlib.rb +6 -0
  128. data/test/zstdlib_test.rb +21 -0
  129. metadata +243 -0
@@ -0,0 +1,628 @@
1
+ /* infback.c -- inflate using a call-back interface
2
+ * Copyright (C) 1995-2022 Mark Adler
3
+ * For conditions of distribution and use, see copyright notice in zlib.h
4
+ */
5
+
6
+ /*
7
+ This code is largely copied from inflate.c. Normally either infback.o or
8
+ inflate.o would be linked into an application--not both. The interface
9
+ with inffast.c is retained so that optimized assembler-coded versions of
10
+ inflate_fast() can be used with either inflate.c or infback.c.
11
+ */
12
+
13
+ #include "zutil.h"
14
+ #include "inftrees.h"
15
+ #include "inflate.h"
16
+ #include "inffast.h"
17
+
18
+ /*
19
+ strm provides memory allocation functions in zalloc and zfree, or
20
+ Z_NULL to use the library memory allocation functions.
21
+
22
+ windowBits is in the range 8..15, and window is a user-supplied
23
+ window and output buffer that is 2**windowBits bytes.
24
+ */
25
+ int ZEXPORT inflateBackInit_(z_streamp strm, int windowBits,
26
+ unsigned char FAR *window, const char *version,
27
+ int stream_size) {
28
+ struct inflate_state FAR *state;
29
+
30
+ if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
31
+ stream_size != (int)(sizeof(z_stream)))
32
+ return Z_VERSION_ERROR;
33
+ if (strm == Z_NULL || window == Z_NULL ||
34
+ windowBits < 8 || windowBits > 15)
35
+ return Z_STREAM_ERROR;
36
+ strm->msg = Z_NULL; /* in case we return an error */
37
+ if (strm->zalloc == (alloc_func)0) {
38
+ #ifdef Z_SOLO
39
+ return Z_STREAM_ERROR;
40
+ #else
41
+ strm->zalloc = zcalloc;
42
+ strm->opaque = (voidpf)0;
43
+ #endif
44
+ }
45
+ if (strm->zfree == (free_func)0)
46
+ #ifdef Z_SOLO
47
+ return Z_STREAM_ERROR;
48
+ #else
49
+ strm->zfree = zcfree;
50
+ #endif
51
+ state = (struct inflate_state FAR *)ZALLOC(strm, 1,
52
+ sizeof(struct inflate_state));
53
+ if (state == Z_NULL) return Z_MEM_ERROR;
54
+ Tracev((stderr, "inflate: allocated\n"));
55
+ strm->state = (struct internal_state FAR *)state;
56
+ state->dmax = 32768U;
57
+ state->wbits = (uInt)windowBits;
58
+ state->wsize = 1U << windowBits;
59
+ state->window = window;
60
+ state->wnext = 0;
61
+ state->whave = 0;
62
+ state->sane = 1;
63
+ return Z_OK;
64
+ }
65
+
66
+ /*
67
+ Return state with length and distance decoding tables and index sizes set to
68
+ fixed code decoding. Normally this returns fixed tables from inffixed.h.
69
+ If BUILDFIXED is defined, then instead this routine builds the tables the
70
+ first time it's called, and returns those tables the first time and
71
+ thereafter. This reduces the size of the code by about 2K bytes, in
72
+ exchange for a little execution time. However, BUILDFIXED should not be
73
+ used for threaded applications, since the rewriting of the tables and virgin
74
+ may not be thread-safe.
75
+ */
76
+ local void fixedtables(struct inflate_state FAR *state) {
77
+ #ifdef BUILDFIXED
78
+ static int virgin = 1;
79
+ static code *lenfix, *distfix;
80
+ static code fixed[544];
81
+
82
+ /* build fixed huffman tables if first call (may not be thread safe) */
83
+ if (virgin) {
84
+ unsigned sym, bits;
85
+ static code *next;
86
+
87
+ /* literal/length table */
88
+ sym = 0;
89
+ while (sym < 144) state->lens[sym++] = 8;
90
+ while (sym < 256) state->lens[sym++] = 9;
91
+ while (sym < 280) state->lens[sym++] = 7;
92
+ while (sym < 288) state->lens[sym++] = 8;
93
+ next = fixed;
94
+ lenfix = next;
95
+ bits = 9;
96
+ inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work);
97
+
98
+ /* distance table */
99
+ sym = 0;
100
+ while (sym < 32) state->lens[sym++] = 5;
101
+ distfix = next;
102
+ bits = 5;
103
+ inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work);
104
+
105
+ /* do this just once */
106
+ virgin = 0;
107
+ }
108
+ #else /* !BUILDFIXED */
109
+ # include "inffixed.h"
110
+ #endif /* BUILDFIXED */
111
+ state->lencode = lenfix;
112
+ state->lenbits = 9;
113
+ state->distcode = distfix;
114
+ state->distbits = 5;
115
+ }
116
+
117
+ /* Macros for inflateBack(): */
118
+
119
+ /* Load returned state from inflate_fast() */
120
+ #define LOAD() \
121
+ do { \
122
+ put = strm->next_out; \
123
+ left = strm->avail_out; \
124
+ next = strm->next_in; \
125
+ have = strm->avail_in; \
126
+ hold = state->hold; \
127
+ bits = state->bits; \
128
+ } while (0)
129
+
130
+ /* Set state from registers for inflate_fast() */
131
+ #define RESTORE() \
132
+ do { \
133
+ strm->next_out = put; \
134
+ strm->avail_out = left; \
135
+ strm->next_in = next; \
136
+ strm->avail_in = have; \
137
+ state->hold = hold; \
138
+ state->bits = bits; \
139
+ } while (0)
140
+
141
+ /* Clear the input bit accumulator */
142
+ #define INITBITS() \
143
+ do { \
144
+ hold = 0; \
145
+ bits = 0; \
146
+ } while (0)
147
+
148
+ /* Assure that some input is available. If input is requested, but denied,
149
+ then return a Z_BUF_ERROR from inflateBack(). */
150
+ #define PULL() \
151
+ do { \
152
+ if (have == 0) { \
153
+ have = in(in_desc, &next); \
154
+ if (have == 0) { \
155
+ next = Z_NULL; \
156
+ ret = Z_BUF_ERROR; \
157
+ goto inf_leave; \
158
+ } \
159
+ } \
160
+ } while (0)
161
+
162
+ /* Get a byte of input into the bit accumulator, or return from inflateBack()
163
+ with an error if there is no input available. */
164
+ #define PULLBYTE() \
165
+ do { \
166
+ PULL(); \
167
+ have--; \
168
+ hold += (unsigned long)(*next++) << bits; \
169
+ bits += 8; \
170
+ } while (0)
171
+
172
+ /* Assure that there are at least n bits in the bit accumulator. If there is
173
+ not enough available input to do that, then return from inflateBack() with
174
+ an error. */
175
+ #define NEEDBITS(n) \
176
+ do { \
177
+ while (bits < (unsigned)(n)) \
178
+ PULLBYTE(); \
179
+ } while (0)
180
+
181
+ /* Return the low n bits of the bit accumulator (n < 16) */
182
+ #define BITS(n) \
183
+ ((unsigned)hold & ((1U << (n)) - 1))
184
+
185
+ /* Remove n bits from the bit accumulator */
186
+ #define DROPBITS(n) \
187
+ do { \
188
+ hold >>= (n); \
189
+ bits -= (unsigned)(n); \
190
+ } while (0)
191
+
192
+ /* Remove zero to seven bits as needed to go to a byte boundary */
193
+ #define BYTEBITS() \
194
+ do { \
195
+ hold >>= bits & 7; \
196
+ bits -= bits & 7; \
197
+ } while (0)
198
+
199
+ /* Assure that some output space is available, by writing out the window
200
+ if it's full. If the write fails, return from inflateBack() with a
201
+ Z_BUF_ERROR. */
202
+ #define ROOM() \
203
+ do { \
204
+ if (left == 0) { \
205
+ put = state->window; \
206
+ left = state->wsize; \
207
+ state->whave = left; \
208
+ if (out(out_desc, put, left)) { \
209
+ ret = Z_BUF_ERROR; \
210
+ goto inf_leave; \
211
+ } \
212
+ } \
213
+ } while (0)
214
+
215
+ /*
216
+ strm provides the memory allocation functions and window buffer on input,
217
+ and provides information on the unused input on return. For Z_DATA_ERROR
218
+ returns, strm will also provide an error message.
219
+
220
+ in() and out() are the call-back input and output functions. When
221
+ inflateBack() needs more input, it calls in(). When inflateBack() has
222
+ filled the window with output, or when it completes with data in the
223
+ window, it calls out() to write out the data. The application must not
224
+ change the provided input until in() is called again or inflateBack()
225
+ returns. The application must not change the window/output buffer until
226
+ inflateBack() returns.
227
+
228
+ in() and out() are called with a descriptor parameter provided in the
229
+ inflateBack() call. This parameter can be a structure that provides the
230
+ information required to do the read or write, as well as accumulated
231
+ information on the input and output such as totals and check values.
232
+
233
+ in() should return zero on failure. out() should return non-zero on
234
+ failure. If either in() or out() fails, than inflateBack() returns a
235
+ Z_BUF_ERROR. strm->next_in can be checked for Z_NULL to see whether it
236
+ was in() or out() that caused in the error. Otherwise, inflateBack()
237
+ returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format
238
+ error, or Z_MEM_ERROR if it could not allocate memory for the state.
239
+ inflateBack() can also return Z_STREAM_ERROR if the input parameters
240
+ are not correct, i.e. strm is Z_NULL or the state was not initialized.
241
+ */
242
+ int ZEXPORT inflateBack(z_streamp strm, in_func in, void FAR *in_desc,
243
+ out_func out, void FAR *out_desc) {
244
+ struct inflate_state FAR *state;
245
+ z_const unsigned char FAR *next; /* next input */
246
+ unsigned char FAR *put; /* next output */
247
+ unsigned have, left; /* available input and output */
248
+ unsigned long hold; /* bit buffer */
249
+ unsigned bits; /* bits in bit buffer */
250
+ unsigned copy; /* number of stored or match bytes to copy */
251
+ unsigned char FAR *from; /* where to copy match bytes from */
252
+ code here; /* current decoding table entry */
253
+ code last; /* parent table entry */
254
+ unsigned len; /* length to copy for repeats, bits to drop */
255
+ int ret; /* return code */
256
+ static const unsigned short order[19] = /* permutation of code lengths */
257
+ {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
258
+
259
+ /* Check that the strm exists and that the state was initialized */
260
+ if (strm == Z_NULL || strm->state == Z_NULL)
261
+ return Z_STREAM_ERROR;
262
+ state = (struct inflate_state FAR *)strm->state;
263
+
264
+ /* Reset the state */
265
+ strm->msg = Z_NULL;
266
+ state->mode = TYPE;
267
+ state->last = 0;
268
+ state->whave = 0;
269
+ next = strm->next_in;
270
+ have = next != Z_NULL ? strm->avail_in : 0;
271
+ hold = 0;
272
+ bits = 0;
273
+ put = state->window;
274
+ left = state->wsize;
275
+
276
+ /* Inflate until end of block marked as last */
277
+ for (;;)
278
+ switch (state->mode) {
279
+ case TYPE:
280
+ /* determine and dispatch block type */
281
+ if (state->last) {
282
+ BYTEBITS();
283
+ state->mode = DONE;
284
+ break;
285
+ }
286
+ NEEDBITS(3);
287
+ state->last = BITS(1);
288
+ DROPBITS(1);
289
+ switch (BITS(2)) {
290
+ case 0: /* stored block */
291
+ Tracev((stderr, "inflate: stored block%s\n",
292
+ state->last ? " (last)" : ""));
293
+ state->mode = STORED;
294
+ break;
295
+ case 1: /* fixed block */
296
+ fixedtables(state);
297
+ Tracev((stderr, "inflate: fixed codes block%s\n",
298
+ state->last ? " (last)" : ""));
299
+ state->mode = LEN; /* decode codes */
300
+ break;
301
+ case 2: /* dynamic block */
302
+ Tracev((stderr, "inflate: dynamic codes block%s\n",
303
+ state->last ? " (last)" : ""));
304
+ state->mode = TABLE;
305
+ break;
306
+ case 3:
307
+ strm->msg = (char *)"invalid block type";
308
+ state->mode = BAD;
309
+ }
310
+ DROPBITS(2);
311
+ break;
312
+
313
+ case STORED:
314
+ /* get and verify stored block length */
315
+ BYTEBITS(); /* go to byte boundary */
316
+ NEEDBITS(32);
317
+ if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {
318
+ strm->msg = (char *)"invalid stored block lengths";
319
+ state->mode = BAD;
320
+ break;
321
+ }
322
+ state->length = (unsigned)hold & 0xffff;
323
+ Tracev((stderr, "inflate: stored length %u\n",
324
+ state->length));
325
+ INITBITS();
326
+
327
+ /* copy stored block from input to output */
328
+ while (state->length != 0) {
329
+ copy = state->length;
330
+ PULL();
331
+ ROOM();
332
+ if (copy > have) copy = have;
333
+ if (copy > left) copy = left;
334
+ zmemcpy(put, next, copy);
335
+ have -= copy;
336
+ next += copy;
337
+ left -= copy;
338
+ put += copy;
339
+ state->length -= copy;
340
+ }
341
+ Tracev((stderr, "inflate: stored end\n"));
342
+ state->mode = TYPE;
343
+ break;
344
+
345
+ case TABLE:
346
+ /* get dynamic table entries descriptor */
347
+ NEEDBITS(14);
348
+ state->nlen = BITS(5) + 257;
349
+ DROPBITS(5);
350
+ state->ndist = BITS(5) + 1;
351
+ DROPBITS(5);
352
+ state->ncode = BITS(4) + 4;
353
+ DROPBITS(4);
354
+ #ifndef PKZIP_BUG_WORKAROUND
355
+ if (state->nlen > 286 || state->ndist > 30) {
356
+ strm->msg = (char *)"too many length or distance symbols";
357
+ state->mode = BAD;
358
+ break;
359
+ }
360
+ #endif
361
+ Tracev((stderr, "inflate: table sizes ok\n"));
362
+
363
+ /* get code length code lengths (not a typo) */
364
+ state->have = 0;
365
+ while (state->have < state->ncode) {
366
+ NEEDBITS(3);
367
+ state->lens[order[state->have++]] = (unsigned short)BITS(3);
368
+ DROPBITS(3);
369
+ }
370
+ while (state->have < 19)
371
+ state->lens[order[state->have++]] = 0;
372
+ state->next = state->codes;
373
+ state->lencode = (code const FAR *)(state->next);
374
+ state->lenbits = 7;
375
+ ret = inflate_table(CODES, state->lens, 19, &(state->next),
376
+ &(state->lenbits), state->work);
377
+ if (ret) {
378
+ strm->msg = (char *)"invalid code lengths set";
379
+ state->mode = BAD;
380
+ break;
381
+ }
382
+ Tracev((stderr, "inflate: code lengths ok\n"));
383
+
384
+ /* get length and distance code code lengths */
385
+ state->have = 0;
386
+ while (state->have < state->nlen + state->ndist) {
387
+ for (;;) {
388
+ here = state->lencode[BITS(state->lenbits)];
389
+ if ((unsigned)(here.bits) <= bits) break;
390
+ PULLBYTE();
391
+ }
392
+ if (here.val < 16) {
393
+ DROPBITS(here.bits);
394
+ state->lens[state->have++] = here.val;
395
+ }
396
+ else {
397
+ if (here.val == 16) {
398
+ NEEDBITS(here.bits + 2);
399
+ DROPBITS(here.bits);
400
+ if (state->have == 0) {
401
+ strm->msg = (char *)"invalid bit length repeat";
402
+ state->mode = BAD;
403
+ break;
404
+ }
405
+ len = (unsigned)(state->lens[state->have - 1]);
406
+ copy = 3 + BITS(2);
407
+ DROPBITS(2);
408
+ }
409
+ else if (here.val == 17) {
410
+ NEEDBITS(here.bits + 3);
411
+ DROPBITS(here.bits);
412
+ len = 0;
413
+ copy = 3 + BITS(3);
414
+ DROPBITS(3);
415
+ }
416
+ else {
417
+ NEEDBITS(here.bits + 7);
418
+ DROPBITS(here.bits);
419
+ len = 0;
420
+ copy = 11 + BITS(7);
421
+ DROPBITS(7);
422
+ }
423
+ if (state->have + copy > state->nlen + state->ndist) {
424
+ strm->msg = (char *)"invalid bit length repeat";
425
+ state->mode = BAD;
426
+ break;
427
+ }
428
+ while (copy--)
429
+ state->lens[state->have++] = (unsigned short)len;
430
+ }
431
+ }
432
+
433
+ /* handle error breaks in while */
434
+ if (state->mode == BAD) break;
435
+
436
+ /* check for end-of-block code (better have one) */
437
+ if (state->lens[256] == 0) {
438
+ strm->msg = (char *)"invalid code -- missing end-of-block";
439
+ state->mode = BAD;
440
+ break;
441
+ }
442
+
443
+ /* build code tables -- note: do not change the lenbits or distbits
444
+ values here (9 and 6) without reading the comments in inftrees.h
445
+ concerning the ENOUGH constants, which depend on those values */
446
+ state->next = state->codes;
447
+ state->lencode = (code const FAR *)(state->next);
448
+ state->lenbits = 9;
449
+ ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
450
+ &(state->lenbits), state->work);
451
+ if (ret) {
452
+ strm->msg = (char *)"invalid literal/lengths set";
453
+ state->mode = BAD;
454
+ break;
455
+ }
456
+ state->distcode = (code const FAR *)(state->next);
457
+ state->distbits = 6;
458
+ ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,
459
+ &(state->next), &(state->distbits), state->work);
460
+ if (ret) {
461
+ strm->msg = (char *)"invalid distances set";
462
+ state->mode = BAD;
463
+ break;
464
+ }
465
+ Tracev((stderr, "inflate: codes ok\n"));
466
+ state->mode = LEN;
467
+ /* fallthrough */
468
+
469
+ case LEN:
470
+ /* use inflate_fast() if we have enough input and output */
471
+ if (have >= 6 && left >= 258) {
472
+ RESTORE();
473
+ if (state->whave < state->wsize)
474
+ state->whave = state->wsize - left;
475
+ inflate_fast(strm, state->wsize);
476
+ LOAD();
477
+ break;
478
+ }
479
+
480
+ /* get a literal, length, or end-of-block code */
481
+ for (;;) {
482
+ here = state->lencode[BITS(state->lenbits)];
483
+ if ((unsigned)(here.bits) <= bits) break;
484
+ PULLBYTE();
485
+ }
486
+ if (here.op && (here.op & 0xf0) == 0) {
487
+ last = here;
488
+ for (;;) {
489
+ here = state->lencode[last.val +
490
+ (BITS(last.bits + last.op) >> last.bits)];
491
+ if ((unsigned)(last.bits + here.bits) <= bits) break;
492
+ PULLBYTE();
493
+ }
494
+ DROPBITS(last.bits);
495
+ }
496
+ DROPBITS(here.bits);
497
+ state->length = (unsigned)here.val;
498
+
499
+ /* process literal */
500
+ if (here.op == 0) {
501
+ Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
502
+ "inflate: literal '%c'\n" :
503
+ "inflate: literal 0x%02x\n", here.val));
504
+ ROOM();
505
+ *put++ = (unsigned char)(state->length);
506
+ left--;
507
+ state->mode = LEN;
508
+ break;
509
+ }
510
+
511
+ /* process end of block */
512
+ if (here.op & 32) {
513
+ Tracevv((stderr, "inflate: end of block\n"));
514
+ state->mode = TYPE;
515
+ break;
516
+ }
517
+
518
+ /* invalid code */
519
+ if (here.op & 64) {
520
+ strm->msg = (char *)"invalid literal/length code";
521
+ state->mode = BAD;
522
+ break;
523
+ }
524
+
525
+ /* length code -- get extra bits, if any */
526
+ state->extra = (unsigned)(here.op) & 15;
527
+ if (state->extra != 0) {
528
+ NEEDBITS(state->extra);
529
+ state->length += BITS(state->extra);
530
+ DROPBITS(state->extra);
531
+ }
532
+ Tracevv((stderr, "inflate: length %u\n", state->length));
533
+
534
+ /* get distance code */
535
+ for (;;) {
536
+ here = state->distcode[BITS(state->distbits)];
537
+ if ((unsigned)(here.bits) <= bits) break;
538
+ PULLBYTE();
539
+ }
540
+ if ((here.op & 0xf0) == 0) {
541
+ last = here;
542
+ for (;;) {
543
+ here = state->distcode[last.val +
544
+ (BITS(last.bits + last.op) >> last.bits)];
545
+ if ((unsigned)(last.bits + here.bits) <= bits) break;
546
+ PULLBYTE();
547
+ }
548
+ DROPBITS(last.bits);
549
+ }
550
+ DROPBITS(here.bits);
551
+ if (here.op & 64) {
552
+ strm->msg = (char *)"invalid distance code";
553
+ state->mode = BAD;
554
+ break;
555
+ }
556
+ state->offset = (unsigned)here.val;
557
+
558
+ /* get distance extra bits, if any */
559
+ state->extra = (unsigned)(here.op) & 15;
560
+ if (state->extra != 0) {
561
+ NEEDBITS(state->extra);
562
+ state->offset += BITS(state->extra);
563
+ DROPBITS(state->extra);
564
+ }
565
+ if (state->offset > state->wsize - (state->whave < state->wsize ?
566
+ left : 0)) {
567
+ strm->msg = (char *)"invalid distance too far back";
568
+ state->mode = BAD;
569
+ break;
570
+ }
571
+ Tracevv((stderr, "inflate: distance %u\n", state->offset));
572
+
573
+ /* copy match from window to output */
574
+ do {
575
+ ROOM();
576
+ copy = state->wsize - state->offset;
577
+ if (copy < left) {
578
+ from = put + copy;
579
+ copy = left - copy;
580
+ }
581
+ else {
582
+ from = put - state->offset;
583
+ copy = left;
584
+ }
585
+ if (copy > state->length) copy = state->length;
586
+ state->length -= copy;
587
+ left -= copy;
588
+ do {
589
+ *put++ = *from++;
590
+ } while (--copy);
591
+ } while (state->length != 0);
592
+ break;
593
+
594
+ case DONE:
595
+ /* inflate stream terminated properly */
596
+ ret = Z_STREAM_END;
597
+ goto inf_leave;
598
+
599
+ case BAD:
600
+ ret = Z_DATA_ERROR;
601
+ goto inf_leave;
602
+
603
+ default:
604
+ /* can't happen, but makes compilers happy */
605
+ ret = Z_STREAM_ERROR;
606
+ goto inf_leave;
607
+ }
608
+
609
+ /* Write leftover output and return unused input */
610
+ inf_leave:
611
+ if (left < state->wsize) {
612
+ if (out(out_desc, state->window, state->wsize - left) &&
613
+ ret == Z_STREAM_END)
614
+ ret = Z_BUF_ERROR;
615
+ }
616
+ strm->next_in = next;
617
+ strm->avail_in = have;
618
+ return ret;
619
+ }
620
+
621
+ int ZEXPORT inflateBackEnd(z_streamp strm) {
622
+ if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0)
623
+ return Z_STREAM_ERROR;
624
+ ZFREE(strm, strm->state);
625
+ strm->state = Z_NULL;
626
+ Tracev((stderr, "inflate: end\n"));
627
+ return Z_OK;
628
+ }