#endif
#include "wimlib.h"
+#include "wimlib/assert.h"
#include "wimlib/compiler.h"
#include "wimlib/compressor_ops.h"
#include "wimlib/compress_common.h"
* lzms_range_encoder_raw. */
struct lzms_range_encoder_raw *rc;
- /* Bits recently encoded by this range encoder. This are used as in
+ /* Bits recently encoded by this range encoder. This is used as an
* index into @prob_entries. */
u32 state;
u8 lens[LZMS_MAX_NUM_SYMS];
/* The codeword of each symbol in the Huffman code. */
- u16 codewords[LZMS_MAX_NUM_SYMS];
+ u32 codewords[LZMS_MAX_NUM_SYMS];
};
/* State of the LZMS compressor. */
/* Main bit: 1 = a match, not a literal. */
lzms_range_encode_bit(&ctx->main_range_encoder, 1);
- /* Match bit: 0 = a LZ match, not a delta match. */
+ /* Match bit: 0 = an LZ match, not a delta match. */
lzms_range_encode_bit(&ctx->match_range_encoder, 0);
/* Determine if the offset can be represented as a recent offset. */
static void
lzms_init_rc_costs(void)
{
- static bool done = false;
- static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
-
- if (unlikely(!done)) {
- pthread_mutex_lock(&mutex);
- if (!done) {
- lzms_do_init_rc_costs();
- done = true;
- }
- pthread_mutex_unlock(&mutex);
- }
+ static pthread_once_t once = PTHREAD_ONCE_INIT;
+
+ pthread_once(&once, lzms_do_init_rc_costs);
}
/*
}
static const struct wimlib_lzms_compressor_params lzms_default = {
- .hdr = sizeof(struct wimlib_lzms_compressor_params),
+ .hdr = {
+ .size = sizeof(struct wimlib_lzms_compressor_params),
+ },
.min_match_length = 2,
.max_match_length = UINT32_MAX,
.nice_match_length = 32,
.optim_array_length = 1024,
};
+static bool
+lzms_params_valid(const struct wimlib_compressor_params_header *);
+
static const struct wimlib_lzms_compressor_params *
lzms_get_params(const struct wimlib_compressor_params_header *_params)
{
if (params == NULL)
params = &lzms_default;
+ LZMS_ASSERT(lzms_params_valid(¶ms->hdr));
+
return params;
}
if (!lz_sarray_init(&ctx->lz_sarray, max_block_size,
params->min_match_length,
- params->max_match_length,
+ min(params->max_match_length, LZ_SARRAY_LEN_MAX),
params->max_search_depth,
params->max_matches_per_pos))
goto oom;