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