- return 0;
-}
-
-static void
-lzms_init_decompressor(struct lzms_decompressor *d, const void *in,
- size_t in_nbytes, unsigned num_offset_slots)
-{
- /* Match offset LRU queues */
- for (int i = 0; i < LZMS_NUM_LZ_REPS + 1; i++)
- d->recent_lz_offsets[i] = i + 1;
- for (int i = 0; i < LZMS_NUM_DELTA_REPS + 1; i++)
- d->recent_delta_pairs[i] = i + 1;
- d->pending_lz_offset = 0;
- d->pending_delta_pair = 0;
-
- /* Range decoding */
-
- lzms_range_decoder_init(&d->rd, in, in_nbytes / sizeof(le16));
-
- d->main_state = 0;
- lzms_init_probability_entries(d->main_probs, LZMS_NUM_MAIN_PROBS);
-
- d->match_state = 0;
- lzms_init_probability_entries(d->match_probs, LZMS_NUM_MATCH_PROBS);
-
- d->lz_state = 0;
- lzms_init_probability_entries(d->lz_probs, LZMS_NUM_LZ_PROBS);
-
- for (int i = 0; i < LZMS_NUM_LZ_REP_DECISIONS; i++) {
- d->lz_rep_states[i] = 0;
- lzms_init_probability_entries(d->lz_rep_probs[i],
- LZMS_NUM_LZ_REP_PROBS);
- }
-
- d->delta_state = 0;
- lzms_init_probability_entries(d->delta_probs, LZMS_NUM_DELTA_PROBS);
-
- for (int i = 0; i < LZMS_NUM_DELTA_REP_DECISIONS; i++) {
- d->delta_rep_states[i] = 0;
- lzms_init_probability_entries(d->delta_rep_probs[i],
- LZMS_NUM_DELTA_REP_PROBS);
- }
-
- /* Huffman decoding */
-
- lzms_input_bitstream_init(&d->is, in, in_nbytes / sizeof(le16));
-
- lzms_init_huffman_code(&d->literal_rebuild_info,
- LZMS_NUM_LITERAL_SYMS,
- LZMS_LITERAL_CODE_REBUILD_FREQ,
- d->codewords,
- d->literal_freqs,
- d->literal_decode_table,
- LZMS_LITERAL_TABLEBITS);
-
- lzms_init_huffman_code(&d->lz_offset_rebuild_info,
- num_offset_slots,
- LZMS_LZ_OFFSET_CODE_REBUILD_FREQ,
- d->codewords,
- d->lz_offset_freqs,
- d->lz_offset_decode_table,
- LZMS_LZ_OFFSET_TABLEBITS);
-
- lzms_init_huffman_code(&d->length_rebuild_info,
- LZMS_NUM_LENGTH_SYMS,
- LZMS_LENGTH_CODE_REBUILD_FREQ,
- d->codewords,
- d->length_freqs,
- d->length_decode_table,
- LZMS_LENGTH_TABLEBITS);
-
- lzms_init_huffman_code(&d->delta_offset_rebuild_info,
- num_offset_slots,
- LZMS_DELTA_OFFSET_CODE_REBUILD_FREQ,
- d->codewords,
- d->delta_offset_freqs,
- d->delta_offset_decode_table,
- LZMS_DELTA_OFFSET_TABLEBITS);
-
- lzms_init_huffman_code(&d->delta_power_rebuild_info,
- LZMS_NUM_DELTA_POWER_SYMS,
- LZMS_DELTA_POWER_CODE_REBUILD_FREQ,
- d->codewords,
- d->delta_power_freqs,
- d->delta_power_decode_table,
- LZMS_DELTA_POWER_TABLEBITS);
-}
-
-static int
-lzms_create_decompressor(size_t max_bufsize, void **d_ret)
-{
- struct lzms_decompressor *d;
-
- if (max_bufsize > LZMS_MAX_BUFFER_SIZE)
- return WIMLIB_ERR_INVALID_PARAM;
-
- d = ALIGNED_MALLOC(sizeof(struct lzms_decompressor),
- DECODE_TABLE_ALIGNMENT);
- if (!d)
- return WIMLIB_ERR_NOMEM;
-
- *d_ret = d;
- return 0;
-}
-
-/*
- * Decompress @in_nbytes bytes of LZMS-compressed data at @in and write the
- * uncompressed data, which had original size @out_nbytes, to @out. Return 0 if
- * successful or -1 if the compressed data is invalid.
- */
-static int
-lzms_decompress(const void *in, size_t in_nbytes, void *out, size_t out_nbytes,
- void *_d)
-{
- struct lzms_decompressor *d = _d;
-
- /*
- * Requirements on the compressed data:
- *
- * 1. LZMS-compressed data is a series of 16-bit integers, so the
- * compressed data buffer cannot take up an odd number of bytes.
- * 2. To prevent poor performance on some architectures, we require that
- * the compressed data buffer is 2-byte aligned.
- * 3. There must be at least 4 bytes of compressed data, since otherwise
- * we cannot even initialize the range decoder.
- */
- if ((in_nbytes & 1) || ((uintptr_t)in & 1) || (in_nbytes < 4))
- return -1;
-
- lzms_init_decompressor(d, in, in_nbytes,
- lzms_get_num_offset_slots(out_nbytes));
-
- if (lzms_decode_items(d, out, out_nbytes))
- return -1;