Lines Matching refs:lz
290 lz_flush(struct lz_decoder *lz) in lz_flush() argument
292 off_t offs = lz->pos - lz->spos; in lz_flush()
297 lz_crc_update(&lz->crc, lz->obuf + lz->spos, size); in lz_flush()
298 if (fwrite(lz->obuf + lz->spos, 1, size, lz->fout) != size) in lz_flush()
301 lz->wrapped = lz->pos >= lz->dict_size; in lz_flush()
302 if (lz->wrapped) { in lz_flush()
303 lz->ppos += lz->pos; in lz_flush()
304 lz->pos = 0; in lz_flush()
306 lz->spos = lz->pos; in lz_flush()
311 lz_destroy(struct lz_decoder *lz) in lz_destroy() argument
313 if (lz->fin) in lz_destroy()
314 fclose(lz->fin); in lz_destroy()
315 if (lz->fout) in lz_destroy()
316 fclose(lz->fout); in lz_destroy()
317 free(lz->obuf); in lz_destroy()
321 lz_create(struct lz_decoder *lz, int fin, int fdout, int dict_size) in lz_create() argument
323 memset(lz, 0, sizeof(*lz)); in lz_create()
325 lz->fin = fdopen(dup(fin), "r"); in lz_create()
326 if (lz->fin == NULL) in lz_create()
329 lz->fout = fdopen(dup(fdout), "w"); in lz_create()
330 if (lz->fout == NULL) in lz_create()
333 lz->pos = lz->ppos = lz->spos = 0; in lz_create()
334 lz->crc = ~0; in lz_create()
335 lz->dict_size = dict_size; in lz_create()
336 lz->wrapped = false; in lz_create()
338 lz->obuf = malloc(dict_size); in lz_create()
339 if (lz->obuf == NULL) in lz_create()
342 if (lz_rd_create(&lz->rdec, lz->fin) == -1) in lz_create()
346 lz_destroy(lz); in lz_create()
351 lz_peek(const struct lz_decoder *lz, unsigned ahead) in lz_peek() argument
353 off_t diff = lz->pos - ahead - 1; in lz_peek()
356 return lz->obuf[diff]; in lz_peek()
358 if (lz->wrapped) in lz_peek()
359 return lz->obuf[lz->dict_size + diff]; in lz_peek()
365 lz_put(struct lz_decoder *lz, uint8_t b) in lz_put() argument
367 lz->obuf[lz->pos++] = b; in lz_put()
368 if (lz->dict_size == lz->pos) in lz_put()
369 lz_flush(lz); in lz_put()
373 lz_get_data_position(const struct lz_decoder *lz) in lz_get_data_position() argument
375 return lz->ppos + lz->pos; in lz_get_data_position()
379 lz_get_crc(const struct lz_decoder *lz) in lz_get_crc() argument
381 return lz->crc ^ 0xffffffffU; in lz_get_crc()
407 lz_decode_member(struct lz_decoder *lz) in lz_decode_member() argument
431 struct lz_range_decoder *rd = &lz->rdec; in lz_decode_member()
437 while (!feof(lz->fin) && !ferror(lz->fin)) { in lz_decode_member()
438 const int pos_state = lz_get_data_position(lz) & POS_STATE_MASK; in lz_decode_member()
441 const uint8_t prev_byte = lz_peek(lz, 0); in lz_decode_member()
446 lz_put(lz, lz_rd_decode_tree(rd, bm, 8)); in lz_decode_member()
448 int peek = lz_peek(lz, rep[0]); in lz_decode_member()
449 lz_put(lz, lz_rd_decode_matched(rd, bm, peek)); in lz_decode_member()
464 lz_put(lz, lz_peek(lz, rep[0])); in lz_decode_member()
512 lz_flush(lz); in lz_decode_member()
518 if (rep[0] >= lz->dict_size || in lz_decode_member()
519 (rep[0] >= lz->pos && !lz->wrapped)) { in lz_decode_member()
520 lz_flush(lz); in lz_decode_member()
525 lz_put(lz, lz_peek(lz, rep[0])); in lz_decode_member()
527 lz_flush(lz); in lz_decode_member()
542 struct lz_decoder lz; in lz_decode() local
545 if (lz_create(&lz, fin, fdout, dict_size) == -1) in lz_decode()
548 if (!lz_decode_member(&lz)) in lz_decode()
554 trailer[i] = (uint8_t)getc(lz.fin); in lz_decode()
568 if (crc != lz_get_crc(&lz) || data_size != lz_get_data_position(&lz)) in lz_decode()
580 rv = ftello(lz.fout); in lz_decode()
585 lz_destroy(&lz); in lz_decode()