/rust/registry/src/index.crates.io-1949cf8c6b5b557f/bzip2-sys-0.1.13+1.0.8/bzip2-1.0.8/decompress.c
Line | Count | Source |
1 | | |
2 | | /*-------------------------------------------------------------*/ |
3 | | /*--- Decompression machinery ---*/ |
4 | | /*--- decompress.c ---*/ |
5 | | /*-------------------------------------------------------------*/ |
6 | | |
7 | | /* ------------------------------------------------------------------ |
8 | | This file is part of bzip2/libbzip2, a program and library for |
9 | | lossless, block-sorting data compression. |
10 | | |
11 | | bzip2/libbzip2 version 1.0.8 of 13 July 2019 |
12 | | Copyright (C) 1996-2019 Julian Seward <jseward@acm.org> |
13 | | |
14 | | Please read the WARNING, DISCLAIMER and PATENTS sections in the |
15 | | README file. |
16 | | |
17 | | This program is released under the terms of the license contained |
18 | | in the file LICENSE. |
19 | | ------------------------------------------------------------------ */ |
20 | | |
21 | | |
22 | | #include "bzlib_private.h" |
23 | | |
24 | | |
25 | | /*---------------------------------------------------*/ |
26 | | static |
27 | | void makeMaps_d ( DState* s ) |
28 | 1.31k | { |
29 | 1.31k | Int32 i; |
30 | 1.31k | s->nInUse = 0; |
31 | 338k | for (i = 0; i < 256; i++) |
32 | 336k | if (s->inUse[i]) { |
33 | 31.7k | s->seqToUnseq[s->nInUse] = i; |
34 | 31.7k | s->nInUse++; |
35 | 31.7k | } |
36 | 1.31k | } |
37 | | |
38 | | |
39 | | /*---------------------------------------------------*/ |
40 | | #define RETURN(rrr) \ |
41 | 10.2M | { retVal = rrr; goto save_state_and_return; }; |
42 | | |
43 | | #define GET_BITS(lll,vvv,nnn) \ |
44 | 6.69M | case lll: s->state = lll; \ |
45 | 7.86M | while (True) { \ |
46 | 7.86M | if (s->bsLive >= nnn) { \ |
47 | 6.69M | UInt32 v; \ |
48 | 6.69M | v = (s->bsBuff >> \ |
49 | 6.69M | (s->bsLive-nnn)) & ((1 << nnn)-1); \ |
50 | 6.69M | s->bsLive -= nnn; \ |
51 | 6.69M | vvv = v; \ |
52 | 6.69M | break; \ |
53 | 6.69M | } \ |
54 | 7.86M | if (s->strm->avail_in == 0) RETURN(BZ_OK); \ |
55 | 1.17M | s->bsBuff \ |
56 | 1.17M | = (s->bsBuff << 8) | \ |
57 | 1.17M | ((UInt32) \ |
58 | 1.17M | (*((UChar*)(s->strm->next_in)))); \ |
59 | 1.17M | s->bsLive += 8; \ |
60 | 1.17M | s->strm->next_in++; \ |
61 | 1.17M | s->strm->avail_in--; \ |
62 | 1.17M | s->strm->total_in_lo32++; \ |
63 | 1.17M | if (s->strm->total_in_lo32 == 0) \ |
64 | 1.17M | s->strm->total_in_hi32++; \ |
65 | 1.17M | } |
66 | | |
67 | | #define GET_UCHAR(lll,uuu) \ |
68 | 32.7k | GET_BITS(lll,uuu,8) |
69 | | |
70 | | #define GET_BIT(lll,uuu) \ |
71 | 5.85M | GET_BITS(lll,uuu,1) |
72 | | |
73 | | /*---------------------------------------------------*/ |
74 | 791k | #define GET_MTF_VAL(label1,label2,lval) \ |
75 | 791k | { \ |
76 | 791k | if (groupPos == 0) { \ |
77 | 16.4k | groupNo++; \ |
78 | 16.4k | if (groupNo >= nSelectors) \ |
79 | 16.4k | RETURN(BZ_DATA_ERROR); \ |
80 | 16.4k | groupPos = BZ_G_SIZE; \ |
81 | 16.4k | gSel = s->selector[groupNo]; \ |
82 | 16.4k | gMinlen = s->minLens[gSel]; \ |
83 | 16.4k | gLimit = &(s->limit[gSel][0]); \ |
84 | 16.4k | gPerm = &(s->perm[gSel][0]); \ |
85 | 16.4k | gBase = &(s->base[gSel][0]); \ |
86 | 16.4k | } \ |
87 | 791k | groupPos--; \ |
88 | 791k | zn = gMinlen; \ |
89 | 791k | GET_BITS(label1, zvec, zn); \ |
90 | 1.21M | while (1) { \ |
91 | 1.21M | if (zn > 20 /* the longest code */) \ |
92 | 1.21M | RETURN(BZ_DATA_ERROR); \ |
93 | 1.21M | if (zvec <= gLimit[zn]) break; \ |
94 | 1.21M | zn++; \ |
95 | 422k | GET_BIT(label2, zj); \ |
96 | 422k | zvec = (zvec << 1) | zj; \ |
97 | 791k | }; \ |
98 | 791k | if (zvec - gBase[zn] < 0 \ |
99 | 791k | || zvec - gBase[zn] >= BZ_MAX_ALPHA_SIZE) \ |
100 | 791k | RETURN(BZ_DATA_ERROR); \ |
101 | 791k | lval = gPerm[zvec - gBase[zn]]; \ |
102 | 791k | } |
103 | | |
104 | | |
105 | | /*---------------------------------------------------*/ |
106 | | Int32 BZ2_decompress ( DState* s ) |
107 | 3.75k | { |
108 | 3.75k | UChar uc; |
109 | 3.75k | Int32 retVal; |
110 | 3.75k | Int32 minLen, maxLen; |
111 | 3.75k | bz_stream* strm = s->strm; |
112 | | |
113 | | /* stuff that needs to be saved/restored */ |
114 | 3.75k | Int32 i; |
115 | 3.75k | Int32 j; |
116 | 3.75k | Int32 t; |
117 | 3.75k | Int32 alphaSize; |
118 | 3.75k | Int32 nGroups; |
119 | 3.75k | Int32 nSelectors; |
120 | 3.75k | Int32 EOB; |
121 | 3.75k | Int32 groupNo; |
122 | 3.75k | Int32 groupPos; |
123 | 3.75k | Int32 nextSym; |
124 | 3.75k | Int32 nblockMAX; |
125 | 3.75k | Int32 nblock; |
126 | 3.75k | Int32 es; |
127 | 3.75k | Int32 N; |
128 | 3.75k | Int32 curr; |
129 | 3.75k | Int32 zt; |
130 | 3.75k | Int32 zn; |
131 | 3.75k | Int32 zvec; |
132 | 3.75k | Int32 zj; |
133 | 3.75k | Int32 gSel; |
134 | 3.75k | Int32 gMinlen; |
135 | 3.75k | Int32* gLimit; |
136 | 3.75k | Int32* gBase; |
137 | 3.75k | Int32* gPerm; |
138 | | |
139 | 3.75k | if (s->state == BZ_X_MAGIC_1) { |
140 | | /*initialise the save area*/ |
141 | 2.61k | s->save_i = 0; |
142 | 2.61k | s->save_j = 0; |
143 | 2.61k | s->save_t = 0; |
144 | 2.61k | s->save_alphaSize = 0; |
145 | 2.61k | s->save_nGroups = 0; |
146 | 2.61k | s->save_nSelectors = 0; |
147 | 2.61k | s->save_EOB = 0; |
148 | 2.61k | s->save_groupNo = 0; |
149 | 2.61k | s->save_groupPos = 0; |
150 | 2.61k | s->save_nextSym = 0; |
151 | 2.61k | s->save_nblockMAX = 0; |
152 | 2.61k | s->save_nblock = 0; |
153 | 2.61k | s->save_es = 0; |
154 | 2.61k | s->save_N = 0; |
155 | 2.61k | s->save_curr = 0; |
156 | 2.61k | s->save_zt = 0; |
157 | 2.61k | s->save_zn = 0; |
158 | 2.61k | s->save_zvec = 0; |
159 | 2.61k | s->save_zj = 0; |
160 | 2.61k | s->save_gSel = 0; |
161 | 2.61k | s->save_gMinlen = 0; |
162 | 2.61k | s->save_gLimit = NULL; |
163 | 2.61k | s->save_gBase = NULL; |
164 | 2.61k | s->save_gPerm = NULL; |
165 | 2.61k | } |
166 | | |
167 | | /*restore from the save area*/ |
168 | 3.75k | i = s->save_i; |
169 | 3.75k | j = s->save_j; |
170 | 3.75k | t = s->save_t; |
171 | 3.75k | alphaSize = s->save_alphaSize; |
172 | 3.75k | nGroups = s->save_nGroups; |
173 | 3.75k | nSelectors = s->save_nSelectors; |
174 | 3.75k | EOB = s->save_EOB; |
175 | 3.75k | groupNo = s->save_groupNo; |
176 | 3.75k | groupPos = s->save_groupPos; |
177 | 3.75k | nextSym = s->save_nextSym; |
178 | 3.75k | nblockMAX = s->save_nblockMAX; |
179 | 3.75k | nblock = s->save_nblock; |
180 | 3.75k | es = s->save_es; |
181 | 3.75k | N = s->save_N; |
182 | 3.75k | curr = s->save_curr; |
183 | 3.75k | zt = s->save_zt; |
184 | 3.75k | zn = s->save_zn; |
185 | 3.75k | zvec = s->save_zvec; |
186 | 3.75k | zj = s->save_zj; |
187 | 3.75k | gSel = s->save_gSel; |
188 | 3.75k | gMinlen = s->save_gMinlen; |
189 | 3.75k | gLimit = s->save_gLimit; |
190 | 3.75k | gBase = s->save_gBase; |
191 | 3.75k | gPerm = s->save_gPerm; |
192 | | |
193 | 3.75k | retVal = BZ_OK; |
194 | | |
195 | 3.75k | switch (s->state) { |
196 | | |
197 | 2.61k | GET_UCHAR(BZ_X_MAGIC_1, uc); |
198 | 2.60k | if (uc != BZ_HDR_B) RETURN(BZ_DATA_ERROR_MAGIC); |
199 | | |
200 | 1.31k | GET_UCHAR(BZ_X_MAGIC_2, uc); |
201 | 1.31k | if (uc != BZ_HDR_Z) RETURN(BZ_DATA_ERROR_MAGIC); |
202 | | |
203 | 1.31k | GET_UCHAR(BZ_X_MAGIC_3, uc) |
204 | 1.31k | if (uc != BZ_HDR_h) RETURN(BZ_DATA_ERROR_MAGIC); |
205 | | |
206 | 1.31k | GET_BITS(BZ_X_MAGIC_4, s->blockSize100k, 8) |
207 | 1.31k | if (s->blockSize100k < (BZ_HDR_0 + 1) || |
208 | 1.31k | s->blockSize100k > (BZ_HDR_0 + 9)) RETURN(BZ_DATA_ERROR_MAGIC); |
209 | 1.31k | s->blockSize100k -= BZ_HDR_0; |
210 | | |
211 | 1.31k | if (s->smallDecompress) { |
212 | 0 | s->ll16 = BZALLOC( s->blockSize100k * 100000 * sizeof(UInt16) ); |
213 | 0 | s->ll4 = BZALLOC( |
214 | 0 | ((1 + s->blockSize100k * 100000) >> 1) * sizeof(UChar) |
215 | 0 | ); |
216 | 0 | if (s->ll16 == NULL || s->ll4 == NULL) RETURN(BZ_MEM_ERROR); |
217 | 1.31k | } else { |
218 | 1.31k | s->tt = BZALLOC( s->blockSize100k * 100000 * sizeof(Int32) ); |
219 | 1.31k | if (s->tt == NULL) RETURN(BZ_MEM_ERROR); |
220 | 1.31k | } |
221 | | |
222 | 2.36k | GET_UCHAR(BZ_X_BLKHDR_1, uc); |
223 | | |
224 | 2.36k | if (uc == 0x17) goto endhdr_2; |
225 | 1.31k | if (uc != 0x31) RETURN(BZ_DATA_ERROR); |
226 | 1.31k | GET_UCHAR(BZ_X_BLKHDR_2, uc); |
227 | 1.31k | if (uc != 0x41) RETURN(BZ_DATA_ERROR); |
228 | 1.31k | GET_UCHAR(BZ_X_BLKHDR_3, uc); |
229 | 1.31k | if (uc != 0x59) RETURN(BZ_DATA_ERROR); |
230 | 1.31k | GET_UCHAR(BZ_X_BLKHDR_4, uc); |
231 | 1.31k | if (uc != 0x26) RETURN(BZ_DATA_ERROR); |
232 | 1.31k | GET_UCHAR(BZ_X_BLKHDR_5, uc); |
233 | 1.31k | if (uc != 0x53) RETURN(BZ_DATA_ERROR); |
234 | 1.31k | GET_UCHAR(BZ_X_BLKHDR_6, uc); |
235 | 1.31k | if (uc != 0x59) RETURN(BZ_DATA_ERROR); |
236 | | |
237 | 1.31k | s->currBlockNo++; |
238 | 1.31k | if (s->verbosity >= 2) |
239 | 0 | VPrintf1 ( "\n [%d: huff+mtf ", s->currBlockNo ); |
240 | | |
241 | 1.31k | s->storedBlockCRC = 0; |
242 | 1.31k | GET_UCHAR(BZ_X_BCRC_1, uc); |
243 | 1.31k | s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); |
244 | 1.31k | GET_UCHAR(BZ_X_BCRC_2, uc); |
245 | 1.31k | s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); |
246 | 1.31k | GET_UCHAR(BZ_X_BCRC_3, uc); |
247 | 1.31k | s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); |
248 | 1.31k | GET_UCHAR(BZ_X_BCRC_4, uc); |
249 | 1.31k | s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); |
250 | | |
251 | 1.31k | GET_BITS(BZ_X_RANDBIT, s->blockRandomised, 1); |
252 | | |
253 | 1.31k | s->origPtr = 0; |
254 | 1.31k | GET_UCHAR(BZ_X_ORIGPTR_1, uc); |
255 | 1.31k | s->origPtr = (s->origPtr << 8) | ((Int32)uc); |
256 | 1.31k | GET_UCHAR(BZ_X_ORIGPTR_2, uc); |
257 | 1.31k | s->origPtr = (s->origPtr << 8) | ((Int32)uc); |
258 | 1.31k | GET_UCHAR(BZ_X_ORIGPTR_3, uc); |
259 | 1.31k | s->origPtr = (s->origPtr << 8) | ((Int32)uc); |
260 | | |
261 | 1.31k | if (s->origPtr < 0) |
262 | 1.31k | RETURN(BZ_DATA_ERROR); |
263 | 1.31k | if (s->origPtr > 10 + 100000*s->blockSize100k) |
264 | 1.31k | RETURN(BZ_DATA_ERROR); |
265 | | |
266 | | /*--- Receive the mapping table ---*/ |
267 | 22.3k | for (i = 0; i < 16; i++) { |
268 | 21.0k | GET_BIT(BZ_X_MAPPING_1, uc); |
269 | 21.0k | if (uc == 1) |
270 | 8.84k | s->inUse16[i] = True; else |
271 | 12.2k | s->inUse16[i] = False; |
272 | 21.0k | } |
273 | | |
274 | 338k | for (i = 0; i < 256; i++) s->inUse[i] = False; |
275 | | |
276 | 22.3k | for (i = 0; i < 16; i++) |
277 | 21.0k | if (s->inUse16[i]) |
278 | 150k | for (j = 0; j < 16; j++) { |
279 | 141k | GET_BIT(BZ_X_MAPPING_2, uc); |
280 | 141k | if (uc == 1) s->inUse[i * 16 + j] = True; |
281 | 141k | } |
282 | 1.31k | makeMaps_d ( s ); |
283 | 1.31k | if (s->nInUse == 0) RETURN(BZ_DATA_ERROR); |
284 | 1.31k | alphaSize = s->nInUse+2; |
285 | | |
286 | | /*--- Now the selectors ---*/ |
287 | 1.31k | GET_BITS(BZ_X_SELECTOR_1, nGroups, 3); |
288 | 1.31k | if (nGroups < 2 || nGroups > BZ_N_GROUPS) RETURN(BZ_DATA_ERROR); |
289 | 1.31k | GET_BITS(BZ_X_SELECTOR_2, nSelectors, 15); |
290 | 1.31k | if (nSelectors < 1) RETURN(BZ_DATA_ERROR); |
291 | 4.57M | for (i = 0; i < nSelectors; i++) { |
292 | 4.56M | j = 0; |
293 | 5.14M | while (True) { |
294 | 5.14M | GET_BIT(BZ_X_SELECTOR_3, uc); |
295 | 5.14M | if (uc == 0) break; |
296 | 579k | j++; |
297 | 579k | if (j >= nGroups) RETURN(BZ_DATA_ERROR); |
298 | 579k | } |
299 | | /* Having more than BZ_MAX_SELECTORS doesn't make much sense |
300 | | since they will never be used, but some implementations might |
301 | | "round up" the number of selectors, so just ignore those. */ |
302 | 4.56M | if (i < BZ_MAX_SELECTORS) |
303 | 3.59M | s->selectorMtf[i] = j; |
304 | 4.56M | } |
305 | 1.30k | if (nSelectors > BZ_MAX_SELECTORS) |
306 | 190 | nSelectors = BZ_MAX_SELECTORS; |
307 | | |
308 | | /*--- Undo the MTF values for the selectors. ---*/ |
309 | 1.30k | { |
310 | 1.30k | UChar pos[BZ_N_GROUPS], tmp, v; |
311 | 5.02k | for (v = 0; v < nGroups; v++) pos[v] = v; |
312 | | |
313 | 3.57M | for (i = 0; i < nSelectors; i++) { |
314 | 3.57M | v = s->selectorMtf[i]; |
315 | 3.57M | tmp = pos[v]; |
316 | 4.03M | while (v > 0) { pos[v] = pos[v-1]; v--; } |
317 | 3.57M | pos[0] = tmp; |
318 | 3.57M | s->selector[i] = tmp; |
319 | 3.57M | } |
320 | 1.30k | } |
321 | | |
322 | | /*--- Now the coding tables ---*/ |
323 | 3.85k | for (t = 0; t < nGroups; t++) { |
324 | 2.74k | GET_BITS(BZ_X_CODING_1, curr, 5); |
325 | 66.2k | for (i = 0; i < alphaSize; i++) { |
326 | 94.0k | while (True) { |
327 | 94.0k | if (curr < 1 || curr > 20) RETURN(BZ_DATA_ERROR); |
328 | 93.9k | GET_BIT(BZ_X_CODING_2, uc); |
329 | 93.8k | if (uc == 0) break; |
330 | 30.3k | GET_BIT(BZ_X_CODING_3, uc); |
331 | 30.3k | if (uc == 0) curr++; else curr--; |
332 | 30.3k | } |
333 | 63.5k | s->len[t][i] = curr; |
334 | 63.5k | } |
335 | 2.74k | } |
336 | | |
337 | | /*--- Create the Huffman decoding tables ---*/ |
338 | 3.65k | for (t = 0; t < nGroups; t++) { |
339 | 2.54k | minLen = 32; |
340 | 2.54k | maxLen = 0; |
341 | 65.2k | for (i = 0; i < alphaSize; i++) { |
342 | 62.7k | if (s->len[t][i] > maxLen) maxLen = s->len[t][i]; |
343 | 62.7k | if (s->len[t][i] < minLen) minLen = s->len[t][i]; |
344 | 62.7k | } |
345 | 2.54k | BZ2_hbCreateDecodeTables ( |
346 | 2.54k | &(s->limit[t][0]), |
347 | 2.54k | &(s->base[t][0]), |
348 | 2.54k | &(s->perm[t][0]), |
349 | 2.54k | &(s->len[t][0]), |
350 | 2.54k | minLen, maxLen, alphaSize |
351 | 2.54k | ); |
352 | 2.54k | s->minLens[t] = minLen; |
353 | 2.54k | } |
354 | | |
355 | | /*--- Now the MTF values ---*/ |
356 | | |
357 | 1.11k | EOB = s->nInUse+1; |
358 | 1.11k | nblockMAX = 100000 * s->blockSize100k; |
359 | 1.11k | groupNo = -1; |
360 | 1.11k | groupPos = 0; |
361 | | |
362 | 285k | for (i = 0; i <= 255; i++) s->unzftab[i] = 0; |
363 | | |
364 | | /*-- MTF init --*/ |
365 | 1.11k | { |
366 | 1.11k | Int32 ii, jj, kk; |
367 | 1.11k | kk = MTFA_SIZE-1; |
368 | 18.8k | for (ii = 256 / MTFL_SIZE - 1; ii >= 0; ii--) { |
369 | 302k | for (jj = MTFL_SIZE-1; jj >= 0; jj--) { |
370 | 284k | s->mtfa[kk] = (UChar)(ii * MTFL_SIZE + jj); |
371 | 284k | kk--; |
372 | 284k | } |
373 | 17.7k | s->mtfbase[ii] = kk + 1; |
374 | 17.7k | } |
375 | 1.11k | } |
376 | | /*-- end MTF init --*/ |
377 | | |
378 | 1.11k | nblock = 0; |
379 | 5.55k | GET_MTF_VAL(BZ_X_MTF_1, BZ_X_MTF_2, nextSym); |
380 | | |
381 | 729k | while (True) { |
382 | | |
383 | 729k | if (nextSym == EOB) break; |
384 | | |
385 | 728k | if (nextSym == BZ_RUNA || nextSym == BZ_RUNB) { |
386 | | |
387 | 42.6k | es = -1; |
388 | 42.6k | N = 1; |
389 | 104k | do { |
390 | | /* Check that N doesn't get too big, so that es doesn't |
391 | | go negative. The maximum value that can be |
392 | | RUNA/RUNB encoded is equal to the block size (post |
393 | | the initial RLE), viz, 900k, so bounding N at 2 |
394 | | million should guard against overflow without |
395 | | rejecting any legitimate inputs. */ |
396 | 104k | if (N >= 2*1024*1024) RETURN(BZ_DATA_ERROR); |
397 | 104k | if (nextSym == BZ_RUNA) es = es + (0+1) * N; else |
398 | 29.0k | if (nextSym == BZ_RUNB) es = es + (1+1) * N; |
399 | 104k | N = N * 2; |
400 | 523k | GET_MTF_VAL(BZ_X_MTF_3, BZ_X_MTF_4, nextSym); |
401 | 523k | } |
402 | 104k | while (nextSym == BZ_RUNA || nextSym == BZ_RUNB); |
403 | | |
404 | 42.6k | es++; |
405 | 42.6k | uc = s->seqToUnseq[ s->mtfa[s->mtfbase[0]] ]; |
406 | 42.6k | s->unzftab[uc] += es; |
407 | | |
408 | 42.6k | if (s->smallDecompress) |
409 | 0 | while (es > 0) { |
410 | 0 | if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR); |
411 | 0 | s->ll16[nblock] = (UInt16)uc; |
412 | 0 | nblock++; |
413 | 0 | es--; |
414 | 0 | } |
415 | 42.6k | else |
416 | 5.31M | while (es > 0) { |
417 | 5.26M | if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR); |
418 | 5.26M | s->tt[nblock] = (UInt32)uc; |
419 | 5.26M | nblock++; |
420 | 5.26M | es--; |
421 | 5.26M | }; |
422 | | |
423 | 42.6k | continue; |
424 | | |
425 | 685k | } else { |
426 | | |
427 | 685k | if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR); |
428 | | |
429 | | /*-- uc = MTF ( nextSym-1 ) --*/ |
430 | 685k | { |
431 | 685k | Int32 ii, jj, kk, pp, lno, off; |
432 | 685k | UInt32 nn; |
433 | 685k | nn = (UInt32)(nextSym - 1); |
434 | | |
435 | 685k | if (nn < MTFL_SIZE) { |
436 | | /* avoid general-case expense */ |
437 | 186k | pp = s->mtfbase[0]; |
438 | 186k | uc = s->mtfa[pp+nn]; |
439 | 484k | while (nn > 3) { |
440 | 297k | Int32 z = pp+nn; |
441 | 297k | s->mtfa[(z) ] = s->mtfa[(z)-1]; |
442 | 297k | s->mtfa[(z)-1] = s->mtfa[(z)-2]; |
443 | 297k | s->mtfa[(z)-2] = s->mtfa[(z)-3]; |
444 | 297k | s->mtfa[(z)-3] = s->mtfa[(z)-4]; |
445 | 297k | nn -= 4; |
446 | 297k | } |
447 | 482k | while (nn > 0) { |
448 | 296k | s->mtfa[(pp+nn)] = s->mtfa[(pp+nn)-1]; nn--; |
449 | 296k | }; |
450 | 186k | s->mtfa[pp] = uc; |
451 | 499k | } else { |
452 | | /* general case */ |
453 | 499k | lno = nn / MTFL_SIZE; |
454 | 499k | off = nn % MTFL_SIZE; |
455 | 499k | pp = s->mtfbase[lno] + off; |
456 | 499k | uc = s->mtfa[pp]; |
457 | 3.68M | while (pp > s->mtfbase[lno]) { |
458 | 3.18M | s->mtfa[pp] = s->mtfa[pp-1]; pp--; |
459 | 3.18M | }; |
460 | 499k | s->mtfbase[lno]++; |
461 | 1.32M | while (lno > 0) { |
462 | 828k | s->mtfbase[lno]--; |
463 | 828k | s->mtfa[s->mtfbase[lno]] |
464 | 828k | = s->mtfa[s->mtfbase[lno-1] + MTFL_SIZE - 1]; |
465 | 828k | lno--; |
466 | 828k | } |
467 | 499k | s->mtfbase[0]--; |
468 | 499k | s->mtfa[s->mtfbase[0]] = uc; |
469 | 499k | if (s->mtfbase[0] == 0) { |
470 | 113 | kk = MTFA_SIZE-1; |
471 | 1.92k | for (ii = 256 / MTFL_SIZE-1; ii >= 0; ii--) { |
472 | 30.7k | for (jj = MTFL_SIZE-1; jj >= 0; jj--) { |
473 | 28.9k | s->mtfa[kk] = s->mtfa[s->mtfbase[ii] + jj]; |
474 | 28.9k | kk--; |
475 | 28.9k | } |
476 | 1.80k | s->mtfbase[ii] = kk + 1; |
477 | 1.80k | } |
478 | 113 | } |
479 | 499k | } |
480 | 685k | } |
481 | | /*-- end uc = MTF ( nextSym-1 ) --*/ |
482 | | |
483 | 685k | s->unzftab[s->seqToUnseq[uc]]++; |
484 | 685k | if (s->smallDecompress) |
485 | 0 | s->ll16[nblock] = (UInt16)(s->seqToUnseq[uc]); else |
486 | 685k | s->tt[nblock] = (UInt32)(s->seqToUnseq[uc]); |
487 | 685k | nblock++; |
488 | | |
489 | 685k | GET_MTF_VAL(BZ_X_MTF_5, BZ_X_MTF_6, nextSym); |
490 | 685k | continue; |
491 | 2.74M | } |
492 | 728k | } |
493 | | |
494 | | /* Now we know what nblock is, we can do a better sanity |
495 | | check on s->origPtr. |
496 | | */ |
497 | 1.07k | if (s->origPtr < 0 || s->origPtr >= nblock) |
498 | 1.07k | RETURN(BZ_DATA_ERROR); |
499 | | |
500 | | /*-- Set up cftab to facilitate generation of T^(-1) --*/ |
501 | | /* Check: unzftab entries in range. */ |
502 | 275k | for (i = 0; i <= 255; i++) { |
503 | 274k | if (s->unzftab[i] < 0 || s->unzftab[i] > nblock) |
504 | 274k | RETURN(BZ_DATA_ERROR); |
505 | 274k | } |
506 | | /* Actually generate cftab. */ |
507 | 1.07k | s->cftab[0] = 0; |
508 | 275k | for (i = 1; i <= 256; i++) s->cftab[i] = s->unzftab[i-1]; |
509 | 275k | for (i = 1; i <= 256; i++) s->cftab[i] += s->cftab[i-1]; |
510 | | /* Check: cftab entries in range. */ |
511 | 276k | for (i = 0; i <= 256; i++) { |
512 | 275k | if (s->cftab[i] < 0 || s->cftab[i] > nblock) { |
513 | | /* s->cftab[i] can legitimately be == nblock */ |
514 | 0 | RETURN(BZ_DATA_ERROR); |
515 | 0 | } |
516 | 275k | } |
517 | | /* Check: cftab entries non-descending. */ |
518 | 275k | for (i = 1; i <= 256; i++) { |
519 | 274k | if (s->cftab[i-1] > s->cftab[i]) { |
520 | 0 | RETURN(BZ_DATA_ERROR); |
521 | 0 | } |
522 | 274k | } |
523 | | |
524 | 1.07k | s->state_out_len = 0; |
525 | 1.07k | s->state_out_ch = 0; |
526 | 1.07k | BZ_INITIALISE_CRC ( s->calculatedBlockCRC ); |
527 | 1.07k | s->state = BZ_X_OUTPUT; |
528 | 1.07k | if (s->verbosity >= 2) VPrintf0 ( "rt+rld" ); |
529 | | |
530 | 1.07k | if (s->smallDecompress) { |
531 | | |
532 | | /*-- Make a copy of cftab, used in generation of T --*/ |
533 | 0 | for (i = 0; i <= 256; i++) s->cftabCopy[i] = s->cftab[i]; |
534 | | |
535 | | /*-- compute the T vector --*/ |
536 | 0 | for (i = 0; i < nblock; i++) { |
537 | 0 | uc = (UChar)(s->ll16[i]); |
538 | 0 | SET_LL(i, s->cftabCopy[uc]); |
539 | 0 | s->cftabCopy[uc]++; |
540 | 0 | } |
541 | | |
542 | | /*-- Compute T^(-1) by pointer reversal on T --*/ |
543 | 0 | i = s->origPtr; |
544 | 0 | j = GET_LL(i); |
545 | 0 | do { |
546 | 0 | Int32 tmp = GET_LL(j); |
547 | 0 | SET_LL(j, i); |
548 | 0 | i = j; |
549 | 0 | j = tmp; |
550 | 0 | } |
551 | 0 | while (i != s->origPtr); |
552 | |
|
553 | 0 | s->tPos = s->origPtr; |
554 | 0 | s->nblock_used = 0; |
555 | 0 | if (s->blockRandomised) { |
556 | 0 | BZ_RAND_INIT_MASK; |
557 | 0 | BZ_GET_SMALL(s->k0); s->nblock_used++; |
558 | 0 | BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; |
559 | 0 | } else { |
560 | 0 | BZ_GET_SMALL(s->k0); s->nblock_used++; |
561 | 0 | } |
562 | |
|
563 | 1.07k | } else { |
564 | | |
565 | | /*-- compute the T^(-1) vector --*/ |
566 | 1.20M | for (i = 0; i < nblock; i++) { |
567 | 1.20M | uc = (UChar)(s->tt[i] & 0xff); |
568 | 1.20M | s->tt[s->cftab[uc]] |= (i << 8); |
569 | 1.20M | s->cftab[uc]++; |
570 | 1.20M | } |
571 | | |
572 | 1.07k | s->tPos = s->tt[s->origPtr] >> 8; |
573 | 1.07k | s->nblock_used = 0; |
574 | 1.07k | if (s->blockRandomised) { |
575 | 0 | BZ_RAND_INIT_MASK; |
576 | 0 | BZ_GET_FAST(s->k0); s->nblock_used++; |
577 | 0 | BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; |
578 | 1.07k | } else { |
579 | 1.07k | BZ_GET_FAST(s->k0); s->nblock_used++; |
580 | 1.07k | } |
581 | | |
582 | 1.07k | } |
583 | | |
584 | 1.07k | RETURN(BZ_OK); |
585 | | |
586 | | |
587 | |
|
588 | 1.04k | endhdr_2: |
589 | | |
590 | 1.04k | GET_UCHAR(BZ_X_ENDHDR_2, uc); |
591 | 1.04k | if (uc != 0x72) RETURN(BZ_DATA_ERROR); |
592 | 1.04k | GET_UCHAR(BZ_X_ENDHDR_3, uc); |
593 | 1.04k | if (uc != 0x45) RETURN(BZ_DATA_ERROR); |
594 | 1.04k | GET_UCHAR(BZ_X_ENDHDR_4, uc); |
595 | 1.04k | if (uc != 0x38) RETURN(BZ_DATA_ERROR); |
596 | 1.04k | GET_UCHAR(BZ_X_ENDHDR_5, uc); |
597 | 1.04k | if (uc != 0x50) RETURN(BZ_DATA_ERROR); |
598 | 1.04k | GET_UCHAR(BZ_X_ENDHDR_6, uc); |
599 | 1.04k | if (uc != 0x90) RETURN(BZ_DATA_ERROR); |
600 | | |
601 | 1.04k | s->storedCombinedCRC = 0; |
602 | 1.04k | GET_UCHAR(BZ_X_CCRC_1, uc); |
603 | 1.04k | s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); |
604 | 1.04k | GET_UCHAR(BZ_X_CCRC_2, uc); |
605 | 1.04k | s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); |
606 | 1.04k | GET_UCHAR(BZ_X_CCRC_3, uc); |
607 | 1.04k | s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); |
608 | 1.04k | GET_UCHAR(BZ_X_CCRC_4, uc); |
609 | 1.04k | s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); |
610 | | |
611 | 1.04k | s->state = BZ_X_IDLE; |
612 | 1.04k | RETURN(BZ_STREAM_END); |
613 | |
|
614 | 0 | default: AssertH ( False, 4001 ); |
615 | 3.75k | } |
616 | | |
617 | 0 | AssertH ( False, 4002 ); |
618 | |
|
619 | 3.75k | save_state_and_return: |
620 | | |
621 | 3.75k | s->save_i = i; |
622 | 3.75k | s->save_j = j; |
623 | 3.75k | s->save_t = t; |
624 | 3.75k | s->save_alphaSize = alphaSize; |
625 | 3.75k | s->save_nGroups = nGroups; |
626 | 3.75k | s->save_nSelectors = nSelectors; |
627 | 3.75k | s->save_EOB = EOB; |
628 | 3.75k | s->save_groupNo = groupNo; |
629 | 3.75k | s->save_groupPos = groupPos; |
630 | 3.75k | s->save_nextSym = nextSym; |
631 | 3.75k | s->save_nblockMAX = nblockMAX; |
632 | 3.75k | s->save_nblock = nblock; |
633 | 3.75k | s->save_es = es; |
634 | 3.75k | s->save_N = N; |
635 | 3.75k | s->save_curr = curr; |
636 | 3.75k | s->save_zt = zt; |
637 | 3.75k | s->save_zn = zn; |
638 | 3.75k | s->save_zvec = zvec; |
639 | 3.75k | s->save_zj = zj; |
640 | 3.75k | s->save_gSel = gSel; |
641 | 3.75k | s->save_gMinlen = gMinlen; |
642 | 3.75k | s->save_gLimit = gLimit; |
643 | 3.75k | s->save_gBase = gBase; |
644 | 3.75k | s->save_gPerm = gPerm; |
645 | | |
646 | 3.75k | return retVal; |
647 | 0 | } |
648 | | |
649 | | |
650 | | /*-------------------------------------------------------------*/ |
651 | | /*--- end decompress.c ---*/ |
652 | | /*-------------------------------------------------------------*/ |