Coverage Report

Created: 2025-10-10 07:03

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/lzma-fuzz/sdk/C/LzmaDec.c
Line
Count
Source
1
/* LzmaDec.c -- LZMA Decoder
2
2018-07-04 : Igor Pavlov : Public domain */
3
4
#include "Precomp.h"
5
6
#include <string.h>
7
8
/* #include "CpuArch.h" */
9
#include "LzmaDec.h"
10
11
3.10G
#define kNumTopBits 24
12
3.10G
#define kTopValue ((UInt32)1 << kNumTopBits)
13
14
15.7G
#define kNumBitModelTotalBits 11
15
12.7G
#define kBitModelTotal (1 << kNumBitModelTotalBits)
16
2.86G
#define kNumMoveBits 5
17
18
1.53M
#define RC_INIT_SIZE 5
19
20
2.92G
#define NORMALIZE if (range < kTopValue) { range <<= 8; code = (code << 8) | (*buf++); }
21
22
2.86G
#define IF_BIT_0(p) ttt = *(p); NORMALIZE; bound = (range >> kNumBitModelTotalBits) * (UInt32)ttt; if (code < bound)
23
2.26G
#define UPDATE_0(p) range = bound; *(p) = (CLzmaProb)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits));
24
601M
#define UPDATE_1(p) range -= bound; code -= bound; *(p) = (CLzmaProb)(ttt - (ttt >> kNumMoveBits));
25
2.41G
#define GET_BIT2(p, i, A0, A1) IF_BIT_0(p) \
26
2.41G
  { UPDATE_0(p); i = (i + i); A0; } else \
27
2.41G
  { UPDATE_1(p); i = (i + i) + 1; A1; }
28
29
2.29G
#define TREE_GET_BIT(probs, i) { GET_BIT2(probs + i, i, ;, ;); }
30
31
28.2M
#define REV_BIT(p, i, A0, A1) IF_BIT_0(p + i) \
32
28.2M
  { UPDATE_0(p + i); A0; } else \
33
28.2M
  { UPDATE_1(p + i); A1; }
34
6.73M
#define REV_BIT_VAR(  p, i, m) REV_BIT(p, i, i += m; m += m, m += m; i += m; )
35
16.1M
#define REV_BIT_CONST(p, i, m) REV_BIT(p, i, i += m;       , i += m * 2; )
36
5.37M
#define REV_BIT_LAST( p, i, m) REV_BIT(p, i, i -= m        , ; )
37
38
#define TREE_DECODE(probs, limit, i) \
39
57.2M
  { i = 1; do { TREE_GET_BIT(probs, i); } while (i < limit); i -= limit; }
40
41
/* #define _LZMA_SIZE_OPT */
42
43
#ifdef _LZMA_SIZE_OPT
44
#define TREE_6_DECODE(probs, i) TREE_DECODE(probs, (1 << 6), i)
45
#else
46
#define TREE_6_DECODE(probs, i) \
47
8.48M
  { i = 1; \
48
8.48M
  TREE_GET_BIT(probs, i); \
49
8.48M
  TREE_GET_BIT(probs, i); \
50
8.48M
  TREE_GET_BIT(probs, i); \
51
8.48M
  TREE_GET_BIT(probs, i); \
52
8.48M
  TREE_GET_BIT(probs, i); \
53
8.48M
  TREE_GET_BIT(probs, i); \
54
8.48M
  i -= 0x40; }
55
#endif
56
57
2.13G
#define NORMAL_LITER_DEC TREE_GET_BIT(prob, symbol)
58
#define MATCHED_LITER_DEC \
59
118M
  matchByte += matchByte; \
60
118M
  bit = offs; \
61
118M
  offs &= matchByte; \
62
118M
  probLit = prob + (offs + bit + symbol); \
63
118M
  GET_BIT2(probLit, symbol, offs ^= bit; , ;)
64
65
66
67
182M
#define NORMALIZE_CHECK if (range < kTopValue) { if (buf >= bufLimit) return DUMMY_ERROR; range <<= 8; code = (code << 8) | (*buf++); }
68
69
164M
#define IF_BIT_0_CHECK(p) ttt = *(p); NORMALIZE_CHECK; bound = (range >> kNumBitModelTotalBits) * (UInt32)ttt; if (code < bound)
70
156M
#define UPDATE_0_CHECK range = bound;
71
8.12M
#define UPDATE_1_CHECK range -= bound; code -= bound;
72
142M
#define GET_BIT2_CHECK(p, i, A0, A1) IF_BIT_0_CHECK(p) \
73
142M
  { UPDATE_0_CHECK; i = (i + i); A0; } else \
74
142M
  { UPDATE_1_CHECK; i = (i + i) + 1; A1; }
75
140M
#define GET_BIT_CHECK(p, i) GET_BIT2_CHECK(p, i, ; , ;)
76
#define TREE_DECODE_CHECK(probs, limit, i) \
77
4.21M
  { i = 1; do { GET_BIT_CHECK(probs + i, i) } while (i < limit); i -= limit; }
78
79
80
160k
#define REV_BIT_CHECK(p, i, m) IF_BIT_0_CHECK(p + i) \
81
160k
  { UPDATE_0_CHECK; i += m; m += m; } else \
82
160k
  { UPDATE_1_CHECK; m += m; i += m; }
83
84
85
2.54G
#define kNumPosBitsMax 4
86
1.43G
#define kNumPosStatesMax (1 << kNumPosBitsMax)
87
88
1.47G
#define kLenNumLowBits 3
89
29.6M
#define kLenNumLowSymbols (1 << kLenNumLowBits)
90
1.44G
#define kLenNumHighBits 8
91
1.44G
#define kLenNumHighSymbols (1 << kLenNumHighBits)
92
93
1.48G
#define LenLow 0
94
1.43G
#define LenHigh (LenLow + 2 * (kNumPosStatesMax << kLenNumLowBits))
95
1.42G
#define kNumLenProbs (LenHigh + kLenNumHighSymbols)
96
97
24.9M
#define LenChoice LenLow
98
8.71M
#define LenChoice2 (LenLow + (1 << kLenNumLowBits))
99
100
1.33G
#define kNumStates 12
101
1.11G
#define kNumStates2 16
102
335M
#define kNumLitStates 7
103
104
8.56M
#define kStartPosModelIndex 4
105
751M
#define kEndPosModelIndex 14
106
743M
#define kNumFullDistances (1 << (kEndPosModelIndex >> 1))
107
108
308M
#define kNumPosSlotBits 6
109
309M
#define kNumLenToPosStates 4
110
111
385M
#define kNumAlignBits 4
112
374M
#define kAlignTableSize (1 << kNumAlignBits)
113
114
46.2M
#define kMatchMinLen 2
115
22.0M
#define kMatchSpecLenStart (kMatchMinLen + kLenNumLowSymbols * 2 + kLenNumHighSymbols)
116
117
/* External ASM code needs same CLzmaProb array layout. So don't change it. */
118
119
/* (probs_1664) is faster and better for code size at some platforms */
120
/*
121
#ifdef MY_CPU_X86_OR_AMD64
122
*/
123
745M
#define kStartOffset 1664
124
37.1M
#define GET_PROBS p->probs_1664
125
/*
126
#define GET_PROBS p->probs + kStartOffset
127
#else
128
#define kStartOffset 0
129
#define GET_PROBS p->probs
130
#endif
131
*/
132
133
745M
#define SpecPos (-kStartOffset)
134
743M
#define IsRep0Long (SpecPos + kNumFullDistances)
135
733M
#define RepLenCoder (IsRep0Long + (kNumStates2 << kNumPosBitsMax))
136
717M
#define LenCoder (RepLenCoder + kNumLenProbs)
137
708M
#define IsMatch (LenCoder + kNumLenProbs)
138
380M
#define Align (IsMatch + (kNumStates2 << kNumPosBitsMax))
139
374M
#define IsRep (Align + kAlignTableSize)
140
346M
#define IsRepG0 (IsRep + kNumStates)
141
326M
#define IsRepG1 (IsRepG0 + kNumStates)
142
315M
#define IsRepG2 (IsRepG1 + kNumStates)
143
308M
#define PosSlot (IsRepG2 + kNumStates)
144
299M
#define Literal (PosSlot + (kNumLenToPosStates << kNumPosSlotBits))
145
291k
#define NUM_BASE_PROBS (Literal + kStartOffset)
146
147
#if Align != 0 && kStartOffset != 0
148
  #error Stop_Compiling_Bad_LZMA_kAlign
149
#endif
150
151
#if NUM_BASE_PROBS != 1984
152
  #error Stop_Compiling_Bad_LZMA_PROBS
153
#endif
154
155
156
17.3M
#define LZMA_LIT_SIZE 0x300
157
158
291k
#define LzmaProps_GetNumProbs(p) (NUM_BASE_PROBS + ((UInt32)LZMA_LIT_SIZE << ((p)->lc + (p)->lp)))
159
160
161
328M
#define CALC_POS_STATE(processedPos, pbMask) (((processedPos) & (pbMask)) << 4)
162
338M
#define COMBINED_PS_STATE (posState + state)
163
17.5M
#define GET_LEN_STATE (posState)
164
165
83.5k
#define LZMA_DIC_MIN (1 << 12)
166
167
/*
168
p->remainLen : shows status of LZMA decoder:
169
    < kMatchSpecLenStart : normal remain
170
    = kMatchSpecLenStart : finished
171
    = kMatchSpecLenStart + 1 : need init range coder
172
    = kMatchSpecLenStart + 2 : need init range coder and state
173
*/
174
175
/* ---------- LZMA_DECODE_REAL ---------- */
176
/*
177
LzmaDec_DecodeReal_3() can be implemented in external ASM file.
178
3 - is the code compatibility version of that function for check at link time.
179
*/
180
181
#define LZMA_DECODE_REAL LzmaDec_DecodeReal_3
182
183
/*
184
LZMA_DECODE_REAL()
185
In:
186
  RangeCoder is normalized
187
  if (p->dicPos == limit)
188
  {
189
    LzmaDec_TryDummy() was called before to exclude LITERAL and MATCH-REP cases.
190
    So first symbol can be only MATCH-NON-REP. And if that MATCH-NON-REP symbol
191
    is not END_OF_PAYALOAD_MARKER, then function returns error code.
192
  }
193
194
Processing:
195
  first LZMA symbol will be decoded in any case
196
  All checks for limits are at the end of main loop,
197
  It will decode new LZMA-symbols while (p->buf < bufLimit && dicPos < limit),
198
  RangeCoder is still without last normalization when (p->buf < bufLimit) is being checked.
199
200
Out:
201
  RangeCoder is normalized
202
  Result:
203
    SZ_OK - OK
204
    SZ_ERROR_DATA - Error
205
  p->remainLen:
206
    < kMatchSpecLenStart : normal remain
207
    = kMatchSpecLenStart : finished
208
*/
209
210
211
#ifdef _LZMA_DEC_OPT
212
213
int MY_FAST_CALL LZMA_DECODE_REAL(CLzmaDec *p, SizeT limit, const Byte *bufLimit);
214
215
#else
216
217
static
218
int MY_FAST_CALL LZMA_DECODE_REAL(CLzmaDec *p, SizeT limit, const Byte *bufLimit)
219
19.1M
{
220
19.1M
  CLzmaProb *probs = GET_PROBS;
221
19.1M
  unsigned state = (unsigned)p->state;
222
19.1M
  UInt32 rep0 = p->reps[0], rep1 = p->reps[1], rep2 = p->reps[2], rep3 = p->reps[3];
223
19.1M
  unsigned pbMask = ((unsigned)1 << (p->prop.pb)) - 1;
224
19.1M
  unsigned lc = p->prop.lc;
225
19.1M
  unsigned lpMask = ((unsigned)0x100 << p->prop.lp) - ((unsigned)0x100 >> lc);
226
227
19.1M
  Byte *dic = p->dic;
228
19.1M
  SizeT dicBufSize = p->dicBufSize;
229
19.1M
  SizeT dicPos = p->dicPos;
230
  
231
19.1M
  UInt32 processedPos = p->processedPos;
232
19.1M
  UInt32 checkDicSize = p->checkDicSize;
233
19.1M
  unsigned len = 0;
234
235
19.1M
  const Byte *buf = p->buf;
236
19.1M
  UInt32 range = p->range;
237
19.1M
  UInt32 code = p->code;
238
239
19.1M
  do
240
310M
  {
241
310M
    CLzmaProb *prob;
242
310M
    UInt32 bound;
243
310M
    unsigned ttt;
244
310M
    unsigned posState = CALC_POS_STATE(processedPos, pbMask);
245
246
310M
    prob = probs + IsMatch + COMBINED_PS_STATE;
247
310M
    IF_BIT_0(prob)
248
282M
    {
249
282M
      unsigned symbol;
250
282M
      UPDATE_0(prob);
251
282M
      prob = probs + Literal;
252
282M
      if (processedPos != 0 || checkDicSize != 0)
253
282M
        prob += (UInt32)3 * ((((processedPos << 8) + dic[(dicPos == 0 ? dicBufSize : dicPos) - 1]) & lpMask) << lc);
254
282M
      processedPos++;
255
256
282M
      if (state < kNumLitStates)
257
267M
      {
258
267M
        state -= (state < 4) ? state : 3;
259
267M
        symbol = 1;
260
        #ifdef _LZMA_SIZE_OPT
261
        do { NORMAL_LITER_DEC } while (symbol < 0x100);
262
        #else
263
267M
        NORMAL_LITER_DEC
264
267M
        NORMAL_LITER_DEC
265
267M
        NORMAL_LITER_DEC
266
267M
        NORMAL_LITER_DEC
267
267M
        NORMAL_LITER_DEC
268
267M
        NORMAL_LITER_DEC
269
267M
        NORMAL_LITER_DEC
270
267M
        NORMAL_LITER_DEC
271
267M
        #endif
272
267M
      }
273
14.8M
      else
274
14.8M
      {
275
14.8M
        unsigned matchByte = dic[dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0)];
276
14.8M
        unsigned offs = 0x100;
277
14.8M
        state -= (state < 10) ? 3 : 6;
278
14.8M
        symbol = 1;
279
        #ifdef _LZMA_SIZE_OPT
280
        do
281
        {
282
          unsigned bit;
283
          CLzmaProb *probLit;
284
          MATCHED_LITER_DEC
285
        }
286
        while (symbol < 0x100);
287
        #else
288
14.8M
        {
289
14.8M
          unsigned bit;
290
14.8M
          CLzmaProb *probLit;
291
14.8M
          MATCHED_LITER_DEC
292
14.8M
          MATCHED_LITER_DEC
293
14.8M
          MATCHED_LITER_DEC
294
14.8M
          MATCHED_LITER_DEC
295
14.8M
          MATCHED_LITER_DEC
296
14.8M
          MATCHED_LITER_DEC
297
14.8M
          MATCHED_LITER_DEC
298
14.8M
          MATCHED_LITER_DEC
299
14.8M
        }
300
14.8M
        #endif
301
14.8M
      }
302
303
282M
      dic[dicPos++] = (Byte)symbol;
304
282M
      continue;
305
282M
    }
306
    
307
27.8M
    {
308
27.8M
      UPDATE_1(prob);
309
27.8M
      prob = probs + IsRep + state;
310
27.8M
      IF_BIT_0(prob)
311
8.48M
      {
312
8.48M
        UPDATE_0(prob);
313
8.48M
        state += kNumStates;
314
8.48M
        prob = probs + LenCoder;
315
8.48M
      }
316
19.3M
      else
317
19.3M
      {
318
19.3M
        UPDATE_1(prob);
319
        /*
320
        // that case was checked before with kBadRepCode
321
        if (checkDicSize == 0 && processedPos == 0)
322
          return SZ_ERROR_DATA;
323
        */
324
19.3M
        prob = probs + IsRepG0 + state;
325
19.3M
        IF_BIT_0(prob)
326
9.73M
        {
327
9.73M
          UPDATE_0(prob);
328
9.73M
          prob = probs + IsRep0Long + COMBINED_PS_STATE;
329
9.73M
          IF_BIT_0(prob)
330
3.65M
          {
331
3.65M
            UPDATE_0(prob);
332
3.65M
            dic[dicPos] = dic[dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0)];
333
3.65M
            dicPos++;
334
3.65M
            processedPos++;
335
3.65M
            state = state < kNumLitStates ? 9 : 11;
336
3.65M
            continue;
337
3.65M
          }
338
6.08M
          UPDATE_1(prob);
339
6.08M
        }
340
9.62M
        else
341
9.62M
        {
342
9.62M
          UInt32 distance;
343
9.62M
          UPDATE_1(prob);
344
9.62M
          prob = probs + IsRepG1 + state;
345
9.62M
          IF_BIT_0(prob)
346
2.62M
          {
347
2.62M
            UPDATE_0(prob);
348
2.62M
            distance = rep1;
349
2.62M
          }
350
7.00M
          else
351
7.00M
          {
352
7.00M
            UPDATE_1(prob);
353
7.00M
            prob = probs + IsRepG2 + state;
354
7.00M
            IF_BIT_0(prob)
355
698k
            {
356
698k
              UPDATE_0(prob);
357
698k
              distance = rep2;
358
698k
            }
359
6.30M
            else
360
6.30M
            {
361
6.30M
              UPDATE_1(prob);
362
6.30M
              distance = rep3;
363
6.30M
              rep3 = rep2;
364
6.30M
            }
365
7.00M
            rep2 = rep1;
366
7.00M
          }
367
9.62M
          rep1 = rep0;
368
9.62M
          rep0 = distance;
369
9.62M
        }
370
15.7M
        state = state < kNumLitStates ? 8 : 11;
371
15.7M
        prob = probs + RepLenCoder;
372
15.7M
      }
373
      
374
      #ifdef _LZMA_SIZE_OPT
375
      {
376
        unsigned lim, offset;
377
        CLzmaProb *probLen = prob + LenChoice;
378
        IF_BIT_0(probLen)
379
        {
380
          UPDATE_0(probLen);
381
          probLen = prob + LenLow + GET_LEN_STATE;
382
          offset = 0;
383
          lim = (1 << kLenNumLowBits);
384
        }
385
        else
386
        {
387
          UPDATE_1(probLen);
388
          probLen = prob + LenChoice2;
389
          IF_BIT_0(probLen)
390
          {
391
            UPDATE_0(probLen);
392
            probLen = prob + LenLow + GET_LEN_STATE + (1 << kLenNumLowBits);
393
            offset = kLenNumLowSymbols;
394
            lim = (1 << kLenNumLowBits);
395
          }
396
          else
397
          {
398
            UPDATE_1(probLen);
399
            probLen = prob + LenHigh;
400
            offset = kLenNumLowSymbols * 2;
401
            lim = (1 << kLenNumHighBits);
402
          }
403
        }
404
        TREE_DECODE(probLen, lim, len);
405
        len += offset;
406
      }
407
      #else
408
24.1M
      {
409
24.1M
        CLzmaProb *probLen = prob + LenChoice;
410
24.1M
        IF_BIT_0(probLen)
411
15.9M
        {
412
15.9M
          UPDATE_0(probLen);
413
15.9M
          probLen = prob + LenLow + GET_LEN_STATE;
414
15.9M
          len = 1;
415
15.9M
          TREE_GET_BIT(probLen, len);
416
15.9M
          TREE_GET_BIT(probLen, len);
417
15.9M
          TREE_GET_BIT(probLen, len);
418
15.9M
          len -= 8;
419
15.9M
        }
420
8.24M
        else
421
8.24M
        {
422
8.24M
          UPDATE_1(probLen);
423
8.24M
          probLen = prob + LenChoice2;
424
8.24M
          IF_BIT_0(probLen)
425
1.08M
          {
426
1.08M
            UPDATE_0(probLen);
427
1.08M
            probLen = prob + LenLow + GET_LEN_STATE + (1 << kLenNumLowBits);
428
1.08M
            len = 1;
429
1.08M
            TREE_GET_BIT(probLen, len);
430
1.08M
            TREE_GET_BIT(probLen, len);
431
1.08M
            TREE_GET_BIT(probLen, len);
432
1.08M
          }
433
7.16M
          else
434
7.16M
          {
435
7.16M
            UPDATE_1(probLen);
436
7.16M
            probLen = prob + LenHigh;
437
7.16M
            TREE_DECODE(probLen, (1 << kLenNumHighBits), len);
438
7.16M
            len += kLenNumLowSymbols * 2;
439
7.16M
          }
440
8.24M
        }
441
24.1M
      }
442
24.1M
      #endif
443
444
24.1M
      if (state >= kNumStates)
445
8.48M
      {
446
8.48M
        UInt32 distance;
447
8.48M
        prob = probs + PosSlot +
448
8.48M
            ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << kNumPosSlotBits);
449
8.48M
        TREE_6_DECODE(prob, distance);
450
8.48M
        if (distance >= kStartPosModelIndex)
451
7.73M
        {
452
7.73M
          unsigned posSlot = (unsigned)distance;
453
7.73M
          unsigned numDirectBits = (unsigned)(((distance >> 1) - 1));
454
7.73M
          distance = (2 | (distance & 1));
455
7.73M
          if (posSlot < kEndPosModelIndex)
456
2.36M
          {
457
2.36M
            distance <<= numDirectBits;
458
2.36M
            prob = probs + SpecPos;
459
2.36M
            {
460
2.36M
              UInt32 m = 1;
461
2.36M
              distance++;
462
2.36M
              do
463
6.73M
              {
464
6.73M
                REV_BIT_VAR(prob, distance, m);
465
6.73M
              }
466
6.73M
              while (--numDirectBits);
467
2.36M
              distance -= m;
468
2.36M
            }
469
2.36M
          }
470
5.37M
          else
471
5.37M
          {
472
5.37M
            numDirectBits -= kNumAlignBits;
473
5.37M
            do
474
41.8M
            {
475
41.8M
              NORMALIZE
476
41.8M
              range >>= 1;
477
              
478
41.8M
              {
479
41.8M
                UInt32 t;
480
41.8M
                code -= range;
481
41.8M
                t = (0 - ((UInt32)code >> 31)); /* (UInt32)((Int32)code >> 31) */
482
41.8M
                distance = (distance << 1) + (t + 1);
483
41.8M
                code += range & t;
484
41.8M
              }
485
              /*
486
              distance <<= 1;
487
              if (code >= range)
488
              {
489
                code -= range;
490
                distance |= 1;
491
              }
492
              */
493
41.8M
            }
494
41.8M
            while (--numDirectBits);
495
5.37M
            prob = probs + Align;
496
5.37M
            distance <<= kNumAlignBits;
497
5.37M
            {
498
5.37M
              unsigned i = 1;
499
5.37M
              REV_BIT_CONST(prob, i, 1);
500
5.37M
              REV_BIT_CONST(prob, i, 2);
501
5.37M
              REV_BIT_CONST(prob, i, 4);
502
5.37M
              REV_BIT_LAST (prob, i, 8);
503
5.37M
              distance |= i;
504
5.37M
            }
505
5.37M
            if (distance == (UInt32)0xFFFFFFFF)
506
5.07k
            {
507
5.07k
              len = kMatchSpecLenStart;
508
5.07k
              state -= kNumStates;
509
5.07k
              break;
510
5.07k
            }
511
5.37M
          }
512
7.73M
        }
513
        
514
8.48M
        rep3 = rep2;
515
8.48M
        rep2 = rep1;
516
8.48M
        rep1 = rep0;
517
8.48M
        rep0 = distance + 1;
518
8.48M
        state = (state < kNumStates + kNumLitStates) ? kNumLitStates : kNumLitStates + 3;
519
8.48M
        if (distance >= (checkDicSize == 0 ? processedPos: checkDicSize))
520
2.97k
        {
521
2.97k
          p->dicPos = dicPos;
522
2.97k
          return SZ_ERROR_DATA;
523
2.97k
        }
524
8.48M
      }
525
526
24.1M
      len += kMatchMinLen;
527
528
24.1M
      {
529
24.1M
        SizeT rem;
530
24.1M
        unsigned curLen;
531
24.1M
        SizeT pos;
532
        
533
24.1M
        if ((rem = limit - dicPos) == 0)
534
12
        {
535
12
          p->dicPos = dicPos;
536
12
          return SZ_ERROR_DATA;
537
12
        }
538
        
539
24.1M
        curLen = ((rem < len) ? (unsigned)rem : len);
540
24.1M
        pos = dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0);
541
542
24.1M
        processedPos += (UInt32)curLen;
543
544
24.1M
        len -= curLen;
545
24.1M
        if (curLen <= dicBufSize - pos)
546
24.1M
        {
547
24.1M
          Byte *dest = dic + dicPos;
548
24.1M
          ptrdiff_t src = (ptrdiff_t)pos - (ptrdiff_t)dicPos;
549
24.1M
          const Byte *lim = dest + curLen;
550
24.1M
          dicPos += (SizeT)curLen;
551
24.1M
          do
552
1.74G
            *(dest) = (Byte)*(dest + src);
553
1.74G
          while (++dest != lim);
554
24.1M
        }
555
4.03k
        else
556
4.03k
        {
557
4.03k
          do
558
1.04M
          {
559
1.04M
            dic[dicPos++] = dic[pos];
560
1.04M
            if (++pos == dicBufSize)
561
4.03k
              pos = 0;
562
1.04M
          }
563
1.04M
          while (--curLen != 0);
564
4.03k
        }
565
24.1M
      }
566
24.1M
    }
567
24.1M
  }
568
310M
  while (dicPos < limit && buf < bufLimit);
569
570
19.1M
  NORMALIZE;
571
  
572
19.1M
  p->buf = buf;
573
19.1M
  p->range = range;
574
19.1M
  p->code = code;
575
19.1M
  p->remainLen = (UInt32)len;
576
19.1M
  p->dicPos = dicPos;
577
19.1M
  p->processedPos = processedPos;
578
19.1M
  p->reps[0] = rep0;
579
19.1M
  p->reps[1] = rep1;
580
19.1M
  p->reps[2] = rep2;
581
19.1M
  p->reps[3] = rep3;
582
19.1M
  p->state = (UInt32)state;
583
584
19.1M
  return SZ_OK;
585
19.1M
}
586
#endif
587
588
static void MY_FAST_CALL LzmaDec_WriteRem(CLzmaDec *p, SizeT limit)
589
19.7M
{
590
19.7M
  if (p->remainLen != 0 && p->remainLen < kMatchSpecLenStart)
591
437k
  {
592
437k
    Byte *dic = p->dic;
593
437k
    SizeT dicPos = p->dicPos;
594
437k
    SizeT dicBufSize = p->dicBufSize;
595
437k
    unsigned len = (unsigned)p->remainLen;
596
437k
    SizeT rep0 = p->reps[0]; /* we use SizeT to avoid the BUG of VC14 for AMD64 */
597
437k
    SizeT rem = limit - dicPos;
598
437k
    if (rem < len)
599
218k
      len = (unsigned)(rem);
600
601
437k
    if (p->checkDicSize == 0 && p->prop.dicSize - p->processedPos <= len)
602
94
      p->checkDicSize = p->prop.dicSize;
603
604
437k
    p->processedPos += (UInt32)len;
605
437k
    p->remainLen -= (UInt32)len;
606
31.1M
    while (len != 0)
607
30.7M
    {
608
30.7M
      len--;
609
30.7M
      dic[dicPos] = dic[dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0)];
610
30.7M
      dicPos++;
611
30.7M
    }
612
437k
    p->dicPos = dicPos;
613
437k
  }
614
19.7M
}
615
616
617
625k
#define kRange0 0xFFFFFFFF
618
416k
#define kBound0 ((kRange0 >> kNumBitModelTotalBits) << (kNumBitModelTotalBits - 1))
619
208k
#define kBadRepCode (kBound0 + (((kRange0 - kBound0) >> kNumBitModelTotalBits) << (kNumBitModelTotalBits - 1)))
620
#if kBadRepCode != (0xC0000000 - 0x400)
621
  #error Stop_Compiling_Bad_LZMA_Check
622
#endif
623
624
static int MY_FAST_CALL LzmaDec_DecodeReal2(CLzmaDec *p, SizeT limit, const Byte *bufLimit)
625
19.0M
{
626
19.0M
  do
627
19.1M
  {
628
19.1M
    SizeT limit2 = limit;
629
19.1M
    if (p->checkDicSize == 0)
630
3.47M
    {
631
3.47M
      UInt32 rem = p->prop.dicSize - p->processedPos;
632
3.47M
      if (limit - p->dicPos > rem)
633
46.2k
        limit2 = p->dicPos + rem;
634
635
3.47M
      if (p->processedPos == 0)
636
208k
        if (p->code >= kBadRepCode)
637
335
          return SZ_ERROR_DATA;
638
3.47M
    }
639
640
19.1M
    RINOK(LZMA_DECODE_REAL(p, limit2, bufLimit));
641
    
642
19.1M
    if (p->checkDicSize == 0 && p->processedPos >= p->prop.dicSize)
643
19.8k
      p->checkDicSize = p->prop.dicSize;
644
    
645
19.1M
    LzmaDec_WriteRem(p, limit);
646
19.1M
  }
647
19.1M
  while (p->dicPos < limit && p->buf < bufLimit && p->remainLen < kMatchSpecLenStart);
648
649
19.0M
  return 0;
650
19.0M
}
651
652
typedef enum
653
{
654
  DUMMY_ERROR, /* unexpected end of input stream */
655
  DUMMY_LIT,
656
  DUMMY_MATCH,
657
  DUMMY_REP
658
} ELzmaDummy;
659
660
static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, SizeT inSize)
661
18.0M
{
662
18.0M
  UInt32 range = p->range;
663
18.0M
  UInt32 code = p->code;
664
18.0M
  const Byte *bufLimit = buf + inSize;
665
18.0M
  const CLzmaProb *probs = GET_PROBS;
666
18.0M
  unsigned state = (unsigned)p->state;
667
18.0M
  ELzmaDummy res;
668
669
18.0M
  {
670
18.0M
    const CLzmaProb *prob;
671
18.0M
    UInt32 bound;
672
18.0M
    unsigned ttt;
673
18.0M
    unsigned posState = CALC_POS_STATE(p->processedPos, (1 << p->prop.pb) - 1);
674
675
18.0M
    prob = probs + IsMatch + COMBINED_PS_STATE;
676
18.0M
    IF_BIT_0_CHECK(prob)
677
17.2M
    {
678
17.2M
      UPDATE_0_CHECK
679
680
      /* if (bufLimit - buf >= 7) return DUMMY_LIT; */
681
682
17.2M
      prob = probs + Literal;
683
17.2M
      if (p->checkDicSize != 0 || p->processedPos != 0)
684
17.0M
        prob += ((UInt32)LZMA_LIT_SIZE *
685
17.0M
            ((((p->processedPos) & ((1 << (p->prop.lp)) - 1)) << p->prop.lc) +
686
17.0M
            (p->dic[(p->dicPos == 0 ? p->dicBufSize : p->dicPos) - 1] >> (8 - p->prop.lc))));
687
688
17.2M
      if (state < kNumLitStates)
689
16.9M
      {
690
16.9M
        unsigned symbol = 1;
691
135M
        do { GET_BIT_CHECK(prob + symbol, symbol) } while (symbol < 0x100);
692
16.9M
      }
693
241k
      else
694
241k
      {
695
241k
        unsigned matchByte = p->dic[p->dicPos - p->reps[0] +
696
241k
            (p->dicPos < p->reps[0] ? p->dicBufSize : 0)];
697
241k
        unsigned offs = 0x100;
698
241k
        unsigned symbol = 1;
699
241k
        do
700
1.90M
        {
701
1.90M
          unsigned bit;
702
1.90M
          const CLzmaProb *probLit;
703
1.90M
          matchByte += matchByte;
704
1.90M
          bit = offs;
705
1.90M
          offs &= matchByte;
706
1.90M
          probLit = prob + (offs + bit + symbol);
707
1.90M
          GET_BIT2_CHECK(probLit, symbol, offs ^= bit; , ; )
708
1.89M
        }
709
1.89M
        while (symbol < 0x100);
710
241k
      }
711
17.2M
      res = DUMMY_LIT;
712
17.2M
    }
713
811k
    else
714
811k
    {
715
811k
      unsigned len;
716
811k
      UPDATE_1_CHECK;
717
718
811k
      prob = probs + IsRep + state;
719
811k
      IF_BIT_0_CHECK(prob)
720
82.3k
      {
721
82.3k
        UPDATE_0_CHECK;
722
82.3k
        state = 0;
723
82.3k
        prob = probs + LenCoder;
724
82.3k
        res = DUMMY_MATCH;
725
82.3k
      }
726
727k
      else
727
727k
      {
728
727k
        UPDATE_1_CHECK;
729
727k
        res = DUMMY_REP;
730
727k
        prob = probs + IsRepG0 + state;
731
727k
        IF_BIT_0_CHECK(prob)
732
96.8k
        {
733
96.8k
          UPDATE_0_CHECK;
734
96.8k
          prob = probs + IsRep0Long + COMBINED_PS_STATE;
735
96.8k
          IF_BIT_0_CHECK(prob)
736
36.5k
          {
737
36.5k
            UPDATE_0_CHECK;
738
36.5k
            NORMALIZE_CHECK;
739
36.0k
            return DUMMY_REP;
740
36.5k
          }
741
59.5k
          else
742
59.5k
          {
743
59.5k
            UPDATE_1_CHECK;
744
59.5k
          }
745
96.1k
        }
746
629k
        else
747
629k
        {
748
629k
          UPDATE_1_CHECK;
749
629k
          prob = probs + IsRepG1 + state;
750
629k
          IF_BIT_0_CHECK(prob)
751
190k
          {
752
190k
            UPDATE_0_CHECK;
753
190k
          }
754
438k
          else
755
438k
          {
756
438k
            UPDATE_1_CHECK;
757
438k
            prob = probs + IsRepG2 + state;
758
438k
            IF_BIT_0_CHECK(prob)
759
23.6k
            {
760
23.6k
              UPDATE_0_CHECK;
761
23.6k
            }
762
414k
            else
763
414k
            {
764
414k
              UPDATE_1_CHECK;
765
414k
            }
766
437k
          }
767
628k
        }
768
687k
        state = kNumStates;
769
687k
        prob = probs + RepLenCoder;
770
687k
      }
771
770k
      {
772
770k
        unsigned limit, offset;
773
770k
        const CLzmaProb *probLen = prob + LenChoice;
774
770k
        IF_BIT_0_CHECK(probLen)
775
299k
        {
776
299k
          UPDATE_0_CHECK;
777
299k
          probLen = prob + LenLow + GET_LEN_STATE;
778
299k
          offset = 0;
779
299k
          limit = 1 << kLenNumLowBits;
780
299k
        }
781
468k
        else
782
468k
        {
783
468k
          UPDATE_1_CHECK;
784
468k
          probLen = prob + LenChoice2;
785
468k
          IF_BIT_0_CHECK(probLen)
786
176k
          {
787
176k
            UPDATE_0_CHECK;
788
176k
            probLen = prob + LenLow + GET_LEN_STATE + (1 << kLenNumLowBits);
789
176k
            offset = kLenNumLowSymbols;
790
176k
            limit = 1 << kLenNumLowBits;
791
176k
          }
792
291k
          else
793
291k
          {
794
291k
            UPDATE_1_CHECK;
795
291k
            probLen = prob + LenHigh;
796
291k
            offset = kLenNumLowSymbols * 2;
797
291k
            limit = 1 << kLenNumHighBits;
798
291k
          }
799
467k
        }
800
1.52M
        TREE_DECODE_CHECK(probLen, limit, len);
801
1.52M
        len += offset;
802
1.52M
      }
803
804
761k
      if (state < 4)
805
79.1k
      {
806
79.1k
        unsigned posSlot;
807
79.1k
        prob = probs + PosSlot +
808
79.1k
            ((len < kNumLenToPosStates - 1 ? len : kNumLenToPosStates - 1) <<
809
79.1k
            kNumPosSlotBits);
810
79.1k
        TREE_DECODE_CHECK(prob, 1 << kNumPosSlotBits, posSlot);
811
77.4k
        if (posSlot >= kStartPosModelIndex)
812
51.3k
        {
813
51.3k
          unsigned numDirectBits = ((posSlot >> 1) - 1);
814
815
          /* if (bufLimit - buf >= 8) return DUMMY_MATCH; */
816
817
51.3k
          if (posSlot < kEndPosModelIndex)
818
27.7k
          {
819
27.7k
            prob = probs + SpecPos + ((2 | (posSlot & 1)) << numDirectBits);
820
27.7k
          }
821
23.5k
          else
822
23.5k
          {
823
23.5k
            numDirectBits -= kNumAlignBits;
824
23.5k
            do
825
222k
            {
826
222k
              NORMALIZE_CHECK
827
221k
              range >>= 1;
828
221k
              code -= range & (((code - range) >> 31) - 1);
829
              /* if (code >= range) code -= range; */
830
221k
            }
831
221k
            while (--numDirectBits);
832
22.7k
            prob = probs + Align;
833
22.7k
            numDirectBits = kNumAlignBits;
834
22.7k
          }
835
50.5k
          {
836
50.5k
            unsigned i = 1;
837
50.5k
            unsigned m = 1;
838
50.5k
            do
839
160k
            {
840
160k
              REV_BIT_CHECK(prob, i, m);
841
160k
            }
842
160k
            while (--numDirectBits);
843
50.5k
          }
844
50.5k
        }
845
77.4k
      }
846
1.52M
    }
847
18.0M
  }
848
17.9M
  NORMALIZE_CHECK;
849
17.9M
  return res;
850
17.9M
}
851
852
853
void LzmaDec_InitDicAndState(CLzmaDec *p, BoolInt initDic, BoolInt initState)
854
374k
{
855
374k
  p->remainLen = kMatchSpecLenStart + 1;
856
374k
  p->tempBufSize = 0;
857
858
374k
  if (initDic)
859
284k
  {
860
284k
    p->processedPos = 0;
861
284k
    p->checkDicSize = 0;
862
284k
    p->remainLen = kMatchSpecLenStart + 2;
863
284k
  }
864
374k
  if (initState)
865
275k
    p->remainLen = kMatchSpecLenStart + 2;
866
374k
}
867
868
void LzmaDec_Init(CLzmaDec *p)
869
77.0k
{
870
77.0k
  p->dicPos = 0;
871
77.0k
  LzmaDec_InitDicAndState(p, True, True);
872
77.0k
}
873
874
875
SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen,
876
    ELzmaFinishMode finishMode, ELzmaStatus *status)
877
673k
{
878
673k
  SizeT inSize = *srcLen;
879
673k
  (*srcLen) = 0;
880
  
881
673k
  *status = LZMA_STATUS_NOT_SPECIFIED;
882
883
673k
  if (p->remainLen > kMatchSpecLenStart)
884
219k
  {
885
1.31M
    for (; inSize > 0 && p->tempBufSize < RC_INIT_SIZE; (*srcLen)++, inSize--)
886
1.09M
      p->tempBuf[p->tempBufSize++] = *src++;
887
219k
    if (p->tempBufSize != 0 && p->tempBuf[0] != 0)
888
72
      return SZ_ERROR_DATA;
889
219k
    if (p->tempBufSize < RC_INIT_SIZE)
890
474
    {
891
474
      *status = LZMA_STATUS_NEEDS_MORE_INPUT;
892
474
      return SZ_OK;
893
474
    }
894
218k
    p->code =
895
218k
        ((UInt32)p->tempBuf[1] << 24)
896
218k
      | ((UInt32)p->tempBuf[2] << 16)
897
218k
      | ((UInt32)p->tempBuf[3] << 8)
898
218k
      | ((UInt32)p->tempBuf[4]);
899
218k
    p->range = 0xFFFFFFFF;
900
218k
    p->tempBufSize = 0;
901
902
218k
    if (p->remainLen > kMatchSpecLenStart + 1)
903
214k
    {
904
214k
      SizeT numProbs = LzmaProps_GetNumProbs(&p->prop);
905
214k
      SizeT i;
906
214k
      CLzmaProb *probs = p->probs;
907
10.4G
      for (i = 0; i < numProbs; i++)
908
10.4G
        probs[i] = kBitModelTotal >> 1;
909
214k
      p->reps[0] = p->reps[1] = p->reps[2] = p->reps[3] = 1;
910
214k
      p->state = 0;
911
214k
    }
912
913
218k
    p->remainLen = 0;
914
218k
  }
915
916
673k
  LzmaDec_WriteRem(p, dicLimit);
917
918
19.7M
  while (p->remainLen != kMatchSpecLenStart)
919
19.7M
  {
920
19.7M
      int checkEndMarkNow = 0;
921
922
19.7M
      if (p->dicPos >= dicLimit)
923
636k
      {
924
636k
        if (p->remainLen == 0 && p->code == 0)
925
409k
        {
926
409k
          *status = LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK;
927
409k
          return SZ_OK;
928
409k
        }
929
226k
        if (finishMode == LZMA_FINISH_ANY)
930
220k
        {
931
220k
          *status = LZMA_STATUS_NOT_FINISHED;
932
220k
          return SZ_OK;
933
220k
        }
934
5.84k
        if (p->remainLen != 0)
935
236
        {
936
236
          *status = LZMA_STATUS_NOT_FINISHED;
937
236
          return SZ_ERROR_DATA;
938
236
        }
939
5.60k
        checkEndMarkNow = 1;
940
5.60k
      }
941
942
19.1M
      if (p->tempBufSize == 0)
943
19.1M
      {
944
19.1M
        SizeT processed;
945
19.1M
        const Byte *bufLimit;
946
19.1M
        if (inSize < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow)
947
18.0M
        {
948
18.0M
          int dummyRes = LzmaDec_TryDummy(p, src, inSize);
949
18.0M
          if (dummyRes == DUMMY_ERROR)
950
32.5k
          {
951
32.5k
            memcpy(p->tempBuf, src, inSize);
952
32.5k
            p->tempBufSize = (unsigned)inSize;
953
32.5k
            (*srcLen) += inSize;
954
32.5k
            *status = LZMA_STATUS_NEEDS_MORE_INPUT;
955
32.5k
            return SZ_OK;
956
32.5k
          }
957
18.0M
          if (checkEndMarkNow && dummyRes != DUMMY_MATCH)
958
22
          {
959
22
            *status = LZMA_STATUS_NOT_FINISHED;
960
22
            return SZ_ERROR_DATA;
961
22
          }
962
18.0M
          bufLimit = src;
963
18.0M
        }
964
1.07M
        else
965
1.07M
          bufLimit = src + inSize - LZMA_REQUIRED_INPUT_MAX;
966
19.0M
        p->buf = src;
967
19.0M
        if (LzmaDec_DecodeReal2(p, dicLimit, bufLimit) != 0)
968
3.31k
          return SZ_ERROR_DATA;
969
19.0M
        processed = (SizeT)(p->buf - src);
970
19.0M
        (*srcLen) += processed;
971
19.0M
        src += processed;
972
19.0M
        inSize -= processed;
973
19.0M
      }
974
1.71k
      else
975
1.71k
      {
976
1.71k
        unsigned rem = p->tempBufSize, lookAhead = 0;
977
3.45k
        while (rem < LZMA_REQUIRED_INPUT_MAX && lookAhead < inSize)
978
1.74k
          p->tempBuf[rem++] = src[lookAhead++];
979
1.71k
        p->tempBufSize = rem;
980
1.71k
        if (rem < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow)
981
1.63k
        {
982
1.63k
          int dummyRes = LzmaDec_TryDummy(p, p->tempBuf, (SizeT)rem);
983
1.63k
          if (dummyRes == DUMMY_ERROR)
984
1.59k
          {
985
1.59k
            (*srcLen) += (SizeT)lookAhead;
986
1.59k
            *status = LZMA_STATUS_NEEDS_MORE_INPUT;
987
1.59k
            return SZ_OK;
988
1.59k
          }
989
41
          if (checkEndMarkNow && dummyRes != DUMMY_MATCH)
990
0
          {
991
0
            *status = LZMA_STATUS_NOT_FINISHED;
992
0
            return SZ_ERROR_DATA;
993
0
          }
994
41
        }
995
124
        p->buf = p->tempBuf;
996
124
        if (LzmaDec_DecodeReal2(p, dicLimit, p->buf) != 0)
997
6
          return SZ_ERROR_DATA;
998
        
999
118
        {
1000
118
          unsigned kkk = (unsigned)(p->buf - p->tempBuf);
1001
118
          if (rem < kkk)
1002
0
            return SZ_ERROR_FAIL; /* some internal error */
1003
118
          rem -= kkk;
1004
118
          if (lookAhead < rem)
1005
0
            return SZ_ERROR_FAIL; /* some internal error */
1006
118
          lookAhead -= rem;
1007
118
        }
1008
0
        (*srcLen) += (SizeT)lookAhead;
1009
118
        src += lookAhead;
1010
118
        inSize -= (SizeT)lookAhead;
1011
118
        p->tempBufSize = 0;
1012
118
      }
1013
19.1M
  }
1014
  
1015
5.08k
  if (p->code != 0)
1016
80
    return SZ_ERROR_DATA;
1017
5.00k
  *status = LZMA_STATUS_FINISHED_WITH_MARK;
1018
5.00k
  return SZ_OK;
1019
5.08k
}
1020
1021
1022
SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status)
1023
152k
{
1024
152k
  SizeT outSize = *destLen;
1025
152k
  SizeT inSize = *srcLen;
1026
152k
  *srcLen = *destLen = 0;
1027
152k
  for (;;)
1028
203k
  {
1029
203k
    SizeT inSizeCur = inSize, outSizeCur, dicPos;
1030
203k
    ELzmaFinishMode curFinishMode;
1031
203k
    SRes res;
1032
203k
    if (p->dicPos == p->dicBufSize)
1033
97.5k
      p->dicPos = 0;
1034
203k
    dicPos = p->dicPos;
1035
203k
    if (outSize > p->dicBufSize - dicPos)
1036
49.4k
    {
1037
49.4k
      outSizeCur = p->dicBufSize;
1038
49.4k
      curFinishMode = LZMA_FINISH_ANY;
1039
49.4k
    }
1040
154k
    else
1041
154k
    {
1042
154k
      outSizeCur = dicPos + outSize;
1043
154k
      curFinishMode = finishMode;
1044
154k
    }
1045
1046
203k
    res = LzmaDec_DecodeToDic(p, outSizeCur, src, &inSizeCur, curFinishMode, status);
1047
203k
    src += inSizeCur;
1048
203k
    inSize -= inSizeCur;
1049
203k
    *srcLen += inSizeCur;
1050
203k
    outSizeCur = p->dicPos - dicPos;
1051
203k
    memcpy(dest, p->dic + dicPos, outSizeCur);
1052
203k
    dest += outSizeCur;
1053
203k
    outSize -= outSizeCur;
1054
203k
    *destLen += outSizeCur;
1055
203k
    if (res != 0)
1056
907
      return res;
1057
202k
    if (outSizeCur == 0 || outSize == 0)
1058
151k
      return SZ_OK;
1059
202k
  }
1060
152k
}
1061
1062
void LzmaDec_FreeProbs(CLzmaDec *p, ISzAllocPtr alloc)
1063
94.2k
{
1064
94.2k
  ISzAlloc_Free(alloc, p->probs);
1065
94.2k
  p->probs = NULL;
1066
94.2k
}
1067
1068
static void LzmaDec_FreeDict(CLzmaDec *p, ISzAllocPtr alloc)
1069
54.9k
{
1070
54.9k
  ISzAlloc_Free(alloc, p->dic);
1071
54.9k
  p->dic = NULL;
1072
54.9k
}
1073
1074
void LzmaDec_Free(CLzmaDec *p, ISzAllocPtr alloc)
1075
27.1k
{
1076
27.1k
  LzmaDec_FreeProbs(p, alloc);
1077
27.1k
  LzmaDec_FreeDict(p, alloc);
1078
27.1k
}
1079
1080
SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size)
1081
81.8k
{
1082
81.8k
  UInt32 dicSize;
1083
81.8k
  Byte d;
1084
  
1085
81.8k
  if (size < LZMA_PROPS_SIZE)
1086
0
    return SZ_ERROR_UNSUPPORTED;
1087
81.8k
  else
1088
81.8k
    dicSize = data[1] | ((UInt32)data[2] << 8) | ((UInt32)data[3] << 16) | ((UInt32)data[4] << 24);
1089
 
1090
81.8k
  if (dicSize < LZMA_DIC_MIN)
1091
1.77k
    dicSize = LZMA_DIC_MIN;
1092
81.8k
  p->dicSize = dicSize;
1093
1094
81.8k
  d = data[0];
1095
81.8k
  if (d >= (9 * 5 * 5))
1096
5
    return SZ_ERROR_UNSUPPORTED;
1097
1098
81.8k
  p->lc = (Byte)(d % 9);
1099
81.8k
  d /= 9;
1100
81.8k
  p->pb = (Byte)(d / 5);
1101
81.8k
  p->lp = (Byte)(d % 5);
1102
1103
81.8k
  return SZ_OK;
1104
81.8k
}
1105
1106
static SRes LzmaDec_AllocateProbs2(CLzmaDec *p, const CLzmaProps *propNew, ISzAllocPtr alloc)
1107
77.0k
{
1108
77.0k
  UInt32 numProbs = LzmaProps_GetNumProbs(propNew);
1109
77.0k
  if (!p->probs || numProbs != p->numProbs)
1110
47.1k
  {
1111
47.1k
    LzmaDec_FreeProbs(p, alloc);
1112
47.1k
    p->probs = (CLzmaProb *)ISzAlloc_Alloc(alloc, numProbs * sizeof(CLzmaProb));
1113
47.1k
    if (!p->probs)
1114
0
      return SZ_ERROR_MEM;
1115
47.1k
    p->probs_1664 = p->probs + 1664;
1116
47.1k
    p->numProbs = numProbs;
1117
47.1k
  }
1118
77.0k
  return SZ_OK;
1119
77.0k
}
1120
1121
SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAllocPtr alloc)
1122
19.9k
{
1123
19.9k
  CLzmaProps propNew;
1124
19.9k
  RINOK(LzmaProps_Decode(&propNew, props, propsSize));
1125
19.9k
  RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc));
1126
19.9k
  p->prop = propNew;
1127
19.9k
  return SZ_OK;
1128
19.9k
}
1129
1130
SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAllocPtr alloc)
1131
57.1k
{
1132
57.1k
  CLzmaProps propNew;
1133
57.1k
  SizeT dicBufSize;
1134
57.1k
  RINOK(LzmaProps_Decode(&propNew, props, propsSize));
1135
57.1k
  RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc));
1136
1137
57.1k
  {
1138
57.1k
    UInt32 dictSize = propNew.dicSize;
1139
57.1k
    SizeT mask = ((UInt32)1 << 12) - 1;
1140
57.1k
         if (dictSize >= ((UInt32)1 << 30)) mask = ((UInt32)1 << 22) - 1;
1141
56.8k
    else if (dictSize >= ((UInt32)1 << 22)) mask = ((UInt32)1 << 20) - 1;;
1142
57.1k
    dicBufSize = ((SizeT)dictSize + mask) & ~mask;
1143
57.1k
    if (dicBufSize < dictSize)
1144
0
      dicBufSize = dictSize;
1145
57.1k
  }
1146
1147
57.1k
  if (!p->dic || dicBufSize != p->dicBufSize)
1148
27.7k
  {
1149
27.7k
    LzmaDec_FreeDict(p, alloc);
1150
27.7k
    p->dic = (Byte *)ISzAlloc_Alloc(alloc, dicBufSize);
1151
27.7k
    if (!p->dic)
1152
3
    {
1153
3
      LzmaDec_FreeProbs(p, alloc);
1154
3
      return SZ_ERROR_MEM;
1155
3
    }
1156
27.7k
  }
1157
57.1k
  p->dicBufSize = dicBufSize;
1158
57.1k
  p->prop = propNew;
1159
57.1k
  return SZ_OK;
1160
57.1k
}
1161
1162
SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,
1163
    const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode,
1164
    ELzmaStatus *status, ISzAllocPtr alloc)
1165
7.27k
{
1166
7.27k
  CLzmaDec p;
1167
7.27k
  SRes res;
1168
7.27k
  SizeT outSize = *destLen, inSize = *srcLen;
1169
7.27k
  *destLen = *srcLen = 0;
1170
7.27k
  *status = LZMA_STATUS_NOT_SPECIFIED;
1171
7.27k
  if (inSize < RC_INIT_SIZE)
1172
0
    return SZ_ERROR_INPUT_EOF;
1173
7.27k
  LzmaDec_Construct(&p);
1174
7.27k
  RINOK(LzmaDec_AllocateProbs(&p, propData, propSize, alloc));
1175
7.27k
  p.dic = dest;
1176
7.27k
  p.dicBufSize = outSize;
1177
7.27k
  LzmaDec_Init(&p);
1178
7.27k
  *srcLen = inSize;
1179
7.27k
  res = LzmaDec_DecodeToDic(&p, outSize, src, srcLen, finishMode, status);
1180
7.27k
  *destLen = p.dicPos;
1181
7.27k
  if (res == SZ_OK && *status == LZMA_STATUS_NEEDS_MORE_INPUT)
1182
0
    res = SZ_ERROR_INPUT_EOF;
1183
7.27k
  LzmaDec_FreeProbs(&p, alloc);
1184
7.27k
  return res;
1185
7.27k
}