blob: 174f5ed462b130950f96f8d0d1ec3e727fea1a44 [file] [log] [blame]
///////////////////////////////////////////////////////////////////////////////
//
/// \file lzma_literal.h
/// \brief Literal Coder
///
/// This is used as is by both LZMA encoder and decoder.
//
// Copyright (C) 1999-2006 Igor Pavlov
// Copyright (C) 2007 Lasse Collin
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
///////////////////////////////////////////////////////////////////////////////
#ifndef LZMA_LITERAL_H
#define LZMA_LITERAL_H
#include "common.h"
// We need typedef of `probability'.
#include "range_common.h"
/// Each literal coder is divided in three sections:
/// - 0x001-0x0FF: Without match byte
/// - 0x101-0x1FF: With match byte; match bit is 0
/// - 0x201-0x2FF: With match byte; match bit is 1
#define LIT_SIZE 0x300
/// Calculate how many states are needed. Each state has
/// LIT_SIZE `probability' variables.
#define literal_states(literal_context_bits, literal_pos_bits) \
(1U << ((literal_context_bits) + (literal_pos_bits)))
/// Locate the literal coder for the next literal byte. The choice depends on
/// - the lowest literal_pos_bits bits of the position of the current
/// byte; and
/// - the highest literal_context_bits bits of the previous byte.
#define literal_get_subcoder(literal_coder, pos, prev_byte) \
(literal_coder)->coders[(((pos) & (literal_coder)->literal_pos_mask) \
<< (literal_coder)->literal_context_bits) \
+ ((prev_byte) >> (8 - (literal_coder)->literal_context_bits))]
typedef struct {
uint32_t literal_context_bits;
uint32_t literal_pos_bits;
/// literal_pos_mask is always (1 << literal_pos_bits) - 1.
uint32_t literal_pos_mask;
/// There are (1 << (literal_pos_bits + literal_context_bits))
/// literal coders.
probability coders[][LIT_SIZE];
} lzma_literal_coder;
extern lzma_ret lzma_literal_init(
lzma_literal_coder **coder, lzma_allocator *allocator,
uint32_t literal_context_bits, uint32_t literal_pos_bits);
extern void lzma_literal_end(
lzma_literal_coder **coder, lzma_allocator *allocator);
#endif