chd 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (109) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +30 -0
  3. data/chd.gemspec +29 -0
  4. data/ext/chd.c +1008 -0
  5. data/ext/extconf.rb +60 -0
  6. data/lib/chd/cd.rb +272 -0
  7. data/lib/chd/metadata.rb +196 -0
  8. data/lib/chd/version.rb +4 -0
  9. data/lib/chd.rb +21 -0
  10. data/libchdr/CMakeLists.txt +104 -0
  11. data/libchdr/LICENSE.txt +24 -0
  12. data/libchdr/README.md +7 -0
  13. data/libchdr/deps/lzma-19.00/CMakeLists.txt +33 -0
  14. data/libchdr/deps/lzma-19.00/LICENSE +3 -0
  15. data/libchdr/deps/lzma-19.00/include/7zTypes.h +375 -0
  16. data/libchdr/deps/lzma-19.00/include/Alloc.h +51 -0
  17. data/libchdr/deps/lzma-19.00/include/Bra.h +64 -0
  18. data/libchdr/deps/lzma-19.00/include/Compiler.h +33 -0
  19. data/libchdr/deps/lzma-19.00/include/CpuArch.h +336 -0
  20. data/libchdr/deps/lzma-19.00/include/Delta.h +19 -0
  21. data/libchdr/deps/lzma-19.00/include/LzFind.h +121 -0
  22. data/libchdr/deps/lzma-19.00/include/LzHash.h +57 -0
  23. data/libchdr/deps/lzma-19.00/include/Lzma86.h +111 -0
  24. data/libchdr/deps/lzma-19.00/include/LzmaDec.h +234 -0
  25. data/libchdr/deps/lzma-19.00/include/LzmaEnc.h +76 -0
  26. data/libchdr/deps/lzma-19.00/include/LzmaLib.h +131 -0
  27. data/libchdr/deps/lzma-19.00/include/Precomp.h +10 -0
  28. data/libchdr/deps/lzma-19.00/include/Sort.h +18 -0
  29. data/libchdr/deps/lzma-19.00/lzma-history.txt +446 -0
  30. data/libchdr/deps/lzma-19.00/lzma.txt +328 -0
  31. data/libchdr/deps/lzma-19.00/lzma.vcxproj +543 -0
  32. data/libchdr/deps/lzma-19.00/lzma.vcxproj.filters +17 -0
  33. data/libchdr/deps/lzma-19.00/src/Alloc.c +455 -0
  34. data/libchdr/deps/lzma-19.00/src/Bra86.c +82 -0
  35. data/libchdr/deps/lzma-19.00/src/BraIA64.c +53 -0
  36. data/libchdr/deps/lzma-19.00/src/CpuArch.c +218 -0
  37. data/libchdr/deps/lzma-19.00/src/Delta.c +64 -0
  38. data/libchdr/deps/lzma-19.00/src/LzFind.c +1127 -0
  39. data/libchdr/deps/lzma-19.00/src/Lzma86Dec.c +54 -0
  40. data/libchdr/deps/lzma-19.00/src/LzmaDec.c +1185 -0
  41. data/libchdr/deps/lzma-19.00/src/LzmaEnc.c +1330 -0
  42. data/libchdr/deps/lzma-19.00/src/Sort.c +141 -0
  43. data/libchdr/deps/zlib-1.2.11/CMakeLists.txt +29 -0
  44. data/libchdr/deps/zlib-1.2.11/ChangeLog +1515 -0
  45. data/libchdr/deps/zlib-1.2.11/FAQ +368 -0
  46. data/libchdr/deps/zlib-1.2.11/INDEX +68 -0
  47. data/libchdr/deps/zlib-1.2.11/Makefile +5 -0
  48. data/libchdr/deps/zlib-1.2.11/Makefile.in +410 -0
  49. data/libchdr/deps/zlib-1.2.11/README +115 -0
  50. data/libchdr/deps/zlib-1.2.11/adler32.c +186 -0
  51. data/libchdr/deps/zlib-1.2.11/compress.c +86 -0
  52. data/libchdr/deps/zlib-1.2.11/configure +921 -0
  53. data/libchdr/deps/zlib-1.2.11/crc32.c +442 -0
  54. data/libchdr/deps/zlib-1.2.11/crc32.h +441 -0
  55. data/libchdr/deps/zlib-1.2.11/deflate.c +2163 -0
  56. data/libchdr/deps/zlib-1.2.11/deflate.h +349 -0
  57. data/libchdr/deps/zlib-1.2.11/doc/algorithm.txt +209 -0
  58. data/libchdr/deps/zlib-1.2.11/doc/rfc1950.txt +619 -0
  59. data/libchdr/deps/zlib-1.2.11/doc/rfc1951.txt +955 -0
  60. data/libchdr/deps/zlib-1.2.11/doc/rfc1952.txt +675 -0
  61. data/libchdr/deps/zlib-1.2.11/doc/txtvsbin.txt +107 -0
  62. data/libchdr/deps/zlib-1.2.11/gzclose.c +25 -0
  63. data/libchdr/deps/zlib-1.2.11/gzguts.h +218 -0
  64. data/libchdr/deps/zlib-1.2.11/gzlib.c +637 -0
  65. data/libchdr/deps/zlib-1.2.11/gzread.c +654 -0
  66. data/libchdr/deps/zlib-1.2.11/gzwrite.c +665 -0
  67. data/libchdr/deps/zlib-1.2.11/infback.c +640 -0
  68. data/libchdr/deps/zlib-1.2.11/inffast.c +323 -0
  69. data/libchdr/deps/zlib-1.2.11/inffast.h +11 -0
  70. data/libchdr/deps/zlib-1.2.11/inffixed.h +94 -0
  71. data/libchdr/deps/zlib-1.2.11/inflate.c +1561 -0
  72. data/libchdr/deps/zlib-1.2.11/inflate.h +125 -0
  73. data/libchdr/deps/zlib-1.2.11/inftrees.c +304 -0
  74. data/libchdr/deps/zlib-1.2.11/inftrees.h +62 -0
  75. data/libchdr/deps/zlib-1.2.11/make_vms.com +867 -0
  76. data/libchdr/deps/zlib-1.2.11/treebuild.xml +116 -0
  77. data/libchdr/deps/zlib-1.2.11/trees.c +1203 -0
  78. data/libchdr/deps/zlib-1.2.11/trees.h +128 -0
  79. data/libchdr/deps/zlib-1.2.11/uncompr.c +93 -0
  80. data/libchdr/deps/zlib-1.2.11/zconf.h +534 -0
  81. data/libchdr/deps/zlib-1.2.11/zconf.h.cmakein +536 -0
  82. data/libchdr/deps/zlib-1.2.11/zconf.h.in +534 -0
  83. data/libchdr/deps/zlib-1.2.11/zlib.3 +149 -0
  84. data/libchdr/deps/zlib-1.2.11/zlib.3.pdf +0 -0
  85. data/libchdr/deps/zlib-1.2.11/zlib.h +1912 -0
  86. data/libchdr/deps/zlib-1.2.11/zlib.map +94 -0
  87. data/libchdr/deps/zlib-1.2.11/zlib.pc.cmakein +13 -0
  88. data/libchdr/deps/zlib-1.2.11/zlib.pc.in +13 -0
  89. data/libchdr/deps/zlib-1.2.11/zlib2ansi +152 -0
  90. data/libchdr/deps/zlib-1.2.11/zutil.c +325 -0
  91. data/libchdr/deps/zlib-1.2.11/zutil.h +271 -0
  92. data/libchdr/include/dr_libs/dr_flac.h +12280 -0
  93. data/libchdr/include/libchdr/bitstream.h +43 -0
  94. data/libchdr/include/libchdr/cdrom.h +110 -0
  95. data/libchdr/include/libchdr/chd.h +427 -0
  96. data/libchdr/include/libchdr/chdconfig.h +10 -0
  97. data/libchdr/include/libchdr/coretypes.h +60 -0
  98. data/libchdr/include/libchdr/flac.h +50 -0
  99. data/libchdr/include/libchdr/huffman.h +90 -0
  100. data/libchdr/pkg-config.pc.in +10 -0
  101. data/libchdr/src/libchdr_bitstream.c +125 -0
  102. data/libchdr/src/libchdr_cdrom.c +415 -0
  103. data/libchdr/src/libchdr_chd.c +2744 -0
  104. data/libchdr/src/libchdr_flac.c +302 -0
  105. data/libchdr/src/libchdr_huffman.c +545 -0
  106. data/libchdr/src/link.T +5 -0
  107. data/libchdr/tests/CMakeLists.txt +2 -0
  108. data/libchdr/tests/benchmark.c +52 -0
  109. metadata +183 -0
@@ -0,0 +1,1330 @@
1
+ /* LzmaEnc.c -- LZMA Encoder
2
+ 2019-01-10: Igor Pavlov : Public domain */
3
+
4
+ #include "Precomp.h"
5
+
6
+ #include <string.h>
7
+
8
+ /* #define SHOW_STAT */
9
+ /* #define SHOW_STAT2 */
10
+
11
+ #if defined(SHOW_STAT) || defined(SHOW_STAT2)
12
+ #include <stdio.h>
13
+ #endif
14
+
15
+ #include "LzmaEnc.h"
16
+
17
+ #include "LzFind.h"
18
+ #ifndef _7ZIP_ST
19
+ #include "LzFindMt.h"
20
+ #endif
21
+
22
+ #ifdef SHOW_STAT
23
+ static unsigned g_STAT_OFFSET = 0;
24
+ #endif
25
+
26
+ #define kLzmaMaxHistorySize ((UInt32)3 << 29)
27
+ /* #define kLzmaMaxHistorySize ((UInt32)7 << 29) */
28
+
29
+ #define kNumTopBits 24
30
+ #define kTopValue ((UInt32)1 << kNumTopBits)
31
+
32
+ #define kNumBitModelTotalBits 11
33
+ #define kBitModelTotal (1 << kNumBitModelTotalBits)
34
+ #define kNumMoveBits 5
35
+ #define kProbInitValue (kBitModelTotal >> 1)
36
+
37
+ #define kNumMoveReducingBits 4
38
+ #define kNumBitPriceShiftBits 4
39
+ #define kBitPrice (1 << kNumBitPriceShiftBits)
40
+
41
+ #define REP_LEN_COUNT 64
42
+
43
+ void LzmaEncProps_Init(CLzmaEncProps *p)
44
+ {
45
+ p->level = 5;
46
+ p->dictSize = p->mc = 0;
47
+ p->reduceSize = (UInt64)(Int64)-1;
48
+ p->lc = p->lp = p->pb = p->algo = p->fb = p->btMode = p->numHashBytes = p->numThreads = -1;
49
+ p->writeEndMark = 0;
50
+ }
51
+
52
+ void LzmaEncProps_Normalize(CLzmaEncProps *p)
53
+ {
54
+ int level = p->level;
55
+ if (level < 0) level = 5;
56
+ p->level = level;
57
+
58
+ if (p->dictSize == 0) p->dictSize = (level <= 5 ? (1 << (level * 2 + 14)) : (level <= 7 ? (1 << 25) : (1 << 26)));
59
+ if (p->dictSize > p->reduceSize)
60
+ {
61
+ unsigned i;
62
+ UInt32 reduceSize = (UInt32)p->reduceSize;
63
+ for (i = 11; i <= 30; i++)
64
+ {
65
+ if (reduceSize <= ((UInt32)2 << i)) { p->dictSize = ((UInt32)2 << i); break; }
66
+ if (reduceSize <= ((UInt32)3 << i)) { p->dictSize = ((UInt32)3 << i); break; }
67
+ }
68
+ }
69
+
70
+ if (p->lc < 0) p->lc = 3;
71
+ if (p->lp < 0) p->lp = 0;
72
+ if (p->pb < 0) p->pb = 2;
73
+
74
+ if (p->algo < 0) p->algo = (level < 5 ? 0 : 1);
75
+ if (p->fb < 0) p->fb = (level < 7 ? 32 : 64);
76
+ if (p->btMode < 0) p->btMode = (p->algo == 0 ? 0 : 1);
77
+ if (p->numHashBytes < 0) p->numHashBytes = 4;
78
+ if (p->mc == 0) p->mc = (16 + (p->fb >> 1)) >> (p->btMode ? 0 : 1);
79
+
80
+ if (p->numThreads < 0)
81
+ p->numThreads =
82
+ #ifndef _7ZIP_ST
83
+ ((p->btMode && p->algo) ? 2 : 1);
84
+ #else
85
+ 1;
86
+ #endif
87
+ }
88
+
89
+ UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2)
90
+ {
91
+ CLzmaEncProps props = *props2;
92
+ LzmaEncProps_Normalize(&props);
93
+ return props.dictSize;
94
+ }
95
+
96
+ #if (_MSC_VER >= 1400)
97
+ /* BSR code is fast for some new CPUs */
98
+ /* #define LZMA_LOG_BSR */
99
+ #endif
100
+
101
+ #ifdef LZMA_LOG_BSR
102
+
103
+ #define kDicLogSizeMaxCompress 32
104
+
105
+ #define BSR2_RET(pos, res) { unsigned long zz; _BitScanReverse(&zz, (pos)); res = (zz + zz) + ((pos >> (zz - 1)) & 1); }
106
+
107
+ static unsigned GetPosSlot1(UInt32 pos)
108
+ {
109
+ unsigned res;
110
+ BSR2_RET(pos, res);
111
+ return res;
112
+ }
113
+ #define GetPosSlot2(pos, res) { BSR2_RET(pos, res); }
114
+ #define GetPosSlot(pos, res) { if (pos < 2) res = pos; else BSR2_RET(pos, res); }
115
+
116
+ #else
117
+
118
+ #define kNumLogBits (9 + sizeof(size_t) / 2)
119
+ /* #define kNumLogBits (11 + sizeof(size_t) / 8 * 3) */
120
+
121
+ #define kDicLogSizeMaxCompress ((kNumLogBits - 1) * 2 + 7)
122
+
123
+ static void LzmaEnc_FastPosInit(Byte *g_FastPos)
124
+ {
125
+ unsigned slot;
126
+ g_FastPos[0] = 0;
127
+ g_FastPos[1] = 1;
128
+ g_FastPos += 2;
129
+
130
+ for (slot = 2; slot < kNumLogBits * 2; slot++)
131
+ {
132
+ size_t k = ((size_t)1 << ((slot >> 1) - 1));
133
+ size_t j;
134
+ for (j = 0; j < k; j++)
135
+ g_FastPos[j] = (Byte)slot;
136
+ g_FastPos += k;
137
+ }
138
+ }
139
+
140
+ /* we can use ((limit - pos) >> 31) only if (pos < ((UInt32)1 << 31)) */
141
+ /*
142
+ #define BSR2_RET(pos, res) { unsigned zz = 6 + ((kNumLogBits - 1) & \
143
+ (0 - (((((UInt32)1 << (kNumLogBits + 6)) - 1) - pos) >> 31))); \
144
+ res = p->g_FastPos[pos >> zz] + (zz * 2); }
145
+ */
146
+
147
+ /*
148
+ #define BSR2_RET(pos, res) { unsigned zz = 6 + ((kNumLogBits - 1) & \
149
+ (0 - (((((UInt32)1 << (kNumLogBits)) - 1) - (pos >> 6)) >> 31))); \
150
+ res = p->g_FastPos[pos >> zz] + (zz * 2); }
151
+ */
152
+
153
+ #define BSR2_RET(pos, res) { unsigned zz = (pos < (1 << (kNumLogBits + 6))) ? 6 : 6 + kNumLogBits - 1; \
154
+ res = p->g_FastPos[pos >> zz] + (zz * 2); }
155
+
156
+ /*
157
+ #define BSR2_RET(pos, res) { res = (pos < (1 << (kNumLogBits + 6))) ? \
158
+ p->g_FastPos[pos >> 6] + 12 : \
159
+ p->g_FastPos[pos >> (6 + kNumLogBits - 1)] + (6 + (kNumLogBits - 1)) * 2; }
160
+ */
161
+
162
+ #define GetPosSlot1(pos) p->g_FastPos[pos]
163
+ #define GetPosSlot2(pos, res) { BSR2_RET(pos, res); }
164
+ #define GetPosSlot(pos, res) { if (pos < kNumFullDistances) res = p->g_FastPos[pos & (kNumFullDistances - 1)]; else BSR2_RET(pos, res); }
165
+
166
+ #endif
167
+
168
+
169
+ #define LZMA_NUM_REPS 4
170
+
171
+ typedef UInt16 CState;
172
+ typedef UInt16 CExtra;
173
+
174
+ typedef struct
175
+ {
176
+ UInt32 price;
177
+ CState state;
178
+ CExtra extra;
179
+ // 0 : normal
180
+ // 1 : LIT : MATCH
181
+ // > 1 : MATCH (extra-1) : LIT : REP0 (len)
182
+ UInt32 len;
183
+ UInt32 dist;
184
+ UInt32 reps[LZMA_NUM_REPS];
185
+ } COptimal;
186
+
187
+
188
+ // 18.06
189
+ #define kNumOpts (1 << 11)
190
+ #define kPackReserve (kNumOpts * 8)
191
+ // #define kNumOpts (1 << 12)
192
+ // #define kPackReserve (1 + kNumOpts * 2)
193
+
194
+ #define kNumLenToPosStates 4
195
+ #define kNumPosSlotBits 6
196
+ #define kDicLogSizeMin 0
197
+ #define kDicLogSizeMax 32
198
+ #define kDistTableSizeMax (kDicLogSizeMax * 2)
199
+
200
+ #define kNumAlignBits 4
201
+ #define kAlignTableSize (1 << kNumAlignBits)
202
+ #define kAlignMask (kAlignTableSize - 1)
203
+
204
+ #define kStartPosModelIndex 4
205
+ #define kEndPosModelIndex 14
206
+ #define kNumFullDistances (1 << (kEndPosModelIndex >> 1))
207
+
208
+ typedef
209
+ #ifdef _LZMA_PROB32
210
+ UInt32
211
+ #else
212
+ UInt16
213
+ #endif
214
+ CLzmaProb;
215
+
216
+ #define LZMA_PB_MAX 4
217
+ #define LZMA_LC_MAX 8
218
+ #define LZMA_LP_MAX 4
219
+
220
+ #define LZMA_NUM_PB_STATES_MAX (1 << LZMA_PB_MAX)
221
+
222
+ #define kLenNumLowBits 3
223
+ #define kLenNumLowSymbols (1 << kLenNumLowBits)
224
+ #define kLenNumHighBits 8
225
+ #define kLenNumHighSymbols (1 << kLenNumHighBits)
226
+ #define kLenNumSymbolsTotal (kLenNumLowSymbols * 2 + kLenNumHighSymbols)
227
+
228
+ #define LZMA_MATCH_LEN_MIN 2
229
+ #define LZMA_MATCH_LEN_MAX (LZMA_MATCH_LEN_MIN + kLenNumSymbolsTotal - 1)
230
+
231
+ #define kNumStates 12
232
+
233
+
234
+ typedef struct
235
+ {
236
+ CLzmaProb low[LZMA_NUM_PB_STATES_MAX << (kLenNumLowBits + 1)];
237
+ CLzmaProb high[kLenNumHighSymbols];
238
+ } CLenEnc;
239
+
240
+
241
+ typedef struct
242
+ {
243
+ unsigned tableSize;
244
+ UInt32 prices[LZMA_NUM_PB_STATES_MAX][kLenNumSymbolsTotal];
245
+ // UInt32 prices1[LZMA_NUM_PB_STATES_MAX][kLenNumLowSymbols * 2];
246
+ // UInt32 prices2[kLenNumSymbolsTotal];
247
+ } CLenPriceEnc;
248
+
249
+ #define GET_PRICE_LEN(p, posState, len) \
250
+ ((p)->prices[posState][(size_t)(len) - LZMA_MATCH_LEN_MIN])
251
+
252
+ /*
253
+ #define GET_PRICE_LEN(p, posState, len) \
254
+ ((p)->prices2[(size_t)(len) - 2] + ((p)->prices1[posState][((len) - 2) & (kLenNumLowSymbols * 2 - 1)] & (((len) - 2 - kLenNumLowSymbols * 2) >> 9)))
255
+ */
256
+
257
+ typedef struct
258
+ {
259
+ UInt32 range;
260
+ unsigned cache;
261
+ UInt64 low;
262
+ UInt64 cacheSize;
263
+ Byte *buf;
264
+ Byte *bufLim;
265
+ Byte *bufBase;
266
+ ISeqOutStream *outStream;
267
+ UInt64 processed;
268
+ SRes res;
269
+ } CRangeEnc;
270
+
271
+
272
+ typedef struct
273
+ {
274
+ CLzmaProb *litProbs;
275
+
276
+ unsigned state;
277
+ UInt32 reps[LZMA_NUM_REPS];
278
+
279
+ CLzmaProb posAlignEncoder[1 << kNumAlignBits];
280
+ CLzmaProb isRep[kNumStates];
281
+ CLzmaProb isRepG0[kNumStates];
282
+ CLzmaProb isRepG1[kNumStates];
283
+ CLzmaProb isRepG2[kNumStates];
284
+ CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX];
285
+ CLzmaProb isRep0Long[kNumStates][LZMA_NUM_PB_STATES_MAX];
286
+
287
+ CLzmaProb posSlotEncoder[kNumLenToPosStates][1 << kNumPosSlotBits];
288
+ CLzmaProb posEncoders[kNumFullDistances];
289
+
290
+ CLenEnc lenProbs;
291
+ CLenEnc repLenProbs;
292
+
293
+ } CSaveState;
294
+
295
+
296
+ typedef UInt32 CProbPrice;
297
+
298
+
299
+ typedef struct
300
+ {
301
+ void *matchFinderObj;
302
+ IMatchFinder matchFinder;
303
+
304
+ unsigned optCur;
305
+ unsigned optEnd;
306
+
307
+ unsigned longestMatchLen;
308
+ unsigned numPairs;
309
+ UInt32 numAvail;
310
+
311
+ unsigned state;
312
+ unsigned numFastBytes;
313
+ unsigned additionalOffset;
314
+ UInt32 reps[LZMA_NUM_REPS];
315
+ unsigned lpMask, pbMask;
316
+ CLzmaProb *litProbs;
317
+ CRangeEnc rc;
318
+
319
+ UInt32 backRes;
320
+
321
+ unsigned lc, lp, pb;
322
+ unsigned lclp;
323
+
324
+ BoolInt fastMode;
325
+ BoolInt writeEndMark;
326
+ BoolInt finished;
327
+ BoolInt multiThread;
328
+ BoolInt needInit;
329
+ // BoolInt _maxMode;
330
+
331
+ UInt64 nowPos64;
332
+
333
+ unsigned matchPriceCount;
334
+ // unsigned alignPriceCount;
335
+ int repLenEncCounter;
336
+
337
+ unsigned distTableSize;
338
+
339
+ UInt32 dictSize;
340
+ SRes result;
341
+
342
+ #ifndef _7ZIP_ST
343
+ BoolInt mtMode;
344
+ // begin of CMatchFinderMt is used in LZ thread
345
+ CMatchFinderMt matchFinderMt;
346
+ // end of CMatchFinderMt is used in BT and HASH threads
347
+ #endif
348
+
349
+ CMatchFinder matchFinderBase;
350
+
351
+ #ifndef _7ZIP_ST
352
+ Byte pad[128];
353
+ #endif
354
+
355
+ // LZ thread
356
+ CProbPrice ProbPrices[kBitModelTotal >> kNumMoveReducingBits];
357
+
358
+ UInt32 matches[LZMA_MATCH_LEN_MAX * 2 + 2 + 1];
359
+
360
+ UInt32 alignPrices[kAlignTableSize];
361
+ UInt32 posSlotPrices[kNumLenToPosStates][kDistTableSizeMax];
362
+ UInt32 distancesPrices[kNumLenToPosStates][kNumFullDistances];
363
+
364
+ CLzmaProb posAlignEncoder[1 << kNumAlignBits];
365
+ CLzmaProb isRep[kNumStates];
366
+ CLzmaProb isRepG0[kNumStates];
367
+ CLzmaProb isRepG1[kNumStates];
368
+ CLzmaProb isRepG2[kNumStates];
369
+ CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX];
370
+ CLzmaProb isRep0Long[kNumStates][LZMA_NUM_PB_STATES_MAX];
371
+ CLzmaProb posSlotEncoder[kNumLenToPosStates][1 << kNumPosSlotBits];
372
+ CLzmaProb posEncoders[kNumFullDistances];
373
+
374
+ CLenEnc lenProbs;
375
+ CLenEnc repLenProbs;
376
+
377
+ #ifndef LZMA_LOG_BSR
378
+ Byte g_FastPos[1 << kNumLogBits];
379
+ #endif
380
+
381
+ CLenPriceEnc lenEnc;
382
+ CLenPriceEnc repLenEnc;
383
+
384
+ COptimal opt[kNumOpts];
385
+
386
+ CSaveState saveState;
387
+
388
+ #ifndef _7ZIP_ST
389
+ Byte pad2[128];
390
+ #endif
391
+ } CLzmaEnc;
392
+
393
+
394
+ SRes LzmaEnc_SetProps(CLzmaEncHandle pp, const CLzmaEncProps *props2)
395
+ {
396
+ CLzmaEnc *p = (CLzmaEnc *)pp;
397
+ CLzmaEncProps props = *props2;
398
+ LzmaEncProps_Normalize(&props);
399
+
400
+ if (props.lc > LZMA_LC_MAX
401
+ || props.lp > LZMA_LP_MAX
402
+ || props.pb > LZMA_PB_MAX
403
+ || props.dictSize > ((UInt64)1 << kDicLogSizeMaxCompress)
404
+ || props.dictSize > kLzmaMaxHistorySize)
405
+ return SZ_ERROR_PARAM;
406
+
407
+ p->dictSize = props.dictSize;
408
+ {
409
+ unsigned fb = props.fb;
410
+ if (fb < 5)
411
+ fb = 5;
412
+ if (fb > LZMA_MATCH_LEN_MAX)
413
+ fb = LZMA_MATCH_LEN_MAX;
414
+ p->numFastBytes = fb;
415
+ }
416
+ p->lc = props.lc;
417
+ p->lp = props.lp;
418
+ p->pb = props.pb;
419
+ p->fastMode = (props.algo == 0);
420
+ // p->_maxMode = True;
421
+ p->matchFinderBase.btMode = (Byte)(props.btMode ? 1 : 0);
422
+ {
423
+ unsigned numHashBytes = 4;
424
+ if (props.btMode)
425
+ {
426
+ if (props.numHashBytes < 2)
427
+ numHashBytes = 2;
428
+ else if (props.numHashBytes < 4)
429
+ numHashBytes = props.numHashBytes;
430
+ }
431
+ p->matchFinderBase.numHashBytes = numHashBytes;
432
+ }
433
+
434
+ p->matchFinderBase.cutValue = props.mc;
435
+
436
+ p->writeEndMark = props.writeEndMark;
437
+
438
+ #ifndef _7ZIP_ST
439
+ /*
440
+ if (newMultiThread != _multiThread)
441
+ {
442
+ ReleaseMatchFinder();
443
+ _multiThread = newMultiThread;
444
+ }
445
+ */
446
+ p->multiThread = (props.numThreads > 1);
447
+ #endif
448
+
449
+ return SZ_OK;
450
+ }
451
+
452
+
453
+ void LzmaEnc_SetDataSize(CLzmaEncHandle pp, UInt64 expectedDataSiize)
454
+ {
455
+ CLzmaEnc *p = (CLzmaEnc *)pp;
456
+ p->matchFinderBase.expectedDataSize = expectedDataSiize;
457
+ }
458
+
459
+
460
+ #define kState_Start 0
461
+ #define kState_LitAfterMatch 4
462
+ #define kState_LitAfterRep 5
463
+ #define kState_MatchAfterLit 7
464
+ #define kState_RepAfterLit 8
465
+
466
+ static const Byte kLiteralNextStates[kNumStates] = {0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 4, 5};
467
+ static const Byte kMatchNextStates[kNumStates] = {7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10};
468
+ static const Byte kRepNextStates[kNumStates] = {8, 8, 8, 8, 8, 8, 8, 11, 11, 11, 11, 11};
469
+ static const Byte kShortRepNextStates[kNumStates]= {9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 11, 11};
470
+
471
+ #define IsLitState(s) ((s) < 7)
472
+ #define GetLenToPosState2(len) (((len) < kNumLenToPosStates - 1) ? (len) : kNumLenToPosStates - 1)
473
+ #define GetLenToPosState(len) (((len) < kNumLenToPosStates + 1) ? (len) - 2 : kNumLenToPosStates - 1)
474
+
475
+ #define kInfinityPrice (1 << 30)
476
+
477
+ static void RangeEnc_Construct(CRangeEnc *p)
478
+ {
479
+ p->outStream = NULL;
480
+ p->bufBase = NULL;
481
+ }
482
+
483
+ #define RangeEnc_GetProcessed(p) ((p)->processed + ((p)->buf - (p)->bufBase) + (p)->cacheSize)
484
+ #define RangeEnc_GetProcessed_sizet(p) ((size_t)(p)->processed + ((p)->buf - (p)->bufBase) + (size_t)(p)->cacheSize)
485
+
486
+ #define RC_BUF_SIZE (1 << 16)
487
+
488
+ static int RangeEnc_Alloc(CRangeEnc *p, ISzAllocPtr alloc)
489
+ {
490
+ if (!p->bufBase)
491
+ {
492
+ p->bufBase = (Byte *)ISzAlloc_Alloc(alloc, RC_BUF_SIZE);
493
+ if (!p->bufBase)
494
+ return 0;
495
+ p->bufLim = p->bufBase + RC_BUF_SIZE;
496
+ }
497
+ return 1;
498
+ }
499
+
500
+ static void RangeEnc_Free(CRangeEnc *p, ISzAllocPtr alloc)
501
+ {
502
+ ISzAlloc_Free(alloc, p->bufBase);
503
+ p->bufBase = 0;
504
+ }
505
+
506
+ static void RangeEnc_Init(CRangeEnc *p)
507
+ {
508
+ /* Stream.Init(); */
509
+ p->range = 0xFFFFFFFF;
510
+ p->cache = 0;
511
+ p->low = 0;
512
+ p->cacheSize = 0;
513
+
514
+ p->buf = p->bufBase;
515
+
516
+ p->processed = 0;
517
+ p->res = SZ_OK;
518
+ }
519
+
520
+ MY_NO_INLINE static void RangeEnc_FlushStream(CRangeEnc *p)
521
+ {
522
+ size_t num;
523
+ if (p->res != SZ_OK)
524
+ return;
525
+ num = p->buf - p->bufBase;
526
+ if (num != ISeqOutStream_Write(p->outStream, p->bufBase, num))
527
+ p->res = SZ_ERROR_WRITE;
528
+ p->processed += num;
529
+ p->buf = p->bufBase;
530
+ }
531
+
532
+ MY_NO_INLINE static void MY_FAST_CALL RangeEnc_ShiftLow(CRangeEnc *p)
533
+ {
534
+ UInt32 low = (UInt32)p->low;
535
+ unsigned high = (unsigned)(p->low >> 32);
536
+ p->low = (UInt32)(low << 8);
537
+ if (low < (UInt32)0xFF000000 || high != 0)
538
+ {
539
+ {
540
+ Byte *buf = p->buf;
541
+ *buf++ = (Byte)(p->cache + high);
542
+ p->cache = (unsigned)(low >> 24);
543
+ p->buf = buf;
544
+ if (buf == p->bufLim)
545
+ RangeEnc_FlushStream(p);
546
+ if (p->cacheSize == 0)
547
+ return;
548
+ }
549
+ high += 0xFF;
550
+ for (;;)
551
+ {
552
+ Byte *buf = p->buf;
553
+ *buf++ = (Byte)(high);
554
+ p->buf = buf;
555
+ if (buf == p->bufLim)
556
+ RangeEnc_FlushStream(p);
557
+ if (--p->cacheSize == 0)
558
+ return;
559
+ }
560
+ }
561
+ p->cacheSize++;
562
+ }
563
+
564
+ static void RangeEnc_FlushData(CRangeEnc *p)
565
+ {
566
+ int i;
567
+ for (i = 0; i < 5; i++)
568
+ RangeEnc_ShiftLow(p);
569
+ }
570
+
571
+ #define RC_NORM(p) if (range < kTopValue) { range <<= 8; RangeEnc_ShiftLow(p); }
572
+
573
+ #define RC_BIT_PRE(p, prob) \
574
+ ttt = *(prob); \
575
+ newBound = (range >> kNumBitModelTotalBits) * ttt;
576
+
577
+ // #define _LZMA_ENC_USE_BRANCH
578
+
579
+ #ifdef _LZMA_ENC_USE_BRANCH
580
+
581
+ #define RC_BIT(p, prob, bit) { \
582
+ RC_BIT_PRE(p, prob) \
583
+ if (bit == 0) { range = newBound; ttt += (kBitModelTotal - ttt) >> kNumMoveBits; } \
584
+ else { (p)->low += newBound; range -= newBound; ttt -= ttt >> kNumMoveBits; } \
585
+ *(prob) = (CLzmaProb)ttt; \
586
+ RC_NORM(p) \
587
+ }
588
+
589
+ #else
590
+
591
+ #define RC_BIT(p, prob, bit) { \
592
+ UInt32 mask; \
593
+ RC_BIT_PRE(p, prob) \
594
+ mask = 0 - (UInt32)bit; \
595
+ range &= mask; \
596
+ mask &= newBound; \
597
+ range -= mask; \
598
+ (p)->low += mask; \
599
+ mask = (UInt32)bit - 1; \
600
+ range += newBound & mask; \
601
+ mask &= (kBitModelTotal - ((1 << kNumMoveBits) - 1)); \
602
+ mask += ((1 << kNumMoveBits) - 1); \
603
+ ttt += (Int32)(mask - ttt) >> kNumMoveBits; \
604
+ *(prob) = (CLzmaProb)ttt; \
605
+ RC_NORM(p) \
606
+ }
607
+
608
+ #endif
609
+
610
+
611
+
612
+
613
+ #define RC_BIT_0_BASE(p, prob) \
614
+ range = newBound; *(prob) = (CLzmaProb)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits));
615
+
616
+ #define RC_BIT_1_BASE(p, prob) \
617
+ range -= newBound; (p)->low += newBound; *(prob) = (CLzmaProb)(ttt - (ttt >> kNumMoveBits)); \
618
+
619
+ #define RC_BIT_0(p, prob) \
620
+ RC_BIT_0_BASE(p, prob) \
621
+ RC_NORM(p)
622
+
623
+ #define RC_BIT_1(p, prob) \
624
+ RC_BIT_1_BASE(p, prob) \
625
+ RC_NORM(p)
626
+
627
+ static void RangeEnc_EncodeBit_0(CRangeEnc *p, CLzmaProb *prob)
628
+ {
629
+ UInt32 range, ttt, newBound;
630
+ range = p->range;
631
+ RC_BIT_PRE(p, prob)
632
+ RC_BIT_0(p, prob)
633
+ p->range = range;
634
+ }
635
+
636
+ static void LitEnc_Encode(CRangeEnc *p, CLzmaProb *probs, UInt32 sym)
637
+ {
638
+ UInt32 range = p->range;
639
+ sym |= 0x100;
640
+ do
641
+ {
642
+ UInt32 ttt, newBound;
643
+ // RangeEnc_EncodeBit(p, probs + (sym >> 8), (sym >> 7) & 1);
644
+ CLzmaProb *prob = probs + (sym >> 8);
645
+ UInt32 bit = (sym >> 7) & 1;
646
+ sym <<= 1;
647
+ RC_BIT(p, prob, bit);
648
+ }
649
+ while (sym < 0x10000);
650
+ p->range = range;
651
+ }
652
+
653
+ static void LzmaEnc_InitPriceTables(CProbPrice *ProbPrices)
654
+ {
655
+ UInt32 i;
656
+ for (i = 0; i < (kBitModelTotal >> kNumMoveReducingBits); i++)
657
+ {
658
+ const unsigned kCyclesBits = kNumBitPriceShiftBits;
659
+ UInt32 w = (i << kNumMoveReducingBits) + (1 << (kNumMoveReducingBits - 1));
660
+ unsigned bitCount = 0;
661
+ unsigned j;
662
+ for (j = 0; j < kCyclesBits; j++)
663
+ {
664
+ w = w * w;
665
+ bitCount <<= 1;
666
+ while (w >= ((UInt32)1 << 16))
667
+ {
668
+ w >>= 1;
669
+ bitCount++;
670
+ }
671
+ }
672
+ ProbPrices[i] = (CProbPrice)((kNumBitModelTotalBits << kCyclesBits) - 15 - bitCount);
673
+ // printf("\n%3d: %5d", i, ProbPrices[i]);
674
+ }
675
+ }
676
+
677
+
678
+ #define GET_PRICE(prob, bit) \
679
+ p->ProbPrices[((prob) ^ (unsigned)(((-(int)(bit))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits];
680
+
681
+ #define GET_PRICEa(prob, bit) \
682
+ ProbPrices[((prob) ^ (unsigned)((-((int)(bit))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits];
683
+
684
+ #define GET_PRICE_0(prob) p->ProbPrices[(prob) >> kNumMoveReducingBits]
685
+ #define GET_PRICE_1(prob) p->ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits]
686
+
687
+ #define GET_PRICEa_0(prob) ProbPrices[(prob) >> kNumMoveReducingBits]
688
+ #define GET_PRICEa_1(prob) ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits]
689
+
690
+
691
+ static UInt32 LitEnc_GetPrice(const CLzmaProb *probs, UInt32 sym, const CProbPrice *ProbPrices)
692
+ {
693
+ UInt32 price = 0;
694
+ sym |= 0x100;
695
+ do
696
+ {
697
+ unsigned bit = sym & 1;
698
+ sym >>= 1;
699
+ price += GET_PRICEa(probs[sym], bit);
700
+ }
701
+ while (sym >= 2);
702
+ return price;
703
+ }
704
+
705
+
706
+ static UInt32 LitEnc_Matched_GetPrice(const CLzmaProb *probs, UInt32 sym, UInt32 matchByte, const CProbPrice *ProbPrices)
707
+ {
708
+ UInt32 price = 0;
709
+ UInt32 offs = 0x100;
710
+ sym |= 0x100;
711
+ do
712
+ {
713
+ matchByte <<= 1;
714
+ price += GET_PRICEa(probs[offs + (matchByte & offs) + (sym >> 8)], (sym >> 7) & 1);
715
+ sym <<= 1;
716
+ offs &= ~(matchByte ^ sym);
717
+ }
718
+ while (sym < 0x10000);
719
+ return price;
720
+ }
721
+
722
+
723
+
724
+ static void LenEnc_Init(CLenEnc *p)
725
+ {
726
+ unsigned i;
727
+ for (i = 0; i < (LZMA_NUM_PB_STATES_MAX << (kLenNumLowBits + 1)); i++)
728
+ p->low[i] = kProbInitValue;
729
+ for (i = 0; i < kLenNumHighSymbols; i++)
730
+ p->high[i] = kProbInitValue;
731
+ }
732
+
733
+ static void LenEnc_Encode(CLenEnc *p, CRangeEnc *rc, unsigned sym, unsigned posState)
734
+ {
735
+ UInt32 range, ttt, newBound;
736
+ CLzmaProb *probs = p->low;
737
+ range = rc->range;
738
+ RC_BIT_PRE(rc, probs);
739
+ if (sym >= kLenNumLowSymbols)
740
+ {
741
+ RC_BIT_1(rc, probs);
742
+ probs += kLenNumLowSymbols;
743
+ RC_BIT_PRE(rc, probs);
744
+ if (sym >= kLenNumLowSymbols * 2)
745
+ {
746
+ RC_BIT_1(rc, probs);
747
+ rc->range = range;
748
+ // RcTree_Encode(rc, p->high, kLenNumHighBits, sym - kLenNumLowSymbols * 2);
749
+ LitEnc_Encode(rc, p->high, sym - kLenNumLowSymbols * 2);
750
+ return;
751
+ }
752
+ sym -= kLenNumLowSymbols;
753
+ }
754
+
755
+ // RcTree_Encode(rc, probs + (posState << kLenNumLowBits), kLenNumLowBits, sym);
756
+ {
757
+ unsigned m;
758
+ unsigned bit;
759
+ RC_BIT_0(rc, probs);
760
+ probs += (posState << (1 + kLenNumLowBits));
761
+ bit = (sym >> 2) ; RC_BIT(rc, probs + 1, bit); m = (1 << 1) + bit;
762
+ bit = (sym >> 1) & 1; RC_BIT(rc, probs + m, bit); m = (m << 1) + bit;
763
+ bit = sym & 1; RC_BIT(rc, probs + m, bit);
764
+ rc->range = range;
765
+ }
766
+ }
767
+
768
+ static void SetPrices_3(const CLzmaProb *probs, UInt32 startPrice, UInt32 *prices, const CProbPrice *ProbPrices)
769
+ {
770
+ unsigned i;
771
+ for (i = 0; i < 8; i += 2)
772
+ {
773
+ UInt32 price = startPrice;
774
+ UInt32 prob;
775
+ price += GET_PRICEa(probs[1 ], (i >> 2));
776
+ price += GET_PRICEa(probs[2 + (i >> 2)], (i >> 1) & 1);
777
+ prob = probs[4 + (i >> 1)];
778
+ prices[i ] = price + GET_PRICEa_0(prob);
779
+ prices[i + 1] = price + GET_PRICEa_1(prob);
780
+ }
781
+ }
782
+
783
+
784
+ MY_NO_INLINE static void MY_FAST_CALL LenPriceEnc_UpdateTables(
785
+ CLenPriceEnc *p,
786
+ unsigned numPosStates,
787
+ const CLenEnc *enc,
788
+ const CProbPrice *ProbPrices)
789
+ {
790
+ UInt32 b;
791
+
792
+ {
793
+ unsigned prob = enc->low[0];
794
+ UInt32 a, c;
795
+ unsigned posState;
796
+ b = GET_PRICEa_1(prob);
797
+ a = GET_PRICEa_0(prob);
798
+ c = b + GET_PRICEa_0(enc->low[kLenNumLowSymbols]);
799
+ for (posState = 0; posState < numPosStates; posState++)
800
+ {
801
+ UInt32 *prices = p->prices[posState];
802
+ const CLzmaProb *probs = enc->low + (posState << (1 + kLenNumLowBits));
803
+ SetPrices_3(probs, a, prices, ProbPrices);
804
+ SetPrices_3(probs + kLenNumLowSymbols, c, prices + kLenNumLowSymbols, ProbPrices);
805
+ }
806
+ }
807
+
808
+ /*
809
+ {
810
+ unsigned i;
811
+ UInt32 b;
812
+ a = GET_PRICEa_0(enc->low[0]);
813
+ for (i = 0; i < kLenNumLowSymbols; i++)
814
+ p->prices2[i] = a;
815
+ a = GET_PRICEa_1(enc->low[0]);
816
+ b = a + GET_PRICEa_0(enc->low[kLenNumLowSymbols]);
817
+ for (i = kLenNumLowSymbols; i < kLenNumLowSymbols * 2; i++)
818
+ p->prices2[i] = b;
819
+ a += GET_PRICEa_1(enc->low[kLenNumLowSymbols]);
820
+ }
821
+ */
822
+
823
+ // p->counter = numSymbols;
824
+ // p->counter = 64;
825
+
826
+ {
827
+ unsigned i = p->tableSize;
828
+
829
+ if (i > kLenNumLowSymbols * 2)
830
+ {
831
+ const CLzmaProb *probs = enc->high;
832
+ UInt32 *prices = p->prices[0] + kLenNumLowSymbols * 2;
833
+ i -= kLenNumLowSymbols * 2 - 1;
834
+ i >>= 1;
835
+ b += GET_PRICEa_1(enc->low[kLenNumLowSymbols]);
836
+ do
837
+ {
838
+ /*
839
+ p->prices2[i] = a +
840
+ // RcTree_GetPrice(enc->high, kLenNumHighBits, i - kLenNumLowSymbols * 2, ProbPrices);
841
+ LitEnc_GetPrice(probs, i - kLenNumLowSymbols * 2, ProbPrices);
842
+ */
843
+ // UInt32 price = a + RcTree_GetPrice(probs, kLenNumHighBits - 1, sym, ProbPrices);
844
+ unsigned sym = --i + (1 << (kLenNumHighBits - 1));
845
+ UInt32 price = b;
846
+ do
847
+ {
848
+ unsigned bit = sym & 1;
849
+ sym >>= 1;
850
+ price += GET_PRICEa(probs[sym], bit);
851
+ }
852
+ while (sym >= 2);
853
+
854
+ {
855
+ unsigned prob = probs[(size_t)i + (1 << (kLenNumHighBits - 1))];
856
+ prices[(size_t)i * 2 ] = price + GET_PRICEa_0(prob);
857
+ prices[(size_t)i * 2 + 1] = price + GET_PRICEa_1(prob);
858
+ }
859
+ }
860
+ while (i);
861
+
862
+ {
863
+ unsigned posState;
864
+ size_t num = (p->tableSize - kLenNumLowSymbols * 2) * sizeof(p->prices[0][0]);
865
+ for (posState = 1; posState < numPosStates; posState++)
866
+ memcpy(p->prices[posState] + kLenNumLowSymbols * 2, p->prices[0] + kLenNumLowSymbols * 2, num);
867
+ }
868
+ }
869
+ }
870
+ }
871
+
872
+ /*
873
+ #ifdef SHOW_STAT
874
+ g_STAT_OFFSET += num;
875
+ printf("\n MovePos %u", num);
876
+ #endif
877
+ */
878
+
879
+ #define MOVE_POS(p, num) { \
880
+ p->additionalOffset += (num); \
881
+ p->matchFinder.Skip(p->matchFinderObj, (UInt32)(num)); }
882
+
883
+
884
+ #define MARK_LIT ((UInt32)(Int32)-1)
885
+
886
+ #define MakeAs_Lit(p) { (p)->dist = MARK_LIT; (p)->extra = 0; }
887
+ #define MakeAs_ShortRep(p) { (p)->dist = 0; (p)->extra = 0; }
888
+ #define IsShortRep(p) ((p)->dist == 0)
889
+
890
+
891
+ #define GetPrice_ShortRep(p, state, posState) \
892
+ ( GET_PRICE_0(p->isRepG0[state]) + GET_PRICE_0(p->isRep0Long[state][posState]))
893
+
894
+ #define GetPrice_Rep_0(p, state, posState) ( \
895
+ GET_PRICE_1(p->isMatch[state][posState]) \
896
+ + GET_PRICE_1(p->isRep0Long[state][posState])) \
897
+ + GET_PRICE_1(p->isRep[state]) \
898
+ + GET_PRICE_0(p->isRepG0[state])
899
+
900
+ MY_FORCE_INLINE
901
+ static UInt32 GetPrice_PureRep(const CLzmaEnc *p, unsigned repIndex, size_t state, size_t posState)
902
+ {
903
+ UInt32 price;
904
+ UInt32 prob = p->isRepG0[state];
905
+ if (repIndex == 0)
906
+ {
907
+ price = GET_PRICE_0(prob);
908
+ price += GET_PRICE_1(p->isRep0Long[state][posState]);
909
+ }
910
+ else
911
+ {
912
+ price = GET_PRICE_1(prob);
913
+ prob = p->isRepG1[state];
914
+ if (repIndex == 1)
915
+ price += GET_PRICE_0(prob);
916
+ else
917
+ {
918
+ price += GET_PRICE_1(prob);
919
+ price += GET_PRICE(p->isRepG2[state], repIndex - 2);
920
+ }
921
+ }
922
+ return price;
923
+ }
924
+
925
+
926
+ static SRes CheckErrors(CLzmaEnc *p)
927
+ {
928
+ if (p->result != SZ_OK)
929
+ return p->result;
930
+ if (p->rc.res != SZ_OK)
931
+ p->result = SZ_ERROR_WRITE;
932
+ if (p->matchFinderBase.result != SZ_OK)
933
+ p->result = SZ_ERROR_READ;
934
+ if (p->result != SZ_OK)
935
+ p->finished = True;
936
+ return p->result;
937
+ }
938
+
939
+
940
+ MY_NO_INLINE static void FillAlignPrices(CLzmaEnc *p)
941
+ {
942
+ unsigned i;
943
+ const CProbPrice *ProbPrices = p->ProbPrices;
944
+ const CLzmaProb *probs = p->posAlignEncoder;
945
+ // p->alignPriceCount = 0;
946
+ for (i = 0; i < kAlignTableSize / 2; i++)
947
+ {
948
+ UInt32 price = 0;
949
+ unsigned sym = i;
950
+ unsigned m = 1;
951
+ unsigned bit;
952
+ UInt32 prob;
953
+ bit = sym & 1; sym >>= 1; price += GET_PRICEa(probs[m], bit); m = (m << 1) + bit;
954
+ bit = sym & 1; sym >>= 1; price += GET_PRICEa(probs[m], bit); m = (m << 1) + bit;
955
+ bit = sym & 1; sym >>= 1; price += GET_PRICEa(probs[m], bit); m = (m << 1) + bit;
956
+ prob = probs[m];
957
+ p->alignPrices[i ] = price + GET_PRICEa_0(prob);
958
+ p->alignPrices[i + 8] = price + GET_PRICEa_1(prob);
959
+ // p->alignPrices[i] = RcTree_ReverseGetPrice(p->posAlignEncoder, kNumAlignBits, i, p->ProbPrices);
960
+ }
961
+ }
962
+
963
+
964
+ MY_NO_INLINE static void FillDistancesPrices(CLzmaEnc *p)
965
+ {
966
+ // int y; for (y = 0; y < 100; y++) {
967
+
968
+ UInt32 tempPrices[kNumFullDistances];
969
+ unsigned i, lps;
970
+
971
+ const CProbPrice *ProbPrices = p->ProbPrices;
972
+ p->matchPriceCount = 0;
973
+
974
+ for (i = kStartPosModelIndex / 2; i < kNumFullDistances / 2; i++)
975
+ {
976
+ unsigned posSlot = GetPosSlot1(i);
977
+ unsigned footerBits = (posSlot >> 1) - 1;
978
+ unsigned base = ((2 | (posSlot & 1)) << footerBits);
979
+ const CLzmaProb *probs = p->posEncoders + (size_t)base * 2;
980
+ // tempPrices[i] = RcTree_ReverseGetPrice(p->posEncoders + base, footerBits, i - base, p->ProbPrices);
981
+ UInt32 price = 0;
982
+ unsigned m = 1;
983
+ unsigned sym = i;
984
+ unsigned offset = (unsigned)1 << footerBits;
985
+ base += i;
986
+
987
+ if (footerBits)
988
+ do
989
+ {
990
+ unsigned bit = sym & 1;
991
+ sym >>= 1;
992
+ price += GET_PRICEa(probs[m], bit);
993
+ m = (m << 1) + bit;
994
+ }
995
+ while (--footerBits);
996
+
997
+ {
998
+ unsigned prob = probs[m];
999
+ tempPrices[base ] = price + GET_PRICEa_0(prob);
1000
+ tempPrices[base + offset] = price + GET_PRICEa_1(prob);
1001
+ }
1002
+ }
1003
+
1004
+ for (lps = 0; lps < kNumLenToPosStates; lps++)
1005
+ {
1006
+ unsigned slot;
1007
+ unsigned distTableSize2 = (p->distTableSize + 1) >> 1;
1008
+ UInt32 *posSlotPrices = p->posSlotPrices[lps];
1009
+ const CLzmaProb *probs = p->posSlotEncoder[lps];
1010
+
1011
+ for (slot = 0; slot < distTableSize2; slot++)
1012
+ {
1013
+ // posSlotPrices[slot] = RcTree_GetPrice(encoder, kNumPosSlotBits, slot, p->ProbPrices);
1014
+ UInt32 price;
1015
+ unsigned bit;
1016
+ unsigned sym = slot + (1 << (kNumPosSlotBits - 1));
1017
+ unsigned prob;
1018
+ bit = sym & 1; sym >>= 1; price = GET_PRICEa(probs[sym], bit);
1019
+ bit = sym & 1; sym >>= 1; price += GET_PRICEa(probs[sym], bit);
1020
+ bit = sym & 1; sym >>= 1; price += GET_PRICEa(probs[sym], bit);
1021
+ bit = sym & 1; sym >>= 1; price += GET_PRICEa(probs[sym], bit);
1022
+ bit = sym & 1; sym >>= 1; price += GET_PRICEa(probs[sym], bit);
1023
+ prob = probs[(size_t)slot + (1 << (kNumPosSlotBits - 1))];
1024
+ posSlotPrices[(size_t)slot * 2 ] = price + GET_PRICEa_0(prob);
1025
+ posSlotPrices[(size_t)slot * 2 + 1] = price + GET_PRICEa_1(prob);
1026
+ }
1027
+
1028
+ {
1029
+ UInt32 delta = ((UInt32)((kEndPosModelIndex / 2 - 1) - kNumAlignBits) << kNumBitPriceShiftBits);
1030
+ for (slot = kEndPosModelIndex / 2; slot < distTableSize2; slot++)
1031
+ {
1032
+ posSlotPrices[(size_t)slot * 2 ] += delta;
1033
+ posSlotPrices[(size_t)slot * 2 + 1] += delta;
1034
+ delta += ((UInt32)1 << kNumBitPriceShiftBits);
1035
+ }
1036
+ }
1037
+
1038
+ {
1039
+ UInt32 *dp = p->distancesPrices[lps];
1040
+
1041
+ dp[0] = posSlotPrices[0];
1042
+ dp[1] = posSlotPrices[1];
1043
+ dp[2] = posSlotPrices[2];
1044
+ dp[3] = posSlotPrices[3];
1045
+
1046
+ for (i = 4; i < kNumFullDistances; i += 2)
1047
+ {
1048
+ UInt32 slotPrice = posSlotPrices[GetPosSlot1(i)];
1049
+ dp[i ] = slotPrice + tempPrices[i];
1050
+ dp[i + 1] = slotPrice + tempPrices[i + 1];
1051
+ }
1052
+ }
1053
+ }
1054
+ // }
1055
+ }
1056
+
1057
+
1058
+
1059
+ void LzmaEnc_Construct(CLzmaEnc *p)
1060
+ {
1061
+ RangeEnc_Construct(&p->rc);
1062
+ MatchFinder_Construct(&p->matchFinderBase);
1063
+
1064
+ #ifndef _7ZIP_ST
1065
+ MatchFinderMt_Construct(&p->matchFinderMt);
1066
+ p->matchFinderMt.MatchFinder = &p->matchFinderBase;
1067
+ #endif
1068
+
1069
+ {
1070
+ CLzmaEncProps props;
1071
+ LzmaEncProps_Init(&props);
1072
+ LzmaEnc_SetProps(p, &props);
1073
+ }
1074
+
1075
+ #ifndef LZMA_LOG_BSR
1076
+ LzmaEnc_FastPosInit(p->g_FastPos);
1077
+ #endif
1078
+
1079
+ LzmaEnc_InitPriceTables(p->ProbPrices);
1080
+ p->litProbs = NULL;
1081
+ p->saveState.litProbs = NULL;
1082
+
1083
+ }
1084
+
1085
+ CLzmaEncHandle LzmaEnc_Create(ISzAllocPtr alloc)
1086
+ {
1087
+ void *p;
1088
+ p = ISzAlloc_Alloc(alloc, sizeof(CLzmaEnc));
1089
+ if (p)
1090
+ LzmaEnc_Construct((CLzmaEnc *)p);
1091
+ return p;
1092
+ }
1093
+
1094
+ void LzmaEnc_FreeLits(CLzmaEnc *p, ISzAllocPtr alloc)
1095
+ {
1096
+ ISzAlloc_Free(alloc, p->litProbs);
1097
+ ISzAlloc_Free(alloc, p->saveState.litProbs);
1098
+ p->litProbs = NULL;
1099
+ p->saveState.litProbs = NULL;
1100
+ }
1101
+
1102
+ void LzmaEnc_Destruct(CLzmaEnc *p, ISzAllocPtr alloc, ISzAllocPtr allocBig)
1103
+ {
1104
+ #ifndef _7ZIP_ST
1105
+ MatchFinderMt_Destruct(&p->matchFinderMt, allocBig);
1106
+ #endif
1107
+
1108
+ MatchFinder_Free(&p->matchFinderBase, allocBig);
1109
+ LzmaEnc_FreeLits(p, alloc);
1110
+ RangeEnc_Free(&p->rc, alloc);
1111
+ }
1112
+
1113
+ void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAllocPtr alloc, ISzAllocPtr allocBig)
1114
+ {
1115
+ LzmaEnc_Destruct((CLzmaEnc *)p, alloc, allocBig);
1116
+ ISzAlloc_Free(alloc, p);
1117
+ }
1118
+
1119
+
1120
+ #define kBigHashDicLimit ((UInt32)1 << 24)
1121
+
1122
+ static SRes LzmaEnc_Alloc(CLzmaEnc *p, UInt32 keepWindowSize, ISzAllocPtr alloc, ISzAllocPtr allocBig)
1123
+ {
1124
+ UInt32 beforeSize = kNumOpts;
1125
+ if (!RangeEnc_Alloc(&p->rc, alloc))
1126
+ return SZ_ERROR_MEM;
1127
+
1128
+ #ifndef _7ZIP_ST
1129
+ p->mtMode = (p->multiThread && !p->fastMode && (p->matchFinderBase.btMode != 0));
1130
+ #endif
1131
+
1132
+ {
1133
+ unsigned lclp = p->lc + p->lp;
1134
+ if (!p->litProbs || !p->saveState.litProbs || p->lclp != lclp)
1135
+ {
1136
+ LzmaEnc_FreeLits(p, alloc);
1137
+ p->litProbs = (CLzmaProb *)ISzAlloc_Alloc(alloc, ((UInt32)0x300 << lclp) * sizeof(CLzmaProb));
1138
+ p->saveState.litProbs = (CLzmaProb *)ISzAlloc_Alloc(alloc, ((UInt32)0x300 << lclp) * sizeof(CLzmaProb));
1139
+ if (!p->litProbs || !p->saveState.litProbs)
1140
+ {
1141
+ LzmaEnc_FreeLits(p, alloc);
1142
+ return SZ_ERROR_MEM;
1143
+ }
1144
+ p->lclp = lclp;
1145
+ }
1146
+ }
1147
+
1148
+ p->matchFinderBase.bigHash = (Byte)(p->dictSize > kBigHashDicLimit ? 1 : 0);
1149
+
1150
+ if (beforeSize + p->dictSize < keepWindowSize)
1151
+ beforeSize = keepWindowSize - p->dictSize;
1152
+
1153
+ #ifndef _7ZIP_ST
1154
+ if (p->mtMode)
1155
+ {
1156
+ RINOK(MatchFinderMt_Create(&p->matchFinderMt, p->dictSize, beforeSize, p->numFastBytes,
1157
+ LZMA_MATCH_LEN_MAX
1158
+ + 1 /* 18.04 */
1159
+ , allocBig));
1160
+ p->matchFinderObj = &p->matchFinderMt;
1161
+ p->matchFinderBase.bigHash = (Byte)(
1162
+ (p->dictSize > kBigHashDicLimit && p->matchFinderBase.hashMask >= 0xFFFFFF) ? 1 : 0);
1163
+ MatchFinderMt_CreateVTable(&p->matchFinderMt, &p->matchFinder);
1164
+ }
1165
+ else
1166
+ #endif
1167
+ {
1168
+ if (!MatchFinder_Create(&p->matchFinderBase, p->dictSize, beforeSize, p->numFastBytes, LZMA_MATCH_LEN_MAX, allocBig))
1169
+ return SZ_ERROR_MEM;
1170
+ p->matchFinderObj = &p->matchFinderBase;
1171
+ MatchFinder_CreateVTable(&p->matchFinderBase, &p->matchFinder);
1172
+ }
1173
+
1174
+ return SZ_OK;
1175
+ }
1176
+
1177
+ void LzmaEnc_Init(CLzmaEnc *p)
1178
+ {
1179
+ unsigned i;
1180
+ p->state = 0;
1181
+ p->reps[0] =
1182
+ p->reps[1] =
1183
+ p->reps[2] =
1184
+ p->reps[3] = 1;
1185
+
1186
+ RangeEnc_Init(&p->rc);
1187
+
1188
+ for (i = 0; i < (1 << kNumAlignBits); i++)
1189
+ p->posAlignEncoder[i] = kProbInitValue;
1190
+
1191
+ for (i = 0; i < kNumStates; i++)
1192
+ {
1193
+ unsigned j;
1194
+ for (j = 0; j < LZMA_NUM_PB_STATES_MAX; j++)
1195
+ {
1196
+ p->isMatch[i][j] = kProbInitValue;
1197
+ p->isRep0Long[i][j] = kProbInitValue;
1198
+ }
1199
+ p->isRep[i] = kProbInitValue;
1200
+ p->isRepG0[i] = kProbInitValue;
1201
+ p->isRepG1[i] = kProbInitValue;
1202
+ p->isRepG2[i] = kProbInitValue;
1203
+ }
1204
+
1205
+ {
1206
+ for (i = 0; i < kNumLenToPosStates; i++)
1207
+ {
1208
+ CLzmaProb *probs = p->posSlotEncoder[i];
1209
+ unsigned j;
1210
+ for (j = 0; j < (1 << kNumPosSlotBits); j++)
1211
+ probs[j] = kProbInitValue;
1212
+ }
1213
+ }
1214
+ {
1215
+ for (i = 0; i < kNumFullDistances; i++)
1216
+ p->posEncoders[i] = kProbInitValue;
1217
+ }
1218
+
1219
+ {
1220
+ UInt32 num = (UInt32)0x300 << (p->lp + p->lc);
1221
+ UInt32 k;
1222
+ CLzmaProb *probs = p->litProbs;
1223
+ for (k = 0; k < num; k++)
1224
+ probs[k] = kProbInitValue;
1225
+ }
1226
+
1227
+
1228
+ LenEnc_Init(&p->lenProbs);
1229
+ LenEnc_Init(&p->repLenProbs);
1230
+
1231
+ p->optEnd = 0;
1232
+ p->optCur = 0;
1233
+
1234
+ {
1235
+ for (i = 0; i < kNumOpts; i++)
1236
+ p->opt[i].price = kInfinityPrice;
1237
+ }
1238
+
1239
+ p->additionalOffset = 0;
1240
+
1241
+ p->pbMask = (1 << p->pb) - 1;
1242
+ p->lpMask = ((UInt32)0x100 << p->lp) - ((unsigned)0x100 >> p->lc);
1243
+ }
1244
+
1245
+
1246
+ void LzmaEnc_InitPrices(CLzmaEnc *p)
1247
+ {
1248
+ if (!p->fastMode)
1249
+ {
1250
+ FillDistancesPrices(p);
1251
+ FillAlignPrices(p);
1252
+ }
1253
+
1254
+ p->lenEnc.tableSize =
1255
+ p->repLenEnc.tableSize =
1256
+ p->numFastBytes + 1 - LZMA_MATCH_LEN_MIN;
1257
+
1258
+ p->repLenEncCounter = REP_LEN_COUNT;
1259
+
1260
+ LenPriceEnc_UpdateTables(&p->lenEnc, 1 << p->pb, &p->lenProbs, p->ProbPrices);
1261
+ LenPriceEnc_UpdateTables(&p->repLenEnc, 1 << p->pb, &p->repLenProbs, p->ProbPrices);
1262
+ }
1263
+
1264
+ typedef struct
1265
+ {
1266
+ ISeqOutStream vt;
1267
+ Byte *data;
1268
+ SizeT rem;
1269
+ BoolInt overflow;
1270
+ } CLzmaEnc_SeqOutStreamBuf;
1271
+
1272
+ static size_t SeqOutStreamBuf_Write(const ISeqOutStream *pp, const void *data, size_t size)
1273
+ {
1274
+ CLzmaEnc_SeqOutStreamBuf *p = CONTAINER_FROM_VTBL(pp, CLzmaEnc_SeqOutStreamBuf, vt);
1275
+ if (p->rem < size)
1276
+ {
1277
+ size = p->rem;
1278
+ p->overflow = True;
1279
+ }
1280
+ memcpy(p->data, data, size);
1281
+ p->rem -= size;
1282
+ p->data += size;
1283
+ return size;
1284
+ }
1285
+
1286
+
1287
+ UInt32 LzmaEnc_GetNumAvailableBytes(CLzmaEncHandle pp)
1288
+ {
1289
+ const CLzmaEnc *p = (CLzmaEnc *)pp;
1290
+ return p->matchFinder.GetNumAvailableBytes(p->matchFinderObj);
1291
+ }
1292
+
1293
+
1294
+ const Byte *LzmaEnc_GetCurBuf(CLzmaEncHandle pp)
1295
+ {
1296
+ const CLzmaEnc *p = (CLzmaEnc *)pp;
1297
+ return p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset;
1298
+ }
1299
+
1300
+
1301
+ SRes LzmaEnc_WriteProperties(CLzmaEncHandle pp, Byte *props, SizeT *size)
1302
+ {
1303
+ CLzmaEnc *p = (CLzmaEnc *)pp;
1304
+ unsigned i;
1305
+ UInt32 dictSize = p->dictSize;
1306
+ if (*size < LZMA_PROPS_SIZE)
1307
+ return SZ_ERROR_PARAM;
1308
+ *size = LZMA_PROPS_SIZE;
1309
+ props[0] = (Byte)((p->pb * 5 + p->lp) * 9 + p->lc);
1310
+
1311
+ if (dictSize >= ((UInt32)1 << 22))
1312
+ {
1313
+ UInt32 kDictMask = ((UInt32)1 << 20) - 1;
1314
+ if (dictSize < (UInt32)0xFFFFFFFF - kDictMask)
1315
+ dictSize = (dictSize + kDictMask) & ~kDictMask;
1316
+ }
1317
+ else for (i = 11; i <= 30; i++)
1318
+ {
1319
+ if (dictSize <= ((UInt32)2 << i)) { dictSize = (2 << i); break; }
1320
+ if (dictSize <= ((UInt32)3 << i)) { dictSize = (3 << i); break; }
1321
+ }
1322
+
1323
+ for (i = 0; i < 4; i++)
1324
+ props[1 + i] = (Byte)(dictSize >> (8 * i));
1325
+ return SZ_OK;
1326
+ }
1327
+
1328
+
1329
+
1330
+