Lines Matching refs:bd
110 static unsigned int get_bits(struct bunzip_data *bd, char bits_wanted)
116 while (bd->inbufBitCount < bits_wanted) {
119 if (bd->inbufPos == bd->inbufCount) {
120 if (0 >= (bd->inbufCount = read(bd->in_fd, bd->inbuf, IOBUF_SIZE)))
122 bd->inbufPos = 0;
126 if (bd->inbufBitCount>=24) {
127 bits = bd->inbufBits&((1<<bd->inbufBitCount)-1);
128 bits_wanted -= bd->inbufBitCount;
130 bd->inbufBitCount = 0;
134 bd->inbufBits = (bd->inbufBits<<8) | bd->inbuf[bd->inbufPos++];
135 bd->inbufBitCount += 8;
139 bd->inbufBitCount -= bits_wanted;
140 bits |= (bd->inbufBits>>bd->inbufBitCount) & ((1<<bits_wanted)-1);
161 static int read_block_header(struct bunzip_data *bd, struct bwdata *bw)
168 ii = get_bits(bd, 24);
169 jj = get_bits(bd, 24);
170 bw->headerCRC = get_bits(bd,32);
179 if (get_bits(bd,1)) return RETVAL_OBSOLETE_INPUT;
180 if ((bw->origPtr = get_bits(bd,24)) > bd->dbufSize) return RETVAL_DATA_ERROR;
187 hh = get_bits(bd, 16);
188 bd->symTotal = 0;
191 kk = get_bits(bd, 16);
194 bd->symToByte[bd->symTotal++] = (16 * ii) + jj;
199 bd->groupCount = get_bits(bd,3);
200 if (bd->groupCount<2 || bd->groupCount>MAX_GROUPS) return RETVAL_DATA_ERROR;
209 if (!(bd->nSelectors = get_bits(bd, 15))) return RETVAL_DATA_ERROR;
210 for (ii=0; ii<bd->groupCount; ii++) bd->mtfSymbol[ii] = ii;
211 for (ii=0; ii<bd->nSelectors; ii++) {
214 for(jj=0;get_bits(bd,1);jj++)
215 if (jj>=bd->groupCount) return RETVAL_DATA_ERROR;
218 uc = bd->mtfSymbol[jj];
219 memmove(bd->mtfSymbol+1, bd->mtfSymbol, jj);
220 bd->mtfSymbol[0] = bd->selectors[ii] = uc;
225 symCount = bd->symTotal+2;
226 for (jj=0; jj<bd->groupCount; jj++) {
232 hh = get_bits(bd, 5);
240 kk = get_bits(bd, 2);
243 bd->inbufBitCount++;
272 hufGroup = bd->groups+jj;
319 static int read_huffman_data(struct bunzip_data *bd, struct bwdata *bw)
335 bd->mtfSymbol[ii] = ii;
352 if (selector >= bd->nSelectors) return RETVAL_DATA_ERROR;
353 hufGroup = bd->groups + bd->selectors[selector++];
360 jj = get_bits(bd, ii);
367 kk = bd->inbufBitCount
368 ? (bd->inbufBits >> --(bd->inbufBitCount)) & 1 : get_bits(bd, 1);
405 if (hh>bd->dbufSize || dbufCount+hh>bd->dbufSize)
408 uc = bd->symToByte[bd->mtfSymbol[0]];
414 if (nextSym>bd->symTotal) break;
422 if (dbufCount>=bd->dbufSize) return RETVAL_DATA_ERROR;
424 uc = bd->mtfSymbol[ii];
427 while(ii--) bd->mtfSymbol[ii+1] = bd->mtfSymbol[ii];
428 bd->mtfSymbol[0] = uc;
429 uc = bd->symToByte[uc];
443 static void flush_bunzip_outbuf(struct bunzip_data *bd, int out_fd)
445 if (bd->outbufPos) {
446 if (write(out_fd, bd->outbuf, bd->outbufPos) != bd->outbufPos)
448 bd->outbufPos = 0;
452 static void burrows_wheeler_prep(struct bunzip_data *bd, struct bwdata *bw)
493 static int read_bunzip_data(struct bunzip_data *bd)
495 int rc = read_block_header(bd, bd->bwdata);
496 if (!rc) rc=read_huffman_data(bd, bd->bwdata);
499 burrows_wheeler_prep(bd, bd->bwdata);
512 static int write_bunzip_data(struct bunzip_data *bd, struct bwdata *bw,
524 int i = read_bunzip_data(bd);
542 if (len && bd->outbufPos >= len) goto dataus_interruptus;
564 if (bd->outbufPos == IOBUF_SIZE) flush_bunzip_outbuf(bd, out_fd);
565 bd->outbuf[bd->outbufPos++] = outbyte;
567 ^ bd->crc32Table[(bw->dataCRC >> 24) ^ outbyte];
574 bd->totalCRC = ((bd->totalCRC << 1) | (bd->totalCRC >> 31)) ^ bw->dataCRC;
578 bd->totalCRC = bw->headerCRC+1;
585 gotcount += bd->outbufPos;
586 memcpy(outbuf, bd->outbuf, len);
589 if ((len -= bd->outbufPos)<1) {
590 bd->outbufPos -= len;
591 if (bd->outbufPos) memmove(bd->outbuf, bd->outbuf+len, bd->outbufPos);
607 struct bunzip_data *bd;
615 bd = *bdp = xzalloc(i);
617 bd->inbuf = inbuf;
618 bd->inbufCount = len;
619 bd->in_fd = -1;
621 bd->inbuf = (char *)(bd+1);
622 bd->in_fd = src_fd;
625 crc_init(bd->crc32Table, 0);
628 for (i=0;i<3;i++) if (get_bits(bd,8)!="BZh"[i]) return RETVAL_NOT_BZIP_DATA;
632 i = get_bits(bd, 8);
634 bd->dbufSize = 100000*(i-'0')*THREADS;
636 bd->bwdata[i].dbuf = xmalloc(bd->dbufSize * sizeof(int));
645 struct bunzip_data *bd;
649 if (!(i = start_bunzip(&bd,src_fd, 0, 0))) {
650 i = write_bunzip_data(bd,bd->bwdata, dst_fd, 0, 0);
652 if (bd->bwdata[0].headerCRC==bd->totalCRC) i = 0;
656 flush_bunzip_outbuf(bd, dst_fd);
658 for (j=0; j<THREADS; j++) free(bd->bwdata[j].dbuf);
659 free(bd);