⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bunzip2.c

📁 这是一个SIGMA方案的PMP播放器的UCLINUX程序,可播放DVD,VCD,CD MP3...有很好的参考价值.
💻 C
📖 第 1 页 / 共 3 页
字号:
			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 + -