aboutsummaryrefslogtreecommitdiff
path: root/src/liblzma/lzma/lzma_common.h
blob: d4873cf8f7c4cdae503e177923ac6829cf843437 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
///////////////////////////////////////////////////////////////////////////////
//
/// \file       lzma_common.h
/// \brief      Private definitions common to 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_LZMA_COMMON_H
#define LZMA_LZMA_COMMON_H

#include "common.h"
#include "lzma_literal.h"
#include "range_common.h"


///////////////
// Constants //
///////////////

#define REP_DISTANCES 4
#define STATES 12
#define LIT_STATES 7

#define POS_SLOT_BITS 6
#define DICT_LOG_SIZE_MAX 30
#define DIST_TABLE_SIZE_MAX (DICT_LOG_SIZE_MAX * 2)
#if (UINT32_C(1) << DICT_LOG_SIZE_MAX) != LZMA_DICTIONARY_SIZE_MAX
#	error DICT_LOG_SIZE_MAX is inconsistent with LZMA_DICTIONARY_SIZE_MAX
#endif

// 2 is for speed optimization
#define LEN_TO_POS_STATES_BITS 2
#define LEN_TO_POS_STATES (1 << LEN_TO_POS_STATES_BITS)

#define MATCH_MIN_LEN 2

#define ALIGN_BITS 4
#define ALIGN_TABLE_SIZE (1 << ALIGN_BITS)
#define ALIGN_MASK (ALIGN_TABLE_SIZE - 1)

#define START_POS_MODEL_INDEX 4
#define END_POS_MODEL_INDEX 14
#define POS_MODELS (END_POS_MODEL_INDEX - START_POS_MODEL_INDEX)

#define FULL_DISTANCES (1 << (END_POS_MODEL_INDEX / 2))

#define LIT_POS_STATES_BITS_MAX LZMA_LITERAL_POS_BITS_MAX
#define LIT_CONTEXT_BITS_MAX LZMA_LITERAL_CONTEXT_BITS_MAX

#define POS_STATES_BITS_MAX LZMA_POS_BITS_MAX
#define POS_STATES_MAX (1 << POS_STATES_BITS_MAX)


// Length coder & Length price table encoder
#define LEN_LOW_BITS 3
#define LEN_LOW_SYMBOLS (1 << LEN_LOW_BITS)
#define LEN_MID_BITS 3
#define LEN_MID_SYMBOLS (1 << LEN_MID_BITS)
#define LEN_HIGH_BITS 8
#define LEN_HIGH_SYMBOLS (1 << LEN_HIGH_BITS)
#define LEN_SYMBOLS (LEN_LOW_SYMBOLS + LEN_MID_SYMBOLS + LEN_HIGH_SYMBOLS)
#define LEN_SPEC_SYMBOLS (LOW_LOW_SYMBOLS + LEN_MID_LEN_SYMBOLS)
#define MATCH_MAX_LEN (MATCH_MIN_LEN + LEN_SYMBOLS - 1)

// Total number of probs in a Len Encoder
#define LEN_CODER_TOTAL_PROBS (LEN_HIGH_CODER + LEN_HIGH_SYMBOLS)

// Price table size of Len Encoder
#define LEN_PRICES (LEN_SYMBOLS << POS_STATES_BITS_MAX)

// Special lengths used together with distance == UINT32_MAX
#define LEN_SPECIAL_EOPM MATCH_MIN_LEN
#define LEN_SPECIAL_FLUSH (LEN_SPECIAL_EOPM + 1)


// Optimal - Number of entries in the optimum array.
#define OPTS (1 << 12)


// Miscellaneous
#define INFINITY_PRICE 0x0FFFFFFF


////////////
// Macros //
////////////

#define get_len_to_pos_state(len) \
	((len) < LEN_TO_POS_STATES + MATCH_MIN_LEN \
		? (len) - MATCH_MIN_LEN \
		: LEN_TO_POS_STATES - 1)


///////////
// State //
///////////

// Used for updating strm->data->state in both encoder and decoder.

#define update_char(index) \
	index = ((index) < 4 \
			? 0 \
			: ((index) < 10 \
				? (index) - 3 \
				: (index) - 6))

#define update_match(index) \
	index = ((index) < LIT_STATES ? 7 : 10)

#define update_rep(index) \
	index = ((index) < LIT_STATES ? 8 : 11)

#define update_short_rep(index) \
	index = ((index) < LIT_STATES ? 9 : 11)

#define is_char_state(index) \
	((index) < LIT_STATES)

#endif