/src/bzip2-1.0.8/decompress.c
Line | Count | Source (jump to first uncovered line) |
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 | 24.6k | { |
29 | 24.6k | Int32 i; |
30 | 24.6k | s->nInUse = 0; |
31 | 6.32M | for (i = 0; i < 256; i++) |
32 | 6.30M | if (s->inUse[i]) { |
33 | 291k | s->seqToUnseq[s->nInUse] = i; |
34 | 291k | s->nInUse++; |
35 | 291k | } |
36 | 24.6k | } |
37 | | |
38 | | |
39 | | /*---------------------------------------------------*/ |
40 | | #define RETURN(rrr) \ |
41 | 3.05G | { retVal = rrr; goto save_state_and_return; }; |
42 | | |
43 | | #define GET_BITS(lll,vvv,nnn) \ |
44 | 112M | case lll: s->state = lll; \ |
45 | 127M | while (True) { \ |
46 | 127M | if (s->bsLive >= nnn) { \ |
47 | 112M | UInt32 v; \ |
48 | 112M | v = (s->bsBuff >> \ |
49 | 112M | (s->bsLive-nnn)) & ((1 << nnn)-1); \ |
50 | 112M | s->bsLive -= nnn; \ |
51 | 112M | vvv = v; \ |
52 | 112M | break; \ |
53 | 112M | } \ |
54 | 127M | if (s->strm->avail_in == 0) RETURN(BZ_OK); \ |
55 | 14.7M | s->bsBuff \ |
56 | 14.7M | = (s->bsBuff << 8) | \ |
57 | 14.7M | ((UInt32) \ |
58 | 14.7M | (*((UChar*)(s->strm->next_in)))); \ |
59 | 14.7M | s->bsLive += 8; \ |
60 | 14.7M | s->strm->next_in++; \ |
61 | 14.7M | s->strm->avail_in--; \ |
62 | 14.7M | s->strm->total_in_lo32++; \ |
63 | 14.7M | if (s->strm->total_in_lo32 == 0) \ |
64 | 14.7M | s->strm->total_in_hi32++; \ |
65 | 14.7M | } |
66 | | |
67 | | #define GET_UCHAR(lll,uuu) \ |
68 | 356k | GET_BITS(lll,uuu,8) |
69 | | |
70 | | #define GET_BIT(lll,uuu) \ |
71 | 110M | GET_BITS(lll,uuu,1) |
72 | | |
73 | | /*---------------------------------------------------*/ |
74 | 1.70M | #define GET_MTF_VAL(label1,label2,lval) \ |
75 | 1.70M | { \ |
76 | 1.70M | if (groupPos == 0) { \ |
77 | 52.6k | groupNo++; \ |
78 | 52.6k | if (groupNo >= nSelectors) \ |
79 | 52.6k | RETURN(BZ_DATA_ERROR); \ |
80 | 52.6k | groupPos = BZ_G_SIZE; \ |
81 | 52.6k | gSel = s->selector[groupNo]; \ |
82 | 52.6k | gMinlen = s->minLens[gSel]; \ |
83 | 52.6k | gLimit = &(s->limit[gSel][0]); \ |
84 | 52.6k | gPerm = &(s->perm[gSel][0]); \ |
85 | 52.6k | gBase = &(s->base[gSel][0]); \ |
86 | 52.6k | } \ |
87 | 1.70M | groupPos--; \ |
88 | 1.70M | zn = gMinlen; \ |
89 | 1.70M | GET_BITS(label1, zvec, zn); \ |
90 | 2.09M | while (1) { \ |
91 | 2.09M | if (zn > 20 /* the longest code */) \ |
92 | 2.09M | RETURN(BZ_DATA_ERROR); \ |
93 | 2.09M | if (zvec <= gLimit[zn]) break; \ |
94 | 2.09M | zn++; \ |
95 | 392k | GET_BIT(label2, zj); \ |
96 | 392k | zvec = (zvec << 1) | zj; \ |
97 | 1.70M | }; \ |
98 | 1.70M | if (zvec - gBase[zn] < 0 \ |
99 | 1.70M | || zvec - gBase[zn] >= BZ_MAX_ALPHA_SIZE) \ |
100 | 1.70M | RETURN(BZ_DATA_ERROR); \ |
101 | 1.70M | lval = gPerm[zvec - gBase[zn]]; \ |
102 | 1.70M | } |
103 | | |
104 | | |
105 | | /*---------------------------------------------------*/ |
106 | | Int32 BZ2_decompress ( DState* s ) |
107 | 45.2k | { |
108 | 45.2k | UChar uc; |
109 | 45.2k | Int32 retVal; |
110 | 45.2k | Int32 minLen, maxLen; |
111 | 45.2k | bz_stream* strm = s->strm; |
112 | | |
113 | | /* stuff that needs to be saved/restored */ |
114 | 45.2k | Int32 i; |
115 | 45.2k | Int32 j; |
116 | 45.2k | Int32 t; |
117 | 45.2k | Int32 alphaSize; |
118 | 45.2k | Int32 nGroups; |
119 | 45.2k | Int32 nSelectors; |
120 | 45.2k | Int32 EOB; |
121 | 45.2k | Int32 groupNo; |
122 | 45.2k | Int32 groupPos; |
123 | 45.2k | Int32 nextSym; |
124 | 45.2k | Int32 nblockMAX; |
125 | 45.2k | Int32 nblock; |
126 | 45.2k | Int32 es; |
127 | 45.2k | Int32 N; |
128 | 45.2k | Int32 curr; |
129 | 45.2k | Int32 zt; |
130 | 45.2k | Int32 zn; |
131 | 45.2k | Int32 zvec; |
132 | 45.2k | Int32 zj; |
133 | 45.2k | Int32 gSel; |
134 | 45.2k | Int32 gMinlen; |
135 | 45.2k | Int32* gLimit; |
136 | 45.2k | Int32* gBase; |
137 | 45.2k | Int32* gPerm; |
138 | | |
139 | 45.2k | if (s->state == BZ_X_MAGIC_1) { |
140 | | /*initialise the save area*/ |
141 | 23.6k | s->save_i = 0; |
142 | 23.6k | s->save_j = 0; |
143 | 23.6k | s->save_t = 0; |
144 | 23.6k | s->save_alphaSize = 0; |
145 | 23.6k | s->save_nGroups = 0; |
146 | 23.6k | s->save_nSelectors = 0; |
147 | 23.6k | s->save_EOB = 0; |
148 | 23.6k | s->save_groupNo = 0; |
149 | 23.6k | s->save_groupPos = 0; |
150 | 23.6k | s->save_nextSym = 0; |
151 | 23.6k | s->save_nblockMAX = 0; |
152 | 23.6k | s->save_nblock = 0; |
153 | 23.6k | s->save_es = 0; |
154 | 23.6k | s->save_N = 0; |
155 | 23.6k | s->save_curr = 0; |
156 | 23.6k | s->save_zt = 0; |
157 | 23.6k | s->save_zn = 0; |
158 | 23.6k | s->save_zvec = 0; |
159 | 23.6k | s->save_zj = 0; |
160 | 23.6k | s->save_gSel = 0; |
161 | 23.6k | s->save_gMinlen = 0; |
162 | 23.6k | s->save_gLimit = NULL; |
163 | 23.6k | s->save_gBase = NULL; |
164 | 23.6k | s->save_gPerm = NULL; |
165 | 23.6k | } |
166 | | |
167 | | /*restore from the save area*/ |
168 | 45.2k | i = s->save_i; |
169 | 45.2k | j = s->save_j; |
170 | 45.2k | t = s->save_t; |
171 | 45.2k | alphaSize = s->save_alphaSize; |
172 | 45.2k | nGroups = s->save_nGroups; |
173 | 45.2k | nSelectors = s->save_nSelectors; |
174 | 45.2k | EOB = s->save_EOB; |
175 | 45.2k | groupNo = s->save_groupNo; |
176 | 45.2k | groupPos = s->save_groupPos; |
177 | 45.2k | nextSym = s->save_nextSym; |
178 | 45.2k | nblockMAX = s->save_nblockMAX; |
179 | 45.2k | nblock = s->save_nblock; |
180 | 45.2k | es = s->save_es; |
181 | 45.2k | N = s->save_N; |
182 | 45.2k | curr = s->save_curr; |
183 | 45.2k | zt = s->save_zt; |
184 | 45.2k | zn = s->save_zn; |
185 | 45.2k | zvec = s->save_zvec; |
186 | 45.2k | zj = s->save_zj; |
187 | 45.2k | gSel = s->save_gSel; |
188 | 45.2k | gMinlen = s->save_gMinlen; |
189 | 45.2k | gLimit = s->save_gLimit; |
190 | 45.2k | gBase = s->save_gBase; |
191 | 45.2k | gPerm = s->save_gPerm; |
192 | | |
193 | 45.2k | retVal = BZ_OK; |
194 | | |
195 | 45.2k | switch (s->state) { |
196 | | |
197 | 23.6k | GET_UCHAR(BZ_X_MAGIC_1, uc); |
198 | 23.6k | if (uc != BZ_HDR_B) RETURN(BZ_DATA_ERROR_MAGIC); |
199 | | |
200 | 5.10k | GET_UCHAR(BZ_X_MAGIC_2, uc); |
201 | 5.10k | if (uc != BZ_HDR_Z) RETURN(BZ_DATA_ERROR_MAGIC); |
202 | | |
203 | 5.09k | GET_UCHAR(BZ_X_MAGIC_3, uc) |
204 | 5.09k | if (uc != BZ_HDR_h) RETURN(BZ_DATA_ERROR_MAGIC); |
205 | | |
206 | 5.07k | GET_BITS(BZ_X_MAGIC_4, s->blockSize100k, 8) |
207 | 5.07k | if (s->blockSize100k < (BZ_HDR_0 + 1) || |
208 | 5.07k | s->blockSize100k > (BZ_HDR_0 + 9)) RETURN(BZ_DATA_ERROR_MAGIC); |
209 | 5.06k | s->blockSize100k -= BZ_HDR_0; |
210 | | |
211 | 5.06k | 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 | 5.06k | } else { |
218 | 5.06k | s->tt = BZALLOC( s->blockSize100k * 100000 * sizeof(Int32) ); |
219 | 5.06k | if (s->tt == NULL) RETURN(BZ_MEM_ERROR); |
220 | 5.06k | } |
221 | | |
222 | 24.9k | GET_UCHAR(BZ_X_BLKHDR_1, uc); |
223 | | |
224 | 24.9k | if (uc == 0x17) goto endhdr_2; |
225 | 24.8k | if (uc != 0x31) RETURN(BZ_DATA_ERROR); |
226 | 24.8k | GET_UCHAR(BZ_X_BLKHDR_2, uc); |
227 | 24.8k | if (uc != 0x41) RETURN(BZ_DATA_ERROR); |
228 | 24.8k | GET_UCHAR(BZ_X_BLKHDR_3, uc); |
229 | 24.8k | if (uc != 0x59) RETURN(BZ_DATA_ERROR); |
230 | 24.8k | GET_UCHAR(BZ_X_BLKHDR_4, uc); |
231 | 24.8k | if (uc != 0x26) RETURN(BZ_DATA_ERROR); |
232 | 24.8k | GET_UCHAR(BZ_X_BLKHDR_5, uc); |
233 | 24.7k | if (uc != 0x53) RETURN(BZ_DATA_ERROR); |
234 | 24.7k | GET_UCHAR(BZ_X_BLKHDR_6, uc); |
235 | 24.7k | if (uc != 0x59) RETURN(BZ_DATA_ERROR); |
236 | | |
237 | 24.7k | s->currBlockNo++; |
238 | 24.7k | if (s->verbosity >= 2) |
239 | 0 | VPrintf1 ( "\n [%d: huff+mtf ", s->currBlockNo ); |
240 | | |
241 | 24.7k | s->storedBlockCRC = 0; |
242 | 24.7k | GET_UCHAR(BZ_X_BCRC_1, uc); |
243 | 24.7k | s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); |
244 | 24.7k | GET_UCHAR(BZ_X_BCRC_2, uc); |
245 | 24.7k | s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); |
246 | 24.7k | GET_UCHAR(BZ_X_BCRC_3, uc); |
247 | 24.7k | s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); |
248 | 24.7k | GET_UCHAR(BZ_X_BCRC_4, uc); |
249 | 24.7k | s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); |
250 | | |
251 | 24.7k | GET_BITS(BZ_X_RANDBIT, s->blockRandomised, 1); |
252 | | |
253 | 24.7k | s->origPtr = 0; |
254 | 24.7k | GET_UCHAR(BZ_X_ORIGPTR_1, uc); |
255 | 24.7k | s->origPtr = (s->origPtr << 8) | ((Int32)uc); |
256 | 24.7k | GET_UCHAR(BZ_X_ORIGPTR_2, uc); |
257 | 24.7k | s->origPtr = (s->origPtr << 8) | ((Int32)uc); |
258 | 24.7k | GET_UCHAR(BZ_X_ORIGPTR_3, uc); |
259 | 24.7k | s->origPtr = (s->origPtr << 8) | ((Int32)uc); |
260 | | |
261 | 24.7k | if (s->origPtr < 0) |
262 | 24.7k | RETURN(BZ_DATA_ERROR); |
263 | 24.7k | if (s->origPtr > 10 + 100000*s->blockSize100k) |
264 | 24.6k | RETURN(BZ_DATA_ERROR); |
265 | | |
266 | | /*--- Receive the mapping table ---*/ |
267 | 419k | for (i = 0; i < 16; i++) { |
268 | 394k | GET_BIT(BZ_X_MAPPING_1, uc); |
269 | 394k | if (uc == 1) |
270 | 74.7k | s->inUse16[i] = True; else |
271 | 319k | s->inUse16[i] = False; |
272 | 394k | } |
273 | | |
274 | 6.33M | for (i = 0; i < 256; i++) s->inUse[i] = False; |
275 | | |
276 | 418k | for (i = 0; i < 16; i++) |
277 | 394k | if (s->inUse16[i]) |
278 | 1.26M | for (j = 0; j < 16; j++) { |
279 | 1.19M | GET_BIT(BZ_X_MAPPING_2, uc); |
280 | 1.19M | if (uc == 1) s->inUse[i * 16 + j] = True; |
281 | 1.19M | } |
282 | 24.6k | makeMaps_d ( s ); |
283 | 24.6k | if (s->nInUse == 0) RETURN(BZ_DATA_ERROR); |
284 | 24.6k | alphaSize = s->nInUse+2; |
285 | | |
286 | | /*--- Now the selectors ---*/ |
287 | 24.6k | GET_BITS(BZ_X_SELECTOR_1, nGroups, 3); |
288 | 24.6k | if (nGroups < 2 || nGroups > BZ_N_GROUPS) RETURN(BZ_DATA_ERROR); |
289 | 24.6k | GET_BITS(BZ_X_SELECTOR_2, nSelectors, 15); |
290 | 24.5k | if (nSelectors < 1) RETURN(BZ_DATA_ERROR); |
291 | 1.47M | for (i = 0; i < nSelectors; i++) { |
292 | 1.45M | j = 0; |
293 | 1.61M | while (True) { |
294 | 1.61M | GET_BIT(BZ_X_SELECTOR_3, uc); |
295 | 1.61M | if (uc == 0) break; |
296 | 163k | j++; |
297 | 163k | if (j >= nGroups) RETURN(BZ_DATA_ERROR); |
298 | 163k | } |
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 | 1.45M | if (i < BZ_MAX_SELECTORS) |
303 | 1.45M | s->selectorMtf[i] = j; |
304 | 1.45M | } |
305 | 24.5k | if (nSelectors > BZ_MAX_SELECTORS) |
306 | 1 | nSelectors = BZ_MAX_SELECTORS; |
307 | | |
308 | | /*--- Undo the MTF values for the selectors. ---*/ |
309 | 24.5k | { |
310 | 24.5k | UChar pos[BZ_N_GROUPS], tmp, v; |
311 | 73.8k | for (v = 0; v < nGroups; v++) pos[v] = v; |
312 | | |
313 | 1.26M | for (i = 0; i < nSelectors; i++) { |
314 | 1.23M | v = s->selectorMtf[i]; |
315 | 1.23M | tmp = pos[v]; |
316 | 1.39M | while (v > 0) { pos[v] = pos[v-1]; v--; } |
317 | 1.23M | pos[0] = tmp; |
318 | 1.23M | s->selector[i] = tmp; |
319 | 1.23M | } |
320 | 24.5k | } |
321 | | |
322 | | /*--- Now the coding tables ---*/ |
323 | 73.7k | for (t = 0; t < nGroups; t++) { |
324 | 49.2k | GET_BITS(BZ_X_CODING_1, curr, 5); |
325 | 725k | for (i = 0; i < alphaSize; i++) { |
326 | 53.8M | while (True) { |
327 | 53.8M | if (curr < 1 || curr > 20) RETURN(BZ_DATA_ERROR); |
328 | 53.8M | GET_BIT(BZ_X_CODING_2, uc); |
329 | 53.8M | if (uc == 0) break; |
330 | 53.1M | GET_BIT(BZ_X_CODING_3, uc); |
331 | 53.1M | if (uc == 0) curr++; else curr--; |
332 | 53.1M | } |
333 | 676k | s->len[t][i] = curr; |
334 | 676k | } |
335 | 49.2k | } |
336 | | |
337 | | /*--- Create the Huffman decoding tables ---*/ |
338 | 73.5k | for (t = 0; t < nGroups; t++) { |
339 | 49.1k | minLen = 32; |
340 | 49.1k | maxLen = 0; |
341 | 725k | for (i = 0; i < alphaSize; i++) { |
342 | 675k | if (s->len[t][i] > maxLen) maxLen = s->len[t][i]; |
343 | 675k | if (s->len[t][i] < minLen) minLen = s->len[t][i]; |
344 | 675k | } |
345 | 49.1k | BZ2_hbCreateDecodeTables ( |
346 | 49.1k | &(s->limit[t][0]), |
347 | 49.1k | &(s->base[t][0]), |
348 | 49.1k | &(s->perm[t][0]), |
349 | 49.1k | &(s->len[t][0]), |
350 | 49.1k | minLen, maxLen, alphaSize |
351 | 49.1k | ); |
352 | 49.1k | s->minLens[t] = minLen; |
353 | 49.1k | } |
354 | | |
355 | | /*--- Now the MTF values ---*/ |
356 | | |
357 | 24.4k | EOB = s->nInUse+1; |
358 | 24.4k | nblockMAX = 100000 * s->blockSize100k; |
359 | 24.4k | groupNo = -1; |
360 | 24.4k | groupPos = 0; |
361 | | |
362 | 6.29M | for (i = 0; i <= 255; i++) s->unzftab[i] = 0; |
363 | | |
364 | | /*-- MTF init --*/ |
365 | 24.4k | { |
366 | 24.4k | Int32 ii, jj, kk; |
367 | 24.4k | kk = MTFA_SIZE-1; |
368 | 416k | for (ii = 256 / MTFL_SIZE - 1; ii >= 0; ii--) { |
369 | 6.65M | for (jj = MTFL_SIZE-1; jj >= 0; jj--) { |
370 | 6.26M | s->mtfa[kk] = (UChar)(ii * MTFL_SIZE + jj); |
371 | 6.26M | kk--; |
372 | 6.26M | } |
373 | 391k | s->mtfbase[ii] = kk + 1; |
374 | 391k | } |
375 | 24.4k | } |
376 | | /*-- end MTF init --*/ |
377 | | |
378 | 24.4k | nblock = 0; |
379 | 122k | GET_MTF_VAL(BZ_X_MTF_1, BZ_X_MTF_2, nextSym); |
380 | | |
381 | 1.38M | while (True) { |
382 | | |
383 | 1.38M | if (nextSym == EOB) break; |
384 | | |
385 | 1.36M | if (nextSym == BZ_RUNA || nextSym == BZ_RUNB) { |
386 | | |
387 | 114k | es = -1; |
388 | 114k | N = 1; |
389 | 433k | 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 | 433k | if (N >= 2*1024*1024) RETURN(BZ_DATA_ERROR); |
397 | 433k | if (nextSym == BZ_RUNA) es = es + (0+1) * N; else |
398 | 113k | if (nextSym == BZ_RUNB) es = es + (1+1) * N; |
399 | 433k | N = N * 2; |
400 | 2.16M | GET_MTF_VAL(BZ_X_MTF_3, BZ_X_MTF_4, nextSym); |
401 | 2.16M | } |
402 | 433k | while (nextSym == BZ_RUNA || nextSym == BZ_RUNB); |
403 | | |
404 | 114k | es++; |
405 | 114k | uc = s->seqToUnseq[ s->mtfa[s->mtfbase[0]] ]; |
406 | 114k | s->unzftab[uc] += es; |
407 | | |
408 | 114k | 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 | 114k | else |
416 | 2.97G | while (es > 0) { |
417 | 2.97G | if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR); |
418 | 2.97G | s->tt[nblock] = (UInt32)uc; |
419 | 2.97G | nblock++; |
420 | 2.97G | es--; |
421 | 2.97G | }; |
422 | | |
423 | 114k | continue; |
424 | | |
425 | 1.24M | } else { |
426 | | |
427 | 1.24M | if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR); |
428 | | |
429 | | /*-- uc = MTF ( nextSym-1 ) --*/ |
430 | 1.24M | { |
431 | 1.24M | Int32 ii, jj, kk, pp, lno, off; |
432 | 1.24M | UInt32 nn; |
433 | 1.24M | nn = (UInt32)(nextSym - 1); |
434 | | |
435 | 1.24M | if (nn < MTFL_SIZE) { |
436 | | /* avoid general-case expense */ |
437 | 229k | pp = s->mtfbase[0]; |
438 | 229k | uc = s->mtfa[pp+nn]; |
439 | 349k | while (nn > 3) { |
440 | 119k | Int32 z = pp+nn; |
441 | 119k | s->mtfa[(z) ] = s->mtfa[(z)-1]; |
442 | 119k | s->mtfa[(z)-1] = s->mtfa[(z)-2]; |
443 | 119k | s->mtfa[(z)-2] = s->mtfa[(z)-3]; |
444 | 119k | s->mtfa[(z)-3] = s->mtfa[(z)-4]; |
445 | 119k | nn -= 4; |
446 | 119k | } |
447 | 571k | while (nn > 0) { |
448 | 341k | s->mtfa[(pp+nn)] = s->mtfa[(pp+nn)-1]; nn--; |
449 | 341k | }; |
450 | 229k | s->mtfa[pp] = uc; |
451 | 1.01M | } else { |
452 | | /* general case */ |
453 | 1.01M | lno = nn / MTFL_SIZE; |
454 | 1.01M | off = nn % MTFL_SIZE; |
455 | 1.01M | pp = s->mtfbase[lno] + off; |
456 | 1.01M | uc = s->mtfa[pp]; |
457 | 12.5M | while (pp > s->mtfbase[lno]) { |
458 | 11.5M | s->mtfa[pp] = s->mtfa[pp-1]; pp--; |
459 | 11.5M | }; |
460 | 1.01M | s->mtfbase[lno]++; |
461 | 2.17M | while (lno > 0) { |
462 | 1.15M | s->mtfbase[lno]--; |
463 | 1.15M | s->mtfa[s->mtfbase[lno]] |
464 | 1.15M | = s->mtfa[s->mtfbase[lno-1] + MTFL_SIZE - 1]; |
465 | 1.15M | lno--; |
466 | 1.15M | } |
467 | 1.01M | s->mtfbase[0]--; |
468 | 1.01M | s->mtfa[s->mtfbase[0]] = uc; |
469 | 1.01M | if (s->mtfbase[0] == 0) { |
470 | 227 | kk = MTFA_SIZE-1; |
471 | 3.85k | for (ii = 256 / MTFL_SIZE-1; ii >= 0; ii--) { |
472 | 61.7k | for (jj = MTFL_SIZE-1; jj >= 0; jj--) { |
473 | 58.1k | s->mtfa[kk] = s->mtfa[s->mtfbase[ii] + jj]; |
474 | 58.1k | kk--; |
475 | 58.1k | } |
476 | 3.63k | s->mtfbase[ii] = kk + 1; |
477 | 3.63k | } |
478 | 227 | } |
479 | 1.01M | } |
480 | 1.24M | } |
481 | | /*-- end uc = MTF ( nextSym-1 ) --*/ |
482 | | |
483 | 1.24M | s->unzftab[s->seqToUnseq[uc]]++; |
484 | 1.24M | if (s->smallDecompress) |
485 | 0 | s->ll16[nblock] = (UInt16)(s->seqToUnseq[uc]); else |
486 | 1.24M | s->tt[nblock] = (UInt32)(s->seqToUnseq[uc]); |
487 | 1.24M | nblock++; |
488 | | |
489 | 1.24M | GET_MTF_VAL(BZ_X_MTF_5, BZ_X_MTF_6, nextSym); |
490 | 1.24M | continue; |
491 | 4.99M | } |
492 | 1.36M | } |
493 | | |
494 | | /* Now we know what nblock is, we can do a better sanity |
495 | | check on s->origPtr. |
496 | | */ |
497 | 24.2k | if (s->origPtr < 0 || s->origPtr >= nblock) |
498 | 24.2k | RETURN(BZ_DATA_ERROR); |
499 | | |
500 | | /*-- Set up cftab to facilitate generation of T^(-1) --*/ |
501 | | /* Check: unzftab entries in range. */ |
502 | 6.23M | for (i = 0; i <= 255; i++) { |
503 | 6.20M | if (s->unzftab[i] < 0 || s->unzftab[i] > nblock) |
504 | 6.20M | RETURN(BZ_DATA_ERROR); |
505 | 6.20M | } |
506 | | /* Actually generate cftab. */ |
507 | 24.2k | s->cftab[0] = 0; |
508 | 6.23M | for (i = 1; i <= 256; i++) s->cftab[i] = s->unzftab[i-1]; |
509 | 6.23M | for (i = 1; i <= 256; i++) s->cftab[i] += s->cftab[i-1]; |
510 | | /* Check: cftab entries in range. */ |
511 | 6.25M | for (i = 0; i <= 256; i++) { |
512 | 6.23M | 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 | 6.23M | } |
517 | | /* Check: cftab entries non-descending. */ |
518 | 6.23M | for (i = 1; i <= 256; i++) { |
519 | 6.20M | if (s->cftab[i-1] > s->cftab[i]) { |
520 | 0 | RETURN(BZ_DATA_ERROR); |
521 | 0 | } |
522 | 6.20M | } |
523 | | |
524 | 24.2k | s->state_out_len = 0; |
525 | 24.2k | s->state_out_ch = 0; |
526 | 24.2k | BZ_INITIALISE_CRC ( s->calculatedBlockCRC ); |
527 | 24.2k | s->state = BZ_X_OUTPUT; |
528 | 24.2k | if (s->verbosity >= 2) VPrintf0 ( "rt+rld" ); |
529 | | |
530 | 24.2k | 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 | 24.2k | } else { |
564 | | |
565 | | /*-- compute the T^(-1) vector --*/ |
566 | 2.96G | for (i = 0; i < nblock; i++) { |
567 | 2.96G | uc = (UChar)(s->tt[i] & 0xff); |
568 | 2.96G | s->tt[s->cftab[uc]] |= (i << 8); |
569 | 2.96G | s->cftab[uc]++; |
570 | 2.96G | } |
571 | | |
572 | 24.2k | s->tPos = s->tt[s->origPtr] >> 8; |
573 | 24.2k | s->nblock_used = 0; |
574 | 24.2k | if (s->blockRandomised) { |
575 | 279 | BZ_RAND_INIT_MASK; |
576 | 279 | BZ_GET_FAST(s->k0); s->nblock_used++; |
577 | 279 | BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; |
578 | 23.9k | } else { |
579 | 23.9k | BZ_GET_FAST(s->k0); s->nblock_used++; |
580 | 23.9k | } |
581 | | |
582 | 24.2k | } |
583 | | |
584 | 24.2k | RETURN(BZ_OK); |
585 | | |
586 | | |
587 | |
|
588 | 82 | endhdr_2: |
589 | | |
590 | 83 | GET_UCHAR(BZ_X_ENDHDR_2, uc); |
591 | 81 | if (uc != 0x72) RETURN(BZ_DATA_ERROR); |
592 | 72 | GET_UCHAR(BZ_X_ENDHDR_3, uc); |
593 | 70 | if (uc != 0x45) RETURN(BZ_DATA_ERROR); |
594 | 63 | GET_UCHAR(BZ_X_ENDHDR_4, uc); |
595 | 60 | if (uc != 0x38) RETURN(BZ_DATA_ERROR); |
596 | 56 | GET_UCHAR(BZ_X_ENDHDR_5, uc); |
597 | 54 | if (uc != 0x50) RETURN(BZ_DATA_ERROR); |
598 | 51 | GET_UCHAR(BZ_X_ENDHDR_6, uc); |
599 | 47 | if (uc != 0x90) RETURN(BZ_DATA_ERROR); |
600 | | |
601 | 43 | s->storedCombinedCRC = 0; |
602 | 44 | GET_UCHAR(BZ_X_CCRC_1, uc); |
603 | 42 | s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); |
604 | 43 | GET_UCHAR(BZ_X_CCRC_2, uc); |
605 | 42 | s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); |
606 | 43 | GET_UCHAR(BZ_X_CCRC_3, uc); |
607 | 39 | s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); |
608 | 40 | GET_UCHAR(BZ_X_CCRC_4, uc); |
609 | 36 | s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); |
610 | | |
611 | 36 | s->state = BZ_X_IDLE; |
612 | 36 | RETURN(BZ_STREAM_END); |
613 | |
|
614 | 0 | default: AssertH ( False, 4001 ); |
615 | 45.2k | } |
616 | | |
617 | 0 | AssertH ( False, 4002 ); |
618 | |
|
619 | 45.2k | save_state_and_return: |
620 | | |
621 | 45.2k | s->save_i = i; |
622 | 45.2k | s->save_j = j; |
623 | 45.2k | s->save_t = t; |
624 | 45.2k | s->save_alphaSize = alphaSize; |
625 | 45.2k | s->save_nGroups = nGroups; |
626 | 45.2k | s->save_nSelectors = nSelectors; |
627 | 45.2k | s->save_EOB = EOB; |
628 | 45.2k | s->save_groupNo = groupNo; |
629 | 45.2k | s->save_groupPos = groupPos; |
630 | 45.2k | s->save_nextSym = nextSym; |
631 | 45.2k | s->save_nblockMAX = nblockMAX; |
632 | 45.2k | s->save_nblock = nblock; |
633 | 45.2k | s->save_es = es; |
634 | 45.2k | s->save_N = N; |
635 | 45.2k | s->save_curr = curr; |
636 | 45.2k | s->save_zt = zt; |
637 | 45.2k | s->save_zn = zn; |
638 | 45.2k | s->save_zvec = zvec; |
639 | 45.2k | s->save_zj = zj; |
640 | 45.2k | s->save_gSel = gSel; |
641 | 45.2k | s->save_gMinlen = gMinlen; |
642 | 45.2k | s->save_gLimit = gLimit; |
643 | 45.2k | s->save_gBase = gBase; |
644 | 45.2k | s->save_gPerm = gPerm; |
645 | | |
646 | 45.2k | return retVal; |
647 | 0 | } |
648 | | |
649 | | |
650 | | /*-------------------------------------------------------------*/ |
651 | | /*--- end decompress.c ---*/ |
652 | | /*-------------------------------------------------------------*/ |