bsdiff 0.0.1 → 0.1.0

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