📄 bunzip2.c
字号:
if (! get_bits(s, &uc, 8)) { retVal = BZ_OK; goto save_state_and_return; } if (uc != 0x53) { retVal = BZ_DATA_ERROR; goto save_state_and_return; } case BZ_X_BLKHDR_6: s->state = BZ_X_BLKHDR_6; if (! get_bits(s, &uc, 8)) { retVal = BZ_OK; goto save_state_and_return; } if (uc != 0x59) { retVal = BZ_DATA_ERROR; goto save_state_and_return; } s->currBlockNo++; s->storedBlockCRC = 0; case BZ_X_BCRC_1: s->state = BZ_X_BCRC_1; if (! get_bits(s, &uc, 8)) { retVal = BZ_OK; goto save_state_and_return; } s->storedBlockCRC = (s->storedBlockCRC << 8) | ((unsigned int)uc); case BZ_X_BCRC_2: s->state = BZ_X_BCRC_2; if (! get_bits(s, &uc, 8)) { retVal = BZ_OK; goto save_state_and_return; } s->storedBlockCRC = (s->storedBlockCRC << 8) | ((unsigned int)uc); case BZ_X_BCRC_3: s->state = BZ_X_BCRC_3; if (! get_bits(s, &uc, 8)) { retVal = BZ_OK; goto save_state_and_return; } s->storedBlockCRC = (s->storedBlockCRC << 8) | ((unsigned int)uc); case BZ_X_BCRC_4: s->state = BZ_X_BCRC_4; if (! get_bits(s, &uc, 8)) { retVal = BZ_OK; goto save_state_and_return; } s->storedBlockCRC = (s->storedBlockCRC << 8) | ((unsigned int)uc); case BZ_X_RANDBIT: s->state = BZ_X_RANDBIT; { int tmp = s->blockRandomised; const int ret = get_bits(s, &tmp, 1); s->blockRandomised = tmp; if (! ret) { retVal = BZ_OK; goto save_state_and_return; } } s->origPtr = 0; case BZ_X_ORIGPTR_1: s->state = BZ_X_ORIGPTR_1; if (! get_bits(s, &uc, 8)) { retVal = BZ_OK; goto save_state_and_return; } s->origPtr = (s->origPtr << 8) | ((int)uc); case BZ_X_ORIGPTR_2: s->state = BZ_X_ORIGPTR_2; if (! get_bits(s, &uc, 8)) { retVal = BZ_OK; goto save_state_and_return; } s->origPtr = (s->origPtr << 8) | ((int)uc); case BZ_X_ORIGPTR_3: s->state = BZ_X_ORIGPTR_3; if (! get_bits(s, &uc, 8)) { retVal = BZ_OK; goto save_state_and_return; } s->origPtr = (s->origPtr << 8) | ((int)uc); if (s->origPtr < 0) { retVal = BZ_DATA_ERROR; goto save_state_and_return; } if (s->origPtr > 10 + 100000*s->blockSize100k) { retVal = BZ_DATA_ERROR; goto save_state_and_return; } /*--- Receive the mapping table ---*/ case BZ_X_MAPPING_1: for (i = 0; i < 16; i++) { s->state = BZ_X_MAPPING_1; if (! get_bits(s, &uc, 1)) { retVal = BZ_OK; goto save_state_and_return; } if (uc == 1) { s->inUse16[i] = TRUE; } else { s->inUse16[i] = FALSE; } } for (i = 0; i < 256; i++) { s->inUse[i] = FALSE; } for (i = 0; i < 16; i++) { if (s->inUse16[i]) { for (j = 0; j < 16; j++) { case BZ_X_MAPPING_2: s->state = BZ_X_MAPPING_2; if (! get_bits(s, &uc, 1)) { retVal = BZ_OK; goto save_state_and_return; } if (uc == 1) { s->inUse[i * 16 + j] = TRUE; } } } } s->nInUse = 0; for (i = 0; i < 256; i++) { if (s->inUse[i]) { s->seqToUnseq[s->nInUse] = i; s->nInUse++; } } if (s->nInUse == 0) { retVal = BZ_DATA_ERROR; goto save_state_and_return; } alphaSize = s->nInUse+2; /*--- Now the selectors ---*/ case BZ_X_SELECTOR_1: s->state = BZ_X_SELECTOR_1; if (! get_bits(s, &nGroups, 3)) { retVal = BZ_OK; goto save_state_and_return; } if (nGroups < 2 || nGroups > 6) { retVal = BZ_DATA_ERROR; goto save_state_and_return; } case BZ_X_SELECTOR_2: s->state = BZ_X_SELECTOR_2; if (! get_bits(s, &nSelectors, 15)) { retVal = BZ_OK; goto save_state_and_return; } if (nSelectors < 1) { retVal = BZ_DATA_ERROR; goto save_state_and_return; } for (i = 0; i < nSelectors; i++) { j = 0; while (1) { case BZ_X_SELECTOR_3: s->state = BZ_X_SELECTOR_3; if (! get_bits(s, &uc, 1)) { retVal = BZ_OK; goto save_state_and_return; } if (uc == 0) { break; } j++; if (j >= nGroups) { retVal = BZ_DATA_ERROR; goto save_state_and_return; } } s->selectorMtf[i] = j; } /*--- Undo the MTF values for the selectors. ---*/ { unsigned char pos[BZ_N_GROUPS], tmp, v; for (v = 0; v < nGroups; v++) { pos[v] = v; } for (i = 0; i < nSelectors; i++) { v = s->selectorMtf[i]; tmp = pos[v]; while (v > 0) { pos[v] = pos[v-1]; v--; } pos[0] = tmp; s->selector[i] = tmp; } } /*--- Now the coding tables ---*/ for (t = 0; t < nGroups; t++) { case BZ_X_CODING_1: s->state = BZ_X_CODING_1; if (! get_bits(s, &curr, 5)) { retVal = BZ_OK; goto save_state_and_return; } for (i = 0; i < alphaSize; i++) { while (TRUE) { if (curr < 1 || curr > 20) { retVal = BZ_DATA_ERROR; goto save_state_and_return; } case BZ_X_CODING_2: s->state = BZ_X_CODING_2; if (! get_bits(s, &uc, 1)) { retVal = BZ_OK; goto save_state_and_return; } if (uc == 0) { break; } case BZ_X_CODING_3: s->state = BZ_X_CODING_3; if (! get_bits(s, &uc, 1)) { retVal = BZ_OK; goto save_state_and_return; } if (uc == 0) { curr++; } else { curr--; } } s->len[t][i] = curr; } } /*--- Create the Huffman decoding tables ---*/ for (t = 0; t < nGroups; t++) { minLen = 32; maxLen = 0; for (i = 0; i < alphaSize; i++) { if (s->len[t][i] > maxLen) { maxLen = s->len[t][i]; } if (s->len[t][i] < minLen) { minLen = s->len[t][i]; } } BZ2_hbCreateDecodeTables ( &(s->limit[t][0]), &(s->base[t][0]), &(s->perm[t][0]), &(s->len[t][0]), minLen, maxLen, alphaSize ); s->minLens[t] = minLen; } /*--- Now the MTF values ---*/ EOB = s->nInUse+1; nblockMAX = 100000 * s->blockSize100k; groupNo = -1; groupPos = 0; for (i = 0; i <= 255; i++) { s->unzftab[i] = 0; } /*-- MTF init --*/ { int ii, jj, kk; kk = MTFA_SIZE-1; for (ii = 256 / MTFL_SIZE - 1; ii >= 0; ii--) { for (jj = MTFL_SIZE-1; jj >= 0; jj--) { s->mtfa[kk] = (unsigned char)(ii * MTFL_SIZE + jj); kk--; } s->mtfbase[ii] = kk + 1; } } /*-- end MTF init --*/ nblock = 0; if (! get_mtf_val_init()) { goto save_state_and_return; } case BZ_X_MTF_1: s->state = BZ_X_MTF_1; if (! get_bits(s, &zvec, zn)) { retVal = BZ_OK; goto save_state_and_return; } while (1) { if (zn > 20 /* the longest code */) { retVal = BZ_DATA_ERROR; goto save_state_and_return; } if (zvec <= gLimit[zn]) { break; } zn++; case BZ_X_MTF_2: s->state = BZ_X_MTF_2; if (! get_bits(s, &zj, 1)) { retVal = BZ_OK; goto save_state_and_return; } zvec = (zvec << 1) | zj; } if (zvec - gBase[zn] < 0 || zvec - gBase[zn] >= BZ_MAX_ALPHA_SIZE) { retVal = BZ_DATA_ERROR; goto save_state_and_return; } nextSym = gPerm[zvec - gBase[zn]]; while (1) { if (nextSym == EOB) { break; } if (nextSym == BZ_RUNA || nextSym == BZ_RUNB) { es = -1; N = 1; do { if (nextSym == BZ_RUNA) { es = es + (0+1) * N; } else { if (nextSym == BZ_RUNB) { es = es + (1+1) * N; } } N = N * 2; if (! get_mtf_val_init()) { goto save_state_and_return; } case BZ_X_MTF_3: s->state = BZ_X_MTF_3; if (! get_bits(s, &zvec, zn)) { retVal = BZ_OK; goto save_state_and_return; } while (1) { if (zn > 20 /* the longest code */) { retVal = BZ_DATA_ERROR; goto save_state_and_return; } if (zvec <= gLimit[zn]) { break; } zn++; case BZ_X_MTF_4: s->state = BZ_X_MTF_4; if (! get_bits(s, &zj, 1)) { retVal = BZ_OK; goto save_state_and_return; } zvec = (zvec << 1) | zj; } if (zvec - gBase[zn] < 0 || zvec - gBase[zn] >= BZ_MAX_ALPHA_SIZE) { retVal = BZ_DATA_ERROR; goto save_state_and_return; } nextSym = gPerm[zvec - gBase[zn]]; } while (nextSym == BZ_RUNA || nextSym == BZ_RUNB); es++; uc = s->seqToUnseq[ s->mtfa[s->mtfbase[0]] ]; s->unzftab[uc] += es; while (es > 0) { if (nblock >= nblockMAX) { retVal = BZ_DATA_ERROR; goto save_state_and_return; } s->tt[nblock] = (unsigned int)uc; nblock++; es--; } continue; } else { if (nblock >= nblockMAX) { retVal = BZ_DATA_ERROR; goto save_state_and_return; } /*-- uc = MTF ( nextSym-1 ) --*/ { int ii, jj, kk, pp, lno, off; unsigned int nn; nn = (unsigned int)(nextSym - 1); if (nn < MTFL_SIZE) { /* avoid general-case expense */ pp = s->mtfbase[0]; uc = s->mtfa[pp+nn]; while (nn > 3) { int z = pp+nn; s->mtfa[(z) ] = s->mtfa[(z)-1]; s->mtfa[(z)-1] = s->mtfa[(z)-2]; s->mtfa[(z)-2] = s->mtfa[(z)-3]; s->mtfa[(z)-3] = s->mtfa[(z)-4]; nn -= 4; } while (nn > 0) { s->mtfa[(pp+nn)] = s->mtfa[(pp+nn)-1]; nn--; } s->mtfa[pp] = uc; } else { /* general case */ lno = nn / MTFL_SIZE; off = nn % MTFL_SIZE; pp = s->mtfbase[lno] + off; uc = s->mtfa[pp]; while (pp > s->mtfbase[lno]) { s->mtfa[pp] = s->mtfa[pp-1]; pp--; } s->mtfbase[lno]++; while (lno > 0) { s->mtfbase[lno]--; s->mtfa[s->mtfbase[lno]] = s->mtfa[s->mtfbase[lno-1] + MTFL_SIZE - 1]; lno--; } s->mtfbase[0]--; s->mtfa[s->mtfbase[0]] = uc; if (s->mtfbase[0] == 0) { kk = MTFA_SIZE-1; for (ii = 256 / MTFL_SIZE-1; ii >= 0; ii--) { for (jj = MTFL_SIZE-1; jj >= 0; jj--) { s->mtfa[kk] = s->mtfa[s->mtfbase[ii] + jj]; kk--; } s->mtfbase[ii] = kk + 1; } } } } /*-- end uc = MTF ( nextSym-1 ) --*/ s->unzftab[s->seqToUnseq[uc]]++; s->tt[nblock] = (unsigned int)(s->seqToUnseq[uc]); nblock++; if (! get_mtf_val_init()) { goto save_state_and_return; } case BZ_X_MTF_5: s->state = BZ_X_MTF_5; if (! get_bits(s, &zvec, zn)) { retVal = BZ_OK; goto save_state_and_return; } while (1) { if (zn > 20 /* the longest code */) { retVal = BZ_DATA_ERROR; goto save_state_and_return; } if (zvec <= gLimit[zn]) { break; } zn++; case BZ_X_MTF_6: s->state = BZ_X_MTF_6; if (! get_bits(s, &zj, 1)) { retVal = BZ_OK; goto save_state_and_return; } zvec = (zvec << 1) | zj; } if (zvec - gBase[zn] < 0 || zvec - gBase[zn] >= BZ_MAX_ALPHA_SIZE) { retVal = BZ_DATA_ERROR; goto save_state_and_return; } nextSym = gPerm[zvec - gBase[zn]]; continue; } } /* Now we know what nblock is, we can do a better sanity check on s->origPtr. */ if (s->origPtr < 0 || s->origPtr >= nblock) { retVal = BZ_DATA_ERROR; goto save_state_and_return; } s->state_out_len = 0; s->state_out_ch = 0; s->calculatedBlockCRC = 0xffffffffL; s->state = BZ_X_OUTPUT; /*-- Set up cftab to facilitate generation of T^(-1) --*/ s->cftab[0] = 0; for (i = 1; i <= 256; i++) { s->cftab[i] = s->unzftab[i-1]; } for (i = 1; i <= 256; i++) { s->cftab[i] += s->cftab[i-1]; } /*-- compute the T^(-1) vector --*/ for (i = 0; i < nblock; i++) { uc = (unsigned char)(s->tt[i] & 0xff); s->tt[s->cftab[uc]] |= (i << 8); s->cftab[uc]++; } s->tPos = s->tt[s->origPtr] >> 8; s->nblock_used = 0; if (s->blockRandomised) { s->rNToGo = 0; s->rTPos = 0; s->k0 = bz_get_fast(s); s->nblock_used++; bz_rand_udp_mask(s); s->k0 ^= ((s->rNToGo == 1) ? 1 : 0); } else { s->k0 = bz_get_fast(s); s->nblock_used++; } retVal = BZ_OK; goto save_state_and_return;endhdr_2: case BZ_X_ENDHDR_2: s->state = BZ_X_ENDHDR_2; if (! get_bits(s, &uc, 8)) { retVal = BZ_OK; goto save_state_and_return; } if (uc != 0x72) { retVal = BZ_DATA_ERROR; goto save_state_and_return; } case BZ_X_ENDHDR_3: s->state = BZ_X_ENDHDR_3; if (! get_bits(s, &uc, 8)) { retVal = BZ_OK; goto save_state_and_return; } if (uc != 0x45) { retVal = BZ_DATA_ERROR; goto save_state_and_return; } case BZ_X_ENDHDR_4: s->state = BZ_X_ENDHDR_4; if (! get_bits(s, &uc, 8)) { retVal = BZ_OK; goto save_state_and_return; } if (uc != 0x38) { retVal = BZ_DATA_ERROR; goto save_state_and_return; } case BZ_X_ENDHDR_5: s->state = BZ_X_ENDHDR_5; if (! get_bits(s, &uc, 8)) { retVal = BZ_OK; goto save_state_and_return; } if (uc != 0x50) { retVal = BZ_DATA_ERROR; goto save_state_and_return; } case BZ_X_ENDHDR_6: s->state = BZ_X_ENDHDR_6; if (! get_bits(s, &uc, 8)) { retVal = BZ_OK; goto save_state_and_return; } if (uc != 0x90) { retVal = BZ_DATA_ERROR; goto save_state_and_return; } s->storedCombinedCRC = 0; case BZ_X_CCRC_1: s->state = BZ_X_CCRC_1; if (! get_bits(s, &uc, 8)) { retVal = BZ_OK; goto save_state_and_return; } s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((unsigned int)uc); case BZ_X_CCRC_2: s->state = BZ_X_CCRC_2; if (! get_bits(s, &uc, 8)) { retVal = BZ_OK; goto save_state_and_return; } s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((unsigned int)uc);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -