static int tANS_compress_file(FILE* input, FILE *output)
{
- uint32_t i, len, bits, count, len_and_bits;
+ uint32_t i, len, bits, count, bits_and_x;
+ uint16_t u16_len;
uint8_t *read_buf;
uint8_t *write_buf;
double p[N_AUX][N_SYMBOLS] = {0};
st->x += read_buf[len-1];
bits = tANS_rl_encode(st, read_buf, len - 1, write_buf);
- len_and_bits = (len - 1) | (bits << 14);
- if (fwrite(&len_and_bits, sizeof len_and_bits, 1, output) != 1) goto fail;
- if (fwrite(&st->x, sizeof st->x, 1, output) != 1) goto fail;
+ u16_len = (uint16_t) (len - 1);
+ bits_and_x = (st->x & ((1 << LOG2_TBLSZ) - 1)) | (bits << LOG2_TBLSZ);
+ if (fwrite(&u16_len, sizeof u16_len, 1, output) != 1) goto fail;
+ if (fwrite(&bits_and_x, sizeof bits_and_x, 1, output) != 1) goto fail;
if (fwrite(write_buf, (bits + 7) / 8, 1, output) != 1) goto fail;
memset(write_buf, 0, (bits + 7) / 8);
static int tANS_decompress_file(FILE* input, FILE *output)
{
- uint32_t i, len, bits, count, len_and_bits;
+ uint32_t i, len, bits, count, bits_and_x;
+ uint16_t u16_len;
uint8_t *read_buf;
uint8_t *write_buf;
double p[N_AUX][N_SYMBOLS] = {0};
}
tANS_rl_decode_st_init(st, symbol_tbls);
- if (fread(&len_and_bits, sizeof len_and_bits, 1, input) != 1) break;
- len = (len_and_bits & ((1 << 14) - 1)) + 1;
- bits = len_and_bits >> 14;
- if (fread(&st->x, sizeof st->x, 1, input) != 1) goto fail;
+ if (fread(&u16_len, sizeof u16_len, 1, input) != 1) break;
+ if (fread(&bits_and_x, sizeof bits_and_x, 1, input) != 1) goto fail;
+ len = (uint32_t) u16_len + 1;
+ bits = bits_and_x >> LOG2_TBLSZ;
+ st->x = bits_and_x & ((1 << LOG2_TBLSZ) - 1);
if (fread(read_buf + 4, (bits + 7) / 8, 1, input) != 1) goto fail;
- st->x &= symbol_tbls[0].tblsz - 1;
bits = tANS_rl_decode(st, write_buf, len - 1, read_buf + 4, bits);
if (bits != 0) {
fprintf(stderr, "tANS: corrupted file\n");