diff options
Diffstat (limited to 'CPP/7zip/Compress/DeflateConst.h')
-rw-r--r-- | CPP/7zip/Compress/DeflateConst.h | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/CPP/7zip/Compress/DeflateConst.h b/CPP/7zip/Compress/DeflateConst.h new file mode 100644 index 0000000..cfbbf88 --- /dev/null +++ b/CPP/7zip/Compress/DeflateConst.h | |||
@@ -0,0 +1,131 @@ | |||
1 | // DeflateConst.h | ||
2 | |||
3 | #ifndef __DEFLATE_CONST_H | ||
4 | #define __DEFLATE_CONST_H | ||
5 | |||
6 | namespace NCompress { | ||
7 | namespace NDeflate { | ||
8 | |||
9 | const unsigned kNumHuffmanBits = 15; | ||
10 | |||
11 | const UInt32 kHistorySize32 = (1 << 15); | ||
12 | const UInt32 kHistorySize64 = (1 << 16); | ||
13 | |||
14 | const unsigned kDistTableSize32 = 30; | ||
15 | const unsigned kDistTableSize64 = 32; | ||
16 | |||
17 | const unsigned kNumLenSymbols32 = 256; | ||
18 | const unsigned kNumLenSymbols64 = 255; // don't change it. It must be <= 255. | ||
19 | const unsigned kNumLenSymbolsMax = kNumLenSymbols32; | ||
20 | |||
21 | const unsigned kNumLenSlots = 29; | ||
22 | |||
23 | const unsigned kFixedDistTableSize = 32; | ||
24 | const unsigned kFixedLenTableSize = 31; | ||
25 | |||
26 | const unsigned kSymbolEndOfBlock = 0x100; | ||
27 | const unsigned kSymbolMatch = kSymbolEndOfBlock + 1; | ||
28 | |||
29 | const unsigned kMainTableSize = kSymbolMatch + kNumLenSlots; | ||
30 | const unsigned kFixedMainTableSize = kSymbolMatch + kFixedLenTableSize; | ||
31 | |||
32 | const unsigned kLevelTableSize = 19; | ||
33 | |||
34 | const unsigned kTableDirectLevels = 16; | ||
35 | const unsigned kTableLevelRepNumber = kTableDirectLevels; | ||
36 | const unsigned kTableLevel0Number = kTableLevelRepNumber + 1; | ||
37 | const unsigned kTableLevel0Number2 = kTableLevel0Number + 1; | ||
38 | |||
39 | const unsigned kLevelMask = 0xF; | ||
40 | |||
41 | const Byte kLenStart32[kFixedLenTableSize] = | ||
42 | {0,1,2,3,4,5,6,7,8,10,12,14,16,20,24,28,32,40,48,56,64,80,96,112,128,160,192,224, 255, 0, 0}; | ||
43 | const Byte kLenStart64[kFixedLenTableSize] = | ||
44 | {0,1,2,3,4,5,6,7,8,10,12,14,16,20,24,28,32,40,48,56,64,80,96,112,128,160,192,224, 0, 0, 0}; | ||
45 | |||
46 | const Byte kLenDirectBits32[kFixedLenTableSize] = | ||
47 | {0,0,0,0,0,0,0,0,1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 0, 0}; | ||
48 | const Byte kLenDirectBits64[kFixedLenTableSize] = | ||
49 | {0,0,0,0,0,0,0,0,1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 16, 0, 0}; | ||
50 | |||
51 | const UInt32 kDistStart[kDistTableSize64] = | ||
52 | {0,1,2,3,4,6,8,12,16,24,32,48,64,96,128,192,256,384,512,768, | ||
53 | 1024,1536,2048,3072,4096,6144,8192,12288,16384,24576,32768,49152}; | ||
54 | const Byte kDistDirectBits[kDistTableSize64] = | ||
55 | {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,14,14}; | ||
56 | |||
57 | const Byte kLevelDirectBits[3] = {2, 3, 7}; | ||
58 | |||
59 | const Byte kCodeLengthAlphabetOrder[kLevelTableSize] = {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; | ||
60 | |||
61 | const unsigned kMatchMinLen = 3; | ||
62 | const unsigned kMatchMaxLen32 = kNumLenSymbols32 + kMatchMinLen - 1; // 256 + 2 | ||
63 | const unsigned kMatchMaxLen64 = kNumLenSymbols64 + kMatchMinLen - 1; // 255 + 2 | ||
64 | const unsigned kMatchMaxLen = kMatchMaxLen32; | ||
65 | |||
66 | const unsigned kFinalBlockFieldSize = 1; | ||
67 | |||
68 | namespace NFinalBlockField | ||
69 | { | ||
70 | enum | ||
71 | { | ||
72 | kNotFinalBlock = 0, | ||
73 | kFinalBlock = 1 | ||
74 | }; | ||
75 | } | ||
76 | |||
77 | const unsigned kBlockTypeFieldSize = 2; | ||
78 | |||
79 | namespace NBlockType | ||
80 | { | ||
81 | enum | ||
82 | { | ||
83 | kStored = 0, | ||
84 | kFixedHuffman = 1, | ||
85 | kDynamicHuffman = 2 | ||
86 | }; | ||
87 | } | ||
88 | |||
89 | const unsigned kNumLenCodesFieldSize = 5; | ||
90 | const unsigned kNumDistCodesFieldSize = 5; | ||
91 | const unsigned kNumLevelCodesFieldSize = 4; | ||
92 | |||
93 | const unsigned kNumLitLenCodesMin = 257; | ||
94 | const unsigned kNumDistCodesMin = 1; | ||
95 | const unsigned kNumLevelCodesMin = 4; | ||
96 | |||
97 | const unsigned kLevelFieldSize = 3; | ||
98 | |||
99 | const unsigned kStoredBlockLengthFieldSize = 16; | ||
100 | |||
101 | struct CLevels | ||
102 | { | ||
103 | Byte litLenLevels[kFixedMainTableSize]; | ||
104 | Byte distLevels[kFixedDistTableSize]; | ||
105 | |||
106 | void SubClear() | ||
107 | { | ||
108 | unsigned i; | ||
109 | for (i = kNumLitLenCodesMin; i < kFixedMainTableSize; i++) | ||
110 | litLenLevels[i] = 0; | ||
111 | for (i = 0; i < kFixedDistTableSize; i++) | ||
112 | distLevels[i] = 0; | ||
113 | } | ||
114 | |||
115 | void SetFixedLevels() | ||
116 | { | ||
117 | unsigned i = 0; | ||
118 | |||
119 | for (; i < 144; i++) litLenLevels[i] = 8; | ||
120 | for (; i < 256; i++) litLenLevels[i] = 9; | ||
121 | for (; i < 280; i++) litLenLevels[i] = 7; | ||
122 | for (; i < 288; i++) litLenLevels[i] = 8; | ||
123 | |||
124 | for (i = 0; i < kFixedDistTableSize; i++) // test it: InfoZip only uses kDistTableSize | ||
125 | distLevels[i] = 5; | ||
126 | } | ||
127 | }; | ||
128 | |||
129 | }} | ||
130 | |||
131 | #endif | ||