decompress.c 20 KB

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