xref: /aosp_15_r20/external/lzma/C/Ppmd7aDec.c (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker /* Ppmd7aDec.c -- PPMd7a (PPMdH) Decoder
2*f6dc9357SAndroid Build Coastguard Worker 2023-09-07 : Igor Pavlov : Public domain
3*f6dc9357SAndroid Build Coastguard Worker This code is based on:
4*f6dc9357SAndroid Build Coastguard Worker   PPMd var.H (2001): Dmitry Shkarin : Public domain
5*f6dc9357SAndroid Build Coastguard Worker   Carryless rangecoder (1999): Dmitry Subbotin : Public domain */
6*f6dc9357SAndroid Build Coastguard Worker 
7*f6dc9357SAndroid Build Coastguard Worker #include "Precomp.h"
8*f6dc9357SAndroid Build Coastguard Worker 
9*f6dc9357SAndroid Build Coastguard Worker #include "Ppmd7.h"
10*f6dc9357SAndroid Build Coastguard Worker 
11*f6dc9357SAndroid Build Coastguard Worker #define kTop ((UInt32)1 << 24)
12*f6dc9357SAndroid Build Coastguard Worker #define kBot ((UInt32)1 << 15)
13*f6dc9357SAndroid Build Coastguard Worker 
14*f6dc9357SAndroid Build Coastguard Worker #define READ_BYTE(p) IByteIn_Read((p)->Stream)
15*f6dc9357SAndroid Build Coastguard Worker 
Ppmd7a_RangeDec_Init(CPpmd7_RangeDec * p)16*f6dc9357SAndroid Build Coastguard Worker BoolInt Ppmd7a_RangeDec_Init(CPpmd7_RangeDec *p)
17*f6dc9357SAndroid Build Coastguard Worker {
18*f6dc9357SAndroid Build Coastguard Worker   unsigned i;
19*f6dc9357SAndroid Build Coastguard Worker   p->Code = 0;
20*f6dc9357SAndroid Build Coastguard Worker   p->Range = 0xFFFFFFFF;
21*f6dc9357SAndroid Build Coastguard Worker   p->Low = 0;
22*f6dc9357SAndroid Build Coastguard Worker 
23*f6dc9357SAndroid Build Coastguard Worker   for (i = 0; i < 4; i++)
24*f6dc9357SAndroid Build Coastguard Worker     p->Code = (p->Code << 8) | READ_BYTE(p);
25*f6dc9357SAndroid Build Coastguard Worker   return (p->Code < 0xFFFFFFFF);
26*f6dc9357SAndroid Build Coastguard Worker }
27*f6dc9357SAndroid Build Coastguard Worker 
28*f6dc9357SAndroid Build Coastguard Worker #define RC_NORM(p) \
29*f6dc9357SAndroid Build Coastguard Worker   while ((p->Low ^ (p->Low + p->Range)) < kTop \
30*f6dc9357SAndroid Build Coastguard Worker     || (p->Range < kBot && ((p->Range = (0 - p->Low) & (kBot - 1)), 1))) { \
31*f6dc9357SAndroid Build Coastguard Worker       p->Code = (p->Code << 8) | READ_BYTE(p); \
32*f6dc9357SAndroid Build Coastguard Worker       p->Range <<= 8; p->Low <<= 8; }
33*f6dc9357SAndroid Build Coastguard Worker 
34*f6dc9357SAndroid Build Coastguard Worker // we must use only one type of Normalization from two: LOCAL or REMOTE
35*f6dc9357SAndroid Build Coastguard Worker #define RC_NORM_LOCAL(p)    // RC_NORM(p)
36*f6dc9357SAndroid Build Coastguard Worker #define RC_NORM_REMOTE(p)   RC_NORM(p)
37*f6dc9357SAndroid Build Coastguard Worker 
38*f6dc9357SAndroid Build Coastguard Worker #define R (&p->rc.dec)
39*f6dc9357SAndroid Build Coastguard Worker 
40*f6dc9357SAndroid Build Coastguard Worker Z7_FORCE_INLINE
41*f6dc9357SAndroid Build Coastguard Worker // Z7_NO_INLINE
Ppmd7a_RD_Decode(CPpmd7 * p,UInt32 start,UInt32 size)42*f6dc9357SAndroid Build Coastguard Worker static void Ppmd7a_RD_Decode(CPpmd7 *p, UInt32 start, UInt32 size)
43*f6dc9357SAndroid Build Coastguard Worker {
44*f6dc9357SAndroid Build Coastguard Worker   start *= R->Range;
45*f6dc9357SAndroid Build Coastguard Worker   R->Low += start;
46*f6dc9357SAndroid Build Coastguard Worker   R->Code -= start;
47*f6dc9357SAndroid Build Coastguard Worker   R->Range *= size;
48*f6dc9357SAndroid Build Coastguard Worker   RC_NORM_LOCAL(R)
49*f6dc9357SAndroid Build Coastguard Worker }
50*f6dc9357SAndroid Build Coastguard Worker 
51*f6dc9357SAndroid Build Coastguard Worker #define RC_Decode(start, size)  Ppmd7a_RD_Decode(p, start, size);
52*f6dc9357SAndroid Build Coastguard Worker #define RC_DecodeFinal(start, size)  RC_Decode(start, size)  RC_NORM_REMOTE(R)
53*f6dc9357SAndroid Build Coastguard Worker #define RC_GetThreshold(total)  (R->Code / (R->Range /= (total)))
54*f6dc9357SAndroid Build Coastguard Worker 
55*f6dc9357SAndroid Build Coastguard Worker 
56*f6dc9357SAndroid Build Coastguard Worker #define CTX(ref) ((CPpmd7_Context *)Ppmd7_GetContext(p, ref))
57*f6dc9357SAndroid Build Coastguard Worker typedef CPpmd7_Context * CTX_PTR;
58*f6dc9357SAndroid Build Coastguard Worker #define SUCCESSOR(p) Ppmd_GET_SUCCESSOR(p)
59*f6dc9357SAndroid Build Coastguard Worker void Ppmd7_UpdateModel(CPpmd7 *p);
60*f6dc9357SAndroid Build Coastguard Worker 
61*f6dc9357SAndroid Build Coastguard Worker #define MASK(sym)  ((Byte *)charMask)[sym]
62*f6dc9357SAndroid Build Coastguard Worker 
63*f6dc9357SAndroid Build Coastguard Worker 
Ppmd7a_DecodeSymbol(CPpmd7 * p)64*f6dc9357SAndroid Build Coastguard Worker int Ppmd7a_DecodeSymbol(CPpmd7 *p)
65*f6dc9357SAndroid Build Coastguard Worker {
66*f6dc9357SAndroid Build Coastguard Worker   size_t charMask[256 / sizeof(size_t)];
67*f6dc9357SAndroid Build Coastguard Worker 
68*f6dc9357SAndroid Build Coastguard Worker   if (p->MinContext->NumStats != 1)
69*f6dc9357SAndroid Build Coastguard Worker   {
70*f6dc9357SAndroid Build Coastguard Worker     CPpmd_State *s = Ppmd7_GetStats(p, p->MinContext);
71*f6dc9357SAndroid Build Coastguard Worker     unsigned i;
72*f6dc9357SAndroid Build Coastguard Worker     UInt32 count, hiCnt;
73*f6dc9357SAndroid Build Coastguard Worker     const UInt32 summFreq = p->MinContext->Union2.SummFreq;
74*f6dc9357SAndroid Build Coastguard Worker 
75*f6dc9357SAndroid Build Coastguard Worker     if (summFreq > R->Range)
76*f6dc9357SAndroid Build Coastguard Worker       return PPMD7_SYM_ERROR;
77*f6dc9357SAndroid Build Coastguard Worker 
78*f6dc9357SAndroid Build Coastguard Worker     count = RC_GetThreshold(summFreq);
79*f6dc9357SAndroid Build Coastguard Worker     hiCnt = count;
80*f6dc9357SAndroid Build Coastguard Worker 
81*f6dc9357SAndroid Build Coastguard Worker     if ((Int32)(count -= s->Freq) < 0)
82*f6dc9357SAndroid Build Coastguard Worker     {
83*f6dc9357SAndroid Build Coastguard Worker       Byte sym;
84*f6dc9357SAndroid Build Coastguard Worker       RC_DecodeFinal(0, s->Freq)
85*f6dc9357SAndroid Build Coastguard Worker       p->FoundState = s;
86*f6dc9357SAndroid Build Coastguard Worker       sym = s->Symbol;
87*f6dc9357SAndroid Build Coastguard Worker       Ppmd7_Update1_0(p);
88*f6dc9357SAndroid Build Coastguard Worker       return sym;
89*f6dc9357SAndroid Build Coastguard Worker     }
90*f6dc9357SAndroid Build Coastguard Worker 
91*f6dc9357SAndroid Build Coastguard Worker     p->PrevSuccess = 0;
92*f6dc9357SAndroid Build Coastguard Worker     i = (unsigned)p->MinContext->NumStats - 1;
93*f6dc9357SAndroid Build Coastguard Worker 
94*f6dc9357SAndroid Build Coastguard Worker     do
95*f6dc9357SAndroid Build Coastguard Worker     {
96*f6dc9357SAndroid Build Coastguard Worker       if ((Int32)(count -= (++s)->Freq) < 0)
97*f6dc9357SAndroid Build Coastguard Worker       {
98*f6dc9357SAndroid Build Coastguard Worker         Byte sym;
99*f6dc9357SAndroid Build Coastguard Worker         RC_DecodeFinal((hiCnt - count) - s->Freq, s->Freq)
100*f6dc9357SAndroid Build Coastguard Worker         p->FoundState = s;
101*f6dc9357SAndroid Build Coastguard Worker         sym = s->Symbol;
102*f6dc9357SAndroid Build Coastguard Worker         Ppmd7_Update1(p);
103*f6dc9357SAndroid Build Coastguard Worker         return sym;
104*f6dc9357SAndroid Build Coastguard Worker       }
105*f6dc9357SAndroid Build Coastguard Worker     }
106*f6dc9357SAndroid Build Coastguard Worker     while (--i);
107*f6dc9357SAndroid Build Coastguard Worker 
108*f6dc9357SAndroid Build Coastguard Worker     if (hiCnt >= summFreq)
109*f6dc9357SAndroid Build Coastguard Worker       return PPMD7_SYM_ERROR;
110*f6dc9357SAndroid Build Coastguard Worker 
111*f6dc9357SAndroid Build Coastguard Worker     hiCnt -= count;
112*f6dc9357SAndroid Build Coastguard Worker     RC_Decode(hiCnt, summFreq - hiCnt)
113*f6dc9357SAndroid Build Coastguard Worker 
114*f6dc9357SAndroid Build Coastguard Worker     p->HiBitsFlag = PPMD7_HiBitsFlag_3(p->FoundState->Symbol);
115*f6dc9357SAndroid Build Coastguard Worker     PPMD_SetAllBitsIn256Bytes(charMask)
116*f6dc9357SAndroid Build Coastguard Worker     // i = p->MinContext->NumStats - 1;
117*f6dc9357SAndroid Build Coastguard Worker     // do { MASK((--s)->Symbol) = 0; } while (--i);
118*f6dc9357SAndroid Build Coastguard Worker     {
119*f6dc9357SAndroid Build Coastguard Worker       CPpmd_State *s2 = Ppmd7_GetStats(p, p->MinContext);
120*f6dc9357SAndroid Build Coastguard Worker       MASK(s->Symbol) = 0;
121*f6dc9357SAndroid Build Coastguard Worker       do
122*f6dc9357SAndroid Build Coastguard Worker       {
123*f6dc9357SAndroid Build Coastguard Worker         const unsigned sym0 = s2[0].Symbol;
124*f6dc9357SAndroid Build Coastguard Worker         const unsigned sym1 = s2[1].Symbol;
125*f6dc9357SAndroid Build Coastguard Worker         s2 += 2;
126*f6dc9357SAndroid Build Coastguard Worker         MASK(sym0) = 0;
127*f6dc9357SAndroid Build Coastguard Worker         MASK(sym1) = 0;
128*f6dc9357SAndroid Build Coastguard Worker       }
129*f6dc9357SAndroid Build Coastguard Worker       while (s2 < s);
130*f6dc9357SAndroid Build Coastguard Worker     }
131*f6dc9357SAndroid Build Coastguard Worker   }
132*f6dc9357SAndroid Build Coastguard Worker   else
133*f6dc9357SAndroid Build Coastguard Worker   {
134*f6dc9357SAndroid Build Coastguard Worker     CPpmd_State *s = Ppmd7Context_OneState(p->MinContext);
135*f6dc9357SAndroid Build Coastguard Worker     UInt16 *prob = Ppmd7_GetBinSumm(p);
136*f6dc9357SAndroid Build Coastguard Worker     UInt32 pr = *prob;
137*f6dc9357SAndroid Build Coastguard Worker     UInt32 size0 = (R->Range >> 14) * pr;
138*f6dc9357SAndroid Build Coastguard Worker     pr = PPMD_UPDATE_PROB_1(pr);
139*f6dc9357SAndroid Build Coastguard Worker 
140*f6dc9357SAndroid Build Coastguard Worker     if (R->Code < size0)
141*f6dc9357SAndroid Build Coastguard Worker     {
142*f6dc9357SAndroid Build Coastguard Worker       Byte sym;
143*f6dc9357SAndroid Build Coastguard Worker       *prob = (UInt16)(pr + (1 << PPMD_INT_BITS));
144*f6dc9357SAndroid Build Coastguard Worker 
145*f6dc9357SAndroid Build Coastguard Worker       // RangeDec_DecodeBit0(size0);
146*f6dc9357SAndroid Build Coastguard Worker       R->Range = size0;
147*f6dc9357SAndroid Build Coastguard Worker       RC_NORM(R)
148*f6dc9357SAndroid Build Coastguard Worker 
149*f6dc9357SAndroid Build Coastguard Worker 
150*f6dc9357SAndroid Build Coastguard Worker 
151*f6dc9357SAndroid Build Coastguard Worker       // sym = (p->FoundState = Ppmd7Context_OneState(p->MinContext))->Symbol;
152*f6dc9357SAndroid Build Coastguard Worker       // Ppmd7_UpdateBin(p);
153*f6dc9357SAndroid Build Coastguard Worker       {
154*f6dc9357SAndroid Build Coastguard Worker         unsigned freq = s->Freq;
155*f6dc9357SAndroid Build Coastguard Worker         CTX_PTR c = CTX(SUCCESSOR(s));
156*f6dc9357SAndroid Build Coastguard Worker         sym = s->Symbol;
157*f6dc9357SAndroid Build Coastguard Worker         p->FoundState = s;
158*f6dc9357SAndroid Build Coastguard Worker         p->PrevSuccess = 1;
159*f6dc9357SAndroid Build Coastguard Worker         p->RunLength++;
160*f6dc9357SAndroid Build Coastguard Worker         s->Freq = (Byte)(freq + (freq < 128));
161*f6dc9357SAndroid Build Coastguard Worker         // NextContext(p);
162*f6dc9357SAndroid Build Coastguard Worker         if (p->OrderFall == 0 && (const Byte *)c > p->Text)
163*f6dc9357SAndroid Build Coastguard Worker           p->MaxContext = p->MinContext = c;
164*f6dc9357SAndroid Build Coastguard Worker         else
165*f6dc9357SAndroid Build Coastguard Worker           Ppmd7_UpdateModel(p);
166*f6dc9357SAndroid Build Coastguard Worker       }
167*f6dc9357SAndroid Build Coastguard Worker       return sym;
168*f6dc9357SAndroid Build Coastguard Worker     }
169*f6dc9357SAndroid Build Coastguard Worker 
170*f6dc9357SAndroid Build Coastguard Worker     *prob = (UInt16)pr;
171*f6dc9357SAndroid Build Coastguard Worker     p->InitEsc = p->ExpEscape[pr >> 10];
172*f6dc9357SAndroid Build Coastguard Worker 
173*f6dc9357SAndroid Build Coastguard Worker     // RangeDec_DecodeBit1(size0);
174*f6dc9357SAndroid Build Coastguard Worker     R->Low += size0;
175*f6dc9357SAndroid Build Coastguard Worker     R->Code -= size0;
176*f6dc9357SAndroid Build Coastguard Worker     R->Range = (R->Range & ~((UInt32)PPMD_BIN_SCALE - 1)) - size0;
177*f6dc9357SAndroid Build Coastguard Worker     RC_NORM_LOCAL(R)
178*f6dc9357SAndroid Build Coastguard Worker 
179*f6dc9357SAndroid Build Coastguard Worker     PPMD_SetAllBitsIn256Bytes(charMask)
180*f6dc9357SAndroid Build Coastguard Worker     MASK(Ppmd7Context_OneState(p->MinContext)->Symbol) = 0;
181*f6dc9357SAndroid Build Coastguard Worker     p->PrevSuccess = 0;
182*f6dc9357SAndroid Build Coastguard Worker   }
183*f6dc9357SAndroid Build Coastguard Worker 
184*f6dc9357SAndroid Build Coastguard Worker   for (;;)
185*f6dc9357SAndroid Build Coastguard Worker   {
186*f6dc9357SAndroid Build Coastguard Worker     CPpmd_State *s, *s2;
187*f6dc9357SAndroid Build Coastguard Worker     UInt32 freqSum, count, hiCnt;
188*f6dc9357SAndroid Build Coastguard Worker 
189*f6dc9357SAndroid Build Coastguard Worker     CPpmd_See *see;
190*f6dc9357SAndroid Build Coastguard Worker     CPpmd7_Context *mc;
191*f6dc9357SAndroid Build Coastguard Worker     unsigned numMasked;
192*f6dc9357SAndroid Build Coastguard Worker     RC_NORM_REMOTE(R)
193*f6dc9357SAndroid Build Coastguard Worker     mc = p->MinContext;
194*f6dc9357SAndroid Build Coastguard Worker     numMasked = mc->NumStats;
195*f6dc9357SAndroid Build Coastguard Worker 
196*f6dc9357SAndroid Build Coastguard Worker     do
197*f6dc9357SAndroid Build Coastguard Worker     {
198*f6dc9357SAndroid Build Coastguard Worker       p->OrderFall++;
199*f6dc9357SAndroid Build Coastguard Worker       if (!mc->Suffix)
200*f6dc9357SAndroid Build Coastguard Worker         return PPMD7_SYM_END;
201*f6dc9357SAndroid Build Coastguard Worker       mc = Ppmd7_GetContext(p, mc->Suffix);
202*f6dc9357SAndroid Build Coastguard Worker     }
203*f6dc9357SAndroid Build Coastguard Worker     while (mc->NumStats == numMasked);
204*f6dc9357SAndroid Build Coastguard Worker 
205*f6dc9357SAndroid Build Coastguard Worker     s = Ppmd7_GetStats(p, mc);
206*f6dc9357SAndroid Build Coastguard Worker 
207*f6dc9357SAndroid Build Coastguard Worker     {
208*f6dc9357SAndroid Build Coastguard Worker       unsigned num = mc->NumStats;
209*f6dc9357SAndroid Build Coastguard Worker       unsigned num2 = num / 2;
210*f6dc9357SAndroid Build Coastguard Worker 
211*f6dc9357SAndroid Build Coastguard Worker       num &= 1;
212*f6dc9357SAndroid Build Coastguard Worker       hiCnt = (s->Freq & (UInt32)(MASK(s->Symbol))) & (0 - (UInt32)num);
213*f6dc9357SAndroid Build Coastguard Worker       s += num;
214*f6dc9357SAndroid Build Coastguard Worker       p->MinContext = mc;
215*f6dc9357SAndroid Build Coastguard Worker 
216*f6dc9357SAndroid Build Coastguard Worker       do
217*f6dc9357SAndroid Build Coastguard Worker       {
218*f6dc9357SAndroid Build Coastguard Worker         const unsigned sym0 = s[0].Symbol;
219*f6dc9357SAndroid Build Coastguard Worker         const unsigned sym1 = s[1].Symbol;
220*f6dc9357SAndroid Build Coastguard Worker         s += 2;
221*f6dc9357SAndroid Build Coastguard Worker         hiCnt += (s[-2].Freq & (UInt32)(MASK(sym0)));
222*f6dc9357SAndroid Build Coastguard Worker         hiCnt += (s[-1].Freq & (UInt32)(MASK(sym1)));
223*f6dc9357SAndroid Build Coastguard Worker       }
224*f6dc9357SAndroid Build Coastguard Worker       while (--num2);
225*f6dc9357SAndroid Build Coastguard Worker     }
226*f6dc9357SAndroid Build Coastguard Worker 
227*f6dc9357SAndroid Build Coastguard Worker     see = Ppmd7_MakeEscFreq(p, numMasked, &freqSum);
228*f6dc9357SAndroid Build Coastguard Worker     freqSum += hiCnt;
229*f6dc9357SAndroid Build Coastguard Worker 
230*f6dc9357SAndroid Build Coastguard Worker     if (freqSum > R->Range)
231*f6dc9357SAndroid Build Coastguard Worker       return PPMD7_SYM_ERROR;
232*f6dc9357SAndroid Build Coastguard Worker 
233*f6dc9357SAndroid Build Coastguard Worker     count = RC_GetThreshold(freqSum);
234*f6dc9357SAndroid Build Coastguard Worker 
235*f6dc9357SAndroid Build Coastguard Worker     if (count < hiCnt)
236*f6dc9357SAndroid Build Coastguard Worker     {
237*f6dc9357SAndroid Build Coastguard Worker       Byte sym;
238*f6dc9357SAndroid Build Coastguard Worker 
239*f6dc9357SAndroid Build Coastguard Worker       s = Ppmd7_GetStats(p, p->MinContext);
240*f6dc9357SAndroid Build Coastguard Worker       hiCnt = count;
241*f6dc9357SAndroid Build Coastguard Worker       // count -= s->Freq & (UInt32)(MASK(s->Symbol));
242*f6dc9357SAndroid Build Coastguard Worker       // if ((Int32)count >= 0)
243*f6dc9357SAndroid Build Coastguard Worker       {
244*f6dc9357SAndroid Build Coastguard Worker         for (;;)
245*f6dc9357SAndroid Build Coastguard Worker         {
246*f6dc9357SAndroid Build Coastguard Worker           count -= s->Freq & (UInt32)(MASK((s)->Symbol)); s++; if ((Int32)count < 0) break;
247*f6dc9357SAndroid Build Coastguard Worker           // count -= s->Freq & (UInt32)(MASK((s)->Symbol)); s++; if ((Int32)count < 0) break;
248*f6dc9357SAndroid Build Coastguard Worker         }
249*f6dc9357SAndroid Build Coastguard Worker       }
250*f6dc9357SAndroid Build Coastguard Worker       s--;
251*f6dc9357SAndroid Build Coastguard Worker       RC_DecodeFinal((hiCnt - count) - s->Freq, s->Freq)
252*f6dc9357SAndroid Build Coastguard Worker 
253*f6dc9357SAndroid Build Coastguard Worker       // new (see->Summ) value can overflow over 16-bits in some rare cases
254*f6dc9357SAndroid Build Coastguard Worker       Ppmd_See_UPDATE(see)
255*f6dc9357SAndroid Build Coastguard Worker       p->FoundState = s;
256*f6dc9357SAndroid Build Coastguard Worker       sym = s->Symbol;
257*f6dc9357SAndroid Build Coastguard Worker       Ppmd7_Update2(p);
258*f6dc9357SAndroid Build Coastguard Worker       return sym;
259*f6dc9357SAndroid Build Coastguard Worker     }
260*f6dc9357SAndroid Build Coastguard Worker 
261*f6dc9357SAndroid Build Coastguard Worker     if (count >= freqSum)
262*f6dc9357SAndroid Build Coastguard Worker       return PPMD7_SYM_ERROR;
263*f6dc9357SAndroid Build Coastguard Worker 
264*f6dc9357SAndroid Build Coastguard Worker     RC_Decode(hiCnt, freqSum - hiCnt)
265*f6dc9357SAndroid Build Coastguard Worker 
266*f6dc9357SAndroid Build Coastguard Worker     // We increase (see->Summ) for sum of Freqs of all non_Masked symbols.
267*f6dc9357SAndroid Build Coastguard Worker     // new (see->Summ) value can overflow over 16-bits in some rare cases
268*f6dc9357SAndroid Build Coastguard Worker     see->Summ = (UInt16)(see->Summ + freqSum);
269*f6dc9357SAndroid Build Coastguard Worker 
270*f6dc9357SAndroid Build Coastguard Worker     s = Ppmd7_GetStats(p, p->MinContext);
271*f6dc9357SAndroid Build Coastguard Worker     s2 = s + p->MinContext->NumStats;
272*f6dc9357SAndroid Build Coastguard Worker     do
273*f6dc9357SAndroid Build Coastguard Worker     {
274*f6dc9357SAndroid Build Coastguard Worker       MASK(s->Symbol) = 0;
275*f6dc9357SAndroid Build Coastguard Worker       s++;
276*f6dc9357SAndroid Build Coastguard Worker     }
277*f6dc9357SAndroid Build Coastguard Worker     while (s != s2);
278*f6dc9357SAndroid Build Coastguard Worker   }
279*f6dc9357SAndroid Build Coastguard Worker }
280*f6dc9357SAndroid Build Coastguard Worker 
281*f6dc9357SAndroid Build Coastguard Worker #undef kTop
282*f6dc9357SAndroid Build Coastguard Worker #undef kBot
283*f6dc9357SAndroid Build Coastguard Worker #undef READ_BYTE
284*f6dc9357SAndroid Build Coastguard Worker #undef RC_NORM_BASE
285*f6dc9357SAndroid Build Coastguard Worker #undef RC_NORM_1
286*f6dc9357SAndroid Build Coastguard Worker #undef RC_NORM
287*f6dc9357SAndroid Build Coastguard Worker #undef RC_NORM_LOCAL
288*f6dc9357SAndroid Build Coastguard Worker #undef RC_NORM_REMOTE
289*f6dc9357SAndroid Build Coastguard Worker #undef R
290*f6dc9357SAndroid Build Coastguard Worker #undef RC_Decode
291*f6dc9357SAndroid Build Coastguard Worker #undef RC_DecodeFinal
292*f6dc9357SAndroid Build Coastguard Worker #undef RC_GetThreshold
293*f6dc9357SAndroid Build Coastguard Worker #undef CTX
294*f6dc9357SAndroid Build Coastguard Worker #undef SUCCESSOR
295*f6dc9357SAndroid Build Coastguard Worker #undef MASK
296