/rust/registry/src/index.crates.io-1949cf8c6b5b557f/bzip2-sys-0.1.13+1.0.8/bzip2-1.0.8/compress.c
Line  | Count  | Source  | 
1  |  |  | 
2  |  | /*-------------------------------------------------------------*/  | 
3  |  | /*--- Compression machinery (not incl block sorting)        ---*/  | 
4  |  | /*---                                            compress.c ---*/  | 
5  |  | /*-------------------------------------------------------------*/  | 
6  |  |  | 
7  |  | /* ------------------------------------------------------------------  | 
8  |  |    This file is part of bzip2/libbzip2, a program and library for  | 
9  |  |    lossless, block-sorting data compression.  | 
10  |  |  | 
11  |  |    bzip2/libbzip2 version 1.0.8 of 13 July 2019  | 
12  |  |    Copyright (C) 1996-2019 Julian Seward <jseward@acm.org>  | 
13  |  |  | 
14  |  |    Please read the WARNING, DISCLAIMER and PATENTS sections in the   | 
15  |  |    README file.  | 
16  |  |  | 
17  |  |    This program is released under the terms of the license contained  | 
18  |  |    in the file LICENSE.  | 
19  |  |    ------------------------------------------------------------------ */  | 
20  |  |  | 
21  |  |  | 
22  |  | /* CHANGES  | 
23  |  |     0.9.0    -- original version.  | 
24  |  |     0.9.0a/b -- no changes in this file.  | 
25  |  |     0.9.0c   -- changed setting of nGroups in sendMTFValues()   | 
26  |  |                 so as to do a bit better on small files  | 
27  |  | */  | 
28  |  |  | 
29  |  | #include "bzlib_private.h"  | 
30  |  |  | 
31  |  |  | 
32  |  | /*---------------------------------------------------*/  | 
33  |  | /*--- Bit stream I/O                              ---*/  | 
34  |  | /*---------------------------------------------------*/  | 
35  |  |  | 
36  |  | /*---------------------------------------------------*/  | 
37  |  | void BZ2_bsInitWrite ( EState* s )  | 
38  | 3.59k  | { | 
39  | 3.59k  |    s->bsLive = 0;  | 
40  | 3.59k  |    s->bsBuff = 0;  | 
41  | 3.59k  | }  | 
42  |  |  | 
43  |  |  | 
44  |  | /*---------------------------------------------------*/  | 
45  |  | static  | 
46  |  | void bsFinishWrite ( EState* s )  | 
47  | 3.59k  | { | 
48  | 10.2k  |    while (s->bsLive > 0) { | 
49  | 6.65k  |       s->zbits[s->numZ] = (UChar)(s->bsBuff >> 24);  | 
50  | 6.65k  |       s->numZ++;  | 
51  | 6.65k  |       s->bsBuff <<= 8;  | 
52  | 6.65k  |       s->bsLive -= 8;  | 
53  | 6.65k  |    }  | 
54  | 3.59k  | }  | 
55  |  |  | 
56  |  |  | 
57  |  | /*---------------------------------------------------*/  | 
58  | 2.05M  | #define bsNEEDW(nz)                           \  | 
59  | 2.05M  | {                                             \ | 
60  | 2.66M  |    while (s->bsLive >= 8) {                   \ | 
61  | 613k  |       s->zbits[s->numZ]                       \  | 
62  | 613k  |          = (UChar)(s->bsBuff >> 24);          \  | 
63  | 613k  |       s->numZ++;                              \  | 
64  | 613k  |       s->bsBuff <<= 8;                        \  | 
65  | 613k  |       s->bsLive -= 8;                         \  | 
66  | 613k  |    }                                          \  | 
67  | 2.05M  | }  | 
68  |  |  | 
69  |  |  | 
70  |  | /*---------------------------------------------------*/  | 
71  |  | static  | 
72  |  | __inline__  | 
73  |  | void bsW ( EState* s, Int32 n, UInt32 v )  | 
74  | 2.05M  | { | 
75  | 2.05M  |    bsNEEDW ( n );  | 
76  | 2.05M  |    s->bsBuff |= (v << (32 - s->bsLive - n));  | 
77  | 2.05M  |    s->bsLive += n;  | 
78  | 2.05M  | }  | 
79  |  |  | 
80  |  |  | 
81  |  | /*---------------------------------------------------*/  | 
82  |  | static  | 
83  |  | void bsPutUInt32 ( EState* s, UInt32 u )  | 
84  | 7.21k  | { | 
85  | 7.21k  |    bsW ( s, 8, (u >> 24) & 0xffL );  | 
86  | 7.21k  |    bsW ( s, 8, (u >> 16) & 0xffL );  | 
87  | 7.21k  |    bsW ( s, 8, (u >>  8) & 0xffL );  | 
88  | 7.21k  |    bsW ( s, 8,  u        & 0xffL );  | 
89  | 7.21k  | }  | 
90  |  |  | 
91  |  |  | 
92  |  | /*---------------------------------------------------*/  | 
93  |  | static  | 
94  |  | void bsPutUChar ( EState* s, UChar c )  | 
95  | 57.6k  | { | 
96  | 57.6k  |    bsW( s, 8, (UInt32)c );  | 
97  | 57.6k  | }  | 
98  |  |  | 
99  |  |  | 
100  |  | /*---------------------------------------------------*/  | 
101  |  | /*--- The back end proper                         ---*/  | 
102  |  | /*---------------------------------------------------*/  | 
103  |  |  | 
104  |  | /*---------------------------------------------------*/  | 
105  |  | static  | 
106  |  | void makeMaps_e ( EState* s )  | 
107  | 3.62k  | { | 
108  | 3.62k  |    Int32 i;  | 
109  | 3.62k  |    s->nInUse = 0;  | 
110  | 931k  |    for (i = 0; i < 256; i++)  | 
111  | 927k  |       if (s->inUse[i]) { | 
112  | 82.6k  |          s->unseqToSeq[i] = s->nInUse;  | 
113  | 82.6k  |          s->nInUse++;  | 
114  | 82.6k  |       }  | 
115  | 3.62k  | }  | 
116  |  |  | 
117  |  |  | 
118  |  | /*---------------------------------------------------*/  | 
119  |  | static  | 
120  |  | void generateMTFValues ( EState* s )  | 
121  | 3.62k  | { | 
122  | 3.62k  |    UChar   yy[256];  | 
123  | 3.62k  |    Int32   i, j;  | 
124  | 3.62k  |    Int32   zPend;  | 
125  | 3.62k  |    Int32   wr;  | 
126  | 3.62k  |    Int32   EOB;  | 
127  |  |  | 
128  |  |    /*   | 
129  |  |       After sorting (eg, here),  | 
130  |  |          s->arr1 [ 0 .. s->nblock-1 ] holds sorted order,  | 
131  |  |          and  | 
132  |  |          ((UChar*)s->arr2) [ 0 .. s->nblock-1 ]   | 
133  |  |          holds the original block data.  | 
134  |  |  | 
135  |  |       The first thing to do is generate the MTF values,  | 
136  |  |       and put them in  | 
137  |  |          ((UInt16*)s->arr1) [ 0 .. s->nblock-1 ].  | 
138  |  |       Because there are strictly fewer or equal MTF values  | 
139  |  |       than block values, ptr values in this area are overwritten  | 
140  |  |       with MTF values only when they are no longer needed.  | 
141  |  |  | 
142  |  |       The final compressed bitstream is generated into the  | 
143  |  |       area starting at  | 
144  |  |          (UChar*) (&((UChar*)s->arr2)[s->nblock])  | 
145  |  |  | 
146  |  |       These storage aliases are set up in bzCompressInit(),  | 
147  |  |       except for the last one, which is arranged in   | 
148  |  |       compressBlock().  | 
149  |  |    */  | 
150  | 3.62k  |    UInt32* ptr   = s->ptr;  | 
151  | 3.62k  |    UChar* block  = s->block;  | 
152  | 3.62k  |    UInt16* mtfv  = s->mtfv;  | 
153  |  |  | 
154  | 3.62k  |    makeMaps_e ( s );  | 
155  | 3.62k  |    EOB = s->nInUse+1;  | 
156  |  |  | 
157  | 93.5k  |    for (i = 0; i <= EOB; i++) s->mtfFreq[i] = 0;  | 
158  |  |  | 
159  | 3.62k  |    wr = 0;  | 
160  | 3.62k  |    zPend = 0;  | 
161  | 86.3k  |    for (i = 0; i < s->nInUse; i++) yy[i] = (UChar) i;  | 
162  |  |  | 
163  | 14.1M  |    for (i = 0; i < s->nblock; i++) { | 
164  | 14.1M  |       UChar ll_i;  | 
165  | 14.1M  |       AssertD ( wr <= i, "generateMTFValues(1)" );  | 
166  | 14.1M  |       j = ptr[i]-1; if (j < 0) j += s->nblock;  | 
167  | 14.1M  |       ll_i = s->unseqToSeq[block[j]];  | 
168  | 14.1M  |       AssertD ( ll_i < s->nInUse, "generateMTFValues(2a)" );  | 
169  |  |  | 
170  | 14.1M  |       if (yy[0] == ll_i) {  | 
171  | 13.7M  |          zPend++;  | 
172  | 13.7M  |       } else { | 
173  |  |  | 
174  | 342k  |          if (zPend > 0) { | 
175  | 204k  |             zPend--;  | 
176  | 652k  |             while (True) { | 
177  | 652k  |                if (zPend & 1) { | 
178  | 281k  |                   mtfv[wr] = BZ_RUNB; wr++;   | 
179  | 281k  |                   s->mtfFreq[BZ_RUNB]++;   | 
180  | 371k  |                } else { | 
181  | 371k  |                   mtfv[wr] = BZ_RUNA; wr++;   | 
182  | 371k  |                   s->mtfFreq[BZ_RUNA]++;   | 
183  | 371k  |                }  | 
184  | 652k  |                if (zPend < 2) break;  | 
185  | 448k  |                zPend = (zPend - 2) / 2;  | 
186  | 448k  |             };  | 
187  | 204k  |             zPend = 0;  | 
188  | 204k  |          }  | 
189  | 342k  |          { | 
190  | 342k  |             register UChar  rtmp;  | 
191  | 342k  |             register UChar* ryy_j;  | 
192  | 342k  |             register UChar  rll_i;  | 
193  | 342k  |             rtmp  = yy[1];  | 
194  | 342k  |             yy[1] = yy[0];  | 
195  | 342k  |             ryy_j = &(yy[1]);  | 
196  | 342k  |             rll_i = ll_i;  | 
197  | 4.69M  |             while ( rll_i != rtmp ) { | 
198  | 4.35M  |                register UChar rtmp2;  | 
199  | 4.35M  |                ryy_j++;  | 
200  | 4.35M  |                rtmp2  = rtmp;  | 
201  | 4.35M  |                rtmp   = *ryy_j;  | 
202  | 4.35M  |                *ryy_j = rtmp2;  | 
203  | 4.35M  |             };  | 
204  | 342k  |             yy[0] = rtmp;  | 
205  | 342k  |             j = ryy_j - &(yy[0]);  | 
206  | 342k  |             mtfv[wr] = j+1; wr++; s->mtfFreq[j+1]++;  | 
207  | 342k  |          }  | 
208  |  |  | 
209  | 342k  |       }  | 
210  | 14.1M  |    }  | 
211  |  |  | 
212  | 3.62k  |    if (zPend > 0) { | 
213  | 994  |       zPend--;  | 
214  | 1.88k  |       while (True) { | 
215  | 1.88k  |          if (zPend & 1) { | 
216  | 741  |             mtfv[wr] = BZ_RUNB; wr++;   | 
217  | 741  |             s->mtfFreq[BZ_RUNB]++;   | 
218  | 1.14k  |          } else { | 
219  | 1.14k  |             mtfv[wr] = BZ_RUNA; wr++;   | 
220  | 1.14k  |             s->mtfFreq[BZ_RUNA]++;   | 
221  | 1.14k  |          }  | 
222  | 1.88k  |          if (zPend < 2) break;  | 
223  | 890  |          zPend = (zPend - 2) / 2;  | 
224  | 890  |       };  | 
225  | 994  |       zPend = 0;  | 
226  | 994  |    }  | 
227  |  |  | 
228  | 3.62k  |    mtfv[wr] = EOB; wr++; s->mtfFreq[EOB]++;  | 
229  |  |  | 
230  | 3.62k  |    s->nMTF = wr;  | 
231  | 3.62k  | }  | 
232  |  |  | 
233  |  |  | 
234  |  | /*---------------------------------------------------*/  | 
235  | 89.9k  | #define BZ_LESSER_ICOST  0  | 
236  | 732k  | #define BZ_GREATER_ICOST 15  | 
237  |  |  | 
238  |  | static  | 
239  |  | void sendMTFValues ( EState* s )  | 
240  | 3.62k  | { | 
241  | 3.62k  |    Int32 v, t, i, j, gs, ge, totc, bt, bc, iter;  | 
242  | 3.62k  |    Int32 nSelectors, alphaSize, minLen, maxLen, selCtr;  | 
243  | 3.62k  |    Int32 nGroups, nBytes;  | 
244  |  |  | 
245  |  |    /*--  | 
246  |  |    UChar  len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];  | 
247  |  |    is a global since the decoder also needs it.  | 
248  |  |  | 
249  |  |    Int32  code[BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];  | 
250  |  |    Int32  rfreq[BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];  | 
251  |  |    are also globals only used in this proc.  | 
252  |  |    Made global to keep stack frame size small.  | 
253  |  |    --*/  | 
254  |  |  | 
255  |  |  | 
256  | 3.62k  |    UInt16 cost[BZ_N_GROUPS];  | 
257  | 3.62k  |    Int32  fave[BZ_N_GROUPS];  | 
258  |  |  | 
259  | 3.62k  |    UInt16* mtfv = s->mtfv;  | 
260  |  |  | 
261  | 3.62k  |    if (s->verbosity >= 3)  | 
262  | 0  |       VPrintf3( "      %d in block, %d after MTF & 1-2 coding, "  | 
263  | 3.62k  |                 "%d+2 syms in use\n",   | 
264  | 3.62k  |                 s->nblock, s->nMTF, s->nInUse );  | 
265  |  |  | 
266  | 3.62k  |    alphaSize = s->nInUse+2;  | 
267  | 25.3k  |    for (t = 0; t < BZ_N_GROUPS; t++)  | 
268  | 561k  |       for (v = 0; v < alphaSize; v++)  | 
269  | 539k  |          s->len[t][v] = BZ_GREATER_ICOST;  | 
270  |  |  | 
271  |  |    /*--- Decide how many coding tables to use ---*/  | 
272  | 3.62k  |    AssertH ( s->nMTF > 0, 3001 );  | 
273  | 3.62k  |    if (s->nMTF < 200)  nGroups = 2; else  | 
274  | 866  |    if (s->nMTF < 600)  nGroups = 3; else  | 
275  | 428  |    if (s->nMTF < 1200) nGroups = 4; else  | 
276  | 252  |    if (s->nMTF < 2400) nGroups = 5; else  | 
277  | 147  |                        nGroups = 6;  | 
278  |  |  | 
279  |  |    /*--- Generate an initial set of coding tables ---*/  | 
280  | 3.62k  |    {  | 
281  | 3.62k  |       Int32 nPart, remF, tFreq, aFreq;  | 
282  |  |  | 
283  | 3.62k  |       nPart = nGroups;  | 
284  | 3.62k  |       remF  = s->nMTF;  | 
285  | 3.62k  |       gs = 0;  | 
286  | 12.5k  |       while (nPart > 0) { | 
287  | 8.94k  |          tFreq = remF / nPart;  | 
288  | 8.94k  |          ge = gs-1;  | 
289  | 8.94k  |          aFreq = 0;  | 
290  | 99.4k  |          while (aFreq < tFreq && ge < alphaSize-1) { | 
291  | 90.4k  |             ge++;  | 
292  | 90.4k  |             aFreq += s->mtfFreq[ge];  | 
293  | 90.4k  |          }  | 
294  |  |  | 
295  | 8.94k  |          if (ge > gs   | 
296  | 7.29k  |              && nPart != nGroups && nPart != 1   | 
297  | 985  |              && ((nGroups-nPart) % 2 == 1)) { | 
298  | 573  |             aFreq -= s->mtfFreq[ge];  | 
299  | 573  |             ge--;  | 
300  | 573  |          }  | 
301  |  |  | 
302  | 8.94k  |          if (s->verbosity >= 3)  | 
303  | 0  |             VPrintf5( "      initial group %d, [%d .. %d], "  | 
304  | 8.94k  |                       "has %d syms (%4.1f%%)\n",  | 
305  | 8.94k  |                       nPart, gs, ge, aFreq,   | 
306  | 8.94k  |                       (100.0 * (float)aFreq) / (float)(s->nMTF) );  | 
307  |  |    | 
308  | 291k  |          for (v = 0; v < alphaSize; v++)  | 
309  | 282k  |             if (v >= gs && v <= ge)   | 
310  | 89.9k  |                s->len[nPart-1][v] = BZ_LESSER_ICOST; else  | 
311  | 192k  |                s->len[nPart-1][v] = BZ_GREATER_ICOST;  | 
312  |  |    | 
313  | 8.94k  |          nPart--;  | 
314  | 8.94k  |          gs = ge+1;  | 
315  | 8.94k  |          remF -= aFreq;  | 
316  | 8.94k  |       }  | 
317  | 3.62k  |    }  | 
318  |  |  | 
319  |  |    /*---   | 
320  |  |       Iterate up to BZ_N_ITERS times to improve the tables.  | 
321  |  |    ---*/  | 
322  | 18.1k  |    for (iter = 0; iter < BZ_N_ITERS; iter++) { | 
323  |  |  | 
324  | 50.2k  |       for (t = 0; t < nGroups; t++) fave[t] = 0;  | 
325  |  |  | 
326  | 50.2k  |       for (t = 0; t < nGroups; t++)  | 
327  | 1.16M  |          for (v = 0; v < alphaSize; v++)  | 
328  | 1.13M  |             s->rfreq[t][v] = 0;  | 
329  |  |  | 
330  |  |       /*---  | 
331  |  |         Set up an auxiliary length table which is used to fast-track  | 
332  |  |   the common case (nGroups == 6).   | 
333  |  |       ---*/  | 
334  | 14.4k  |       if (nGroups == 6) { | 
335  | 48.6k  |          for (v = 0; v < alphaSize; v++) { | 
336  | 48.0k  |             s->len_pack[v][0] = (s->len[1][v] << 16) | s->len[0][v];  | 
337  | 48.0k  |             s->len_pack[v][1] = (s->len[3][v] << 16) | s->len[2][v];  | 
338  | 48.0k  |             s->len_pack[v][2] = (s->len[5][v] << 16) | s->len[4][v];  | 
339  | 48.0k  |    }  | 
340  | 588  |       }  | 
341  |  |  | 
342  | 14.4k  |       nSelectors = 0;  | 
343  | 14.4k  |       totc = 0;  | 
344  | 14.4k  |       gs = 0;  | 
345  | 103k  |       while (True) { | 
346  |  |  | 
347  |  |          /*--- Set group start & end marks. --*/  | 
348  | 103k  |          if (gs >= s->nMTF) break;  | 
349  | 88.6k  |          ge = gs + BZ_G_SIZE - 1;   | 
350  | 88.6k  |          if (ge >= s->nMTF) ge = s->nMTF-1;  | 
351  |  |  | 
352  |  |          /*--   | 
353  |  |             Calculate the cost of this group as coded  | 
354  |  |             by each of the coding tables.  | 
355  |  |          --*/  | 
356  | 474k  |          for (t = 0; t < nGroups; t++) cost[t] = 0;  | 
357  |  |  | 
358  | 88.6k  |          if (nGroups == 6 && 50 == ge-gs+1) { | 
359  |  |             /*--- fast track the common case ---*/  | 
360  | 32.2k  |             register UInt32 cost01, cost23, cost45;  | 
361  | 32.2k  |             register UInt16 icv;  | 
362  | 32.2k  |             cost01 = cost23 = cost45 = 0;  | 
363  |  |  | 
364  | 32.2k  | #           define BZ_ITER(nn)                \  | 
365  | 1.61M  |                icv = mtfv[gs+(nn)];           \  | 
366  | 1.61M  |                cost01 += s->len_pack[icv][0]; \  | 
367  | 1.61M  |                cost23 += s->len_pack[icv][1]; \  | 
368  | 1.61M  |                cost45 += s->len_pack[icv][2]; \  | 
369  | 32.2k  |  | 
370  | 32.2k  |             BZ_ITER(0);  BZ_ITER(1);  BZ_ITER(2);  BZ_ITER(3);  BZ_ITER(4);  | 
371  | 32.2k  |             BZ_ITER(5);  BZ_ITER(6);  BZ_ITER(7);  BZ_ITER(8);  BZ_ITER(9);  | 
372  | 32.2k  |             BZ_ITER(10); BZ_ITER(11); BZ_ITER(12); BZ_ITER(13); BZ_ITER(14);  | 
373  | 32.2k  |             BZ_ITER(15); BZ_ITER(16); BZ_ITER(17); BZ_ITER(18); BZ_ITER(19);  | 
374  | 32.2k  |             BZ_ITER(20); BZ_ITER(21); BZ_ITER(22); BZ_ITER(23); BZ_ITER(24);  | 
375  | 32.2k  |             BZ_ITER(25); BZ_ITER(26); BZ_ITER(27); BZ_ITER(28); BZ_ITER(29);  | 
376  | 32.2k  |             BZ_ITER(30); BZ_ITER(31); BZ_ITER(32); BZ_ITER(33); BZ_ITER(34);  | 
377  | 32.2k  |             BZ_ITER(35); BZ_ITER(36); BZ_ITER(37); BZ_ITER(38); BZ_ITER(39);  | 
378  | 32.2k  |             BZ_ITER(40); BZ_ITER(41); BZ_ITER(42); BZ_ITER(43); BZ_ITER(44);  | 
379  | 32.2k  |             BZ_ITER(45); BZ_ITER(46); BZ_ITER(47); BZ_ITER(48); BZ_ITER(49);  | 
380  |  |  | 
381  | 32.2k  | #           undef BZ_ITER  | 
382  |  |  | 
383  | 32.2k  |             cost[0] = cost01 & 0xffff; cost[1] = cost01 >> 16;  | 
384  | 32.2k  |             cost[2] = cost23 & 0xffff; cost[3] = cost23 >> 16;  | 
385  | 32.2k  |             cost[4] = cost45 & 0xffff; cost[5] = cost45 >> 16;  | 
386  |  |  | 
387  | 56.4k  |          } else { | 
388  |  |       /*--- slow version which correctly handles all situations ---*/  | 
389  | 2.44M  |             for (i = gs; i <= ge; i++) {  | 
390  | 2.39M  |                UInt16 icv = mtfv[i];  | 
391  | 11.0M  |                for (t = 0; t < nGroups; t++) cost[t] += s->len[t][icv];  | 
392  | 2.39M  |             }  | 
393  | 56.4k  |          }  | 
394  |  |    | 
395  |  |          /*--   | 
396  |  |             Find the coding table which is best for this group,  | 
397  |  |             and record its identity in the selector table.  | 
398  |  |          --*/  | 
399  | 88.6k  |          bc = 999999999; bt = -1;  | 
400  | 474k  |          for (t = 0; t < nGroups; t++)  | 
401  | 386k  |             if (cost[t] < bc) { bc = cost[t]; bt = t; }; | 
402  | 88.6k  |          totc += bc;  | 
403  | 88.6k  |          fave[bt]++;  | 
404  | 88.6k  |          s->selector[nSelectors] = bt;  | 
405  | 88.6k  |          nSelectors++;  | 
406  |  |  | 
407  |  |          /*--   | 
408  |  |             Increment the symbol frequencies for the selected table.  | 
409  |  |           --*/  | 
410  | 88.6k  |          if (nGroups == 6 && 50 == ge-gs+1) { | 
411  |  |             /*--- fast track the common case ---*/  | 
412  |  |  | 
413  | 1.61M  | #           define BZ_ITUR(nn) s->rfreq[bt][ mtfv[gs+(nn)] ]++  | 
414  |  |  | 
415  | 32.2k  |             BZ_ITUR(0);  BZ_ITUR(1);  BZ_ITUR(2);  BZ_ITUR(3);  BZ_ITUR(4);  | 
416  | 32.2k  |             BZ_ITUR(5);  BZ_ITUR(6);  BZ_ITUR(7);  BZ_ITUR(8);  BZ_ITUR(9);  | 
417  | 32.2k  |             BZ_ITUR(10); BZ_ITUR(11); BZ_ITUR(12); BZ_ITUR(13); BZ_ITUR(14);  | 
418  | 32.2k  |             BZ_ITUR(15); BZ_ITUR(16); BZ_ITUR(17); BZ_ITUR(18); BZ_ITUR(19);  | 
419  | 32.2k  |             BZ_ITUR(20); BZ_ITUR(21); BZ_ITUR(22); BZ_ITUR(23); BZ_ITUR(24);  | 
420  | 32.2k  |             BZ_ITUR(25); BZ_ITUR(26); BZ_ITUR(27); BZ_ITUR(28); BZ_ITUR(29);  | 
421  | 32.2k  |             BZ_ITUR(30); BZ_ITUR(31); BZ_ITUR(32); BZ_ITUR(33); BZ_ITUR(34);  | 
422  | 32.2k  |             BZ_ITUR(35); BZ_ITUR(36); BZ_ITUR(37); BZ_ITUR(38); BZ_ITUR(39);  | 
423  | 32.2k  |             BZ_ITUR(40); BZ_ITUR(41); BZ_ITUR(42); BZ_ITUR(43); BZ_ITUR(44);  | 
424  | 32.2k  |             BZ_ITUR(45); BZ_ITUR(46); BZ_ITUR(47); BZ_ITUR(48); BZ_ITUR(49);  | 
425  |  |  | 
426  | 32.2k  | #           undef BZ_ITUR  | 
427  |  |  | 
428  | 56.4k  |          } else { | 
429  |  |       /*--- slow version which correctly handles all situations ---*/  | 
430  | 2.44M  |             for (i = gs; i <= ge; i++)  | 
431  | 2.39M  |                s->rfreq[bt][ mtfv[i] ]++;  | 
432  | 56.4k  |          }  | 
433  |  |  | 
434  | 88.6k  |          gs = ge+1;  | 
435  | 88.6k  |       }  | 
436  | 14.4k  |       if (s->verbosity >= 3) { | 
437  | 0  |          VPrintf2 ( "      pass %d: size is %d, grp uses are ",   | 
438  | 0  |                    iter+1, totc/8 );  | 
439  | 0  |          for (t = 0; t < nGroups; t++)  | 
440  | 0  |             VPrintf1 ( "%d ", fave[t] );  | 
441  | 0  |          VPrintf0 ( "\n" );  | 
442  | 0  |       }  | 
443  |  |  | 
444  |  |       /*--  | 
445  |  |         Recompute the tables based on the accumulated frequencies.  | 
446  |  |       --*/  | 
447  |  |       /* maxLen was changed from 20 to 17 in bzip2-1.0.3.  See   | 
448  |  |          comment in huffman.c for details. */  | 
449  | 50.2k  |       for (t = 0; t < nGroups; t++)  | 
450  | 35.7k  |          BZ2_hbMakeCodeLengths ( &(s->len[t][0]), &(s->rfreq[t][0]),   | 
451  | 35.7k  |                                  alphaSize, 17 /*20*/ );  | 
452  | 14.4k  |    }  | 
453  |  |  | 
454  |  |  | 
455  | 3.62k  |    AssertH( nGroups < 8, 3002 );  | 
456  | 3.62k  |    AssertH( nSelectors < 32768 &&  | 
457  | 3.62k  |             nSelectors <= BZ_MAX_SELECTORS,  | 
458  | 3.62k  |             3003 );  | 
459  |  |  | 
460  |  |  | 
461  |  |    /*--- Compute MTF values for the selectors. ---*/  | 
462  | 3.62k  |    { | 
463  | 3.62k  |       UChar pos[BZ_N_GROUPS], ll_i, tmp2, tmp;  | 
464  | 12.5k  |       for (i = 0; i < nGroups; i++) pos[i] = i;  | 
465  | 25.7k  |       for (i = 0; i < nSelectors; i++) { | 
466  | 22.1k  |          ll_i = s->selector[i];  | 
467  | 22.1k  |          j = 0;  | 
468  | 22.1k  |          tmp = pos[j];  | 
469  | 34.2k  |          while ( ll_i != tmp ) { | 
470  | 12.0k  |             j++;  | 
471  | 12.0k  |             tmp2 = tmp;  | 
472  | 12.0k  |             tmp = pos[j];  | 
473  | 12.0k  |             pos[j] = tmp2;  | 
474  | 12.0k  |          };  | 
475  | 22.1k  |          pos[0] = tmp;  | 
476  | 22.1k  |          s->selectorMtf[i] = j;  | 
477  | 22.1k  |       }  | 
478  | 3.62k  |    };  | 
479  |  |  | 
480  |  |    /*--- Assign actual codes for the tables. --*/  | 
481  | 12.5k  |    for (t = 0; t < nGroups; t++) { | 
482  | 8.94k  |       minLen = 32;  | 
483  | 8.94k  |       maxLen = 0;  | 
484  | 291k  |       for (i = 0; i < alphaSize; i++) { | 
485  | 282k  |          if (s->len[t][i] > maxLen) maxLen = s->len[t][i];  | 
486  | 282k  |          if (s->len[t][i] < minLen) minLen = s->len[t][i];  | 
487  | 282k  |       }  | 
488  | 8.94k  |       AssertH ( !(maxLen > 17 /*20*/ ), 3004 );  | 
489  | 8.94k  |       AssertH ( !(minLen < 1),  3005 );  | 
490  | 8.94k  |       BZ2_hbAssignCodes ( &(s->code[t][0]), &(s->len[t][0]),   | 
491  | 8.94k  |                           minLen, maxLen, alphaSize );  | 
492  | 8.94k  |    }  | 
493  |  |  | 
494  |  |    /*--- Transmit the mapping table. ---*/  | 
495  | 3.62k  |    {  | 
496  | 3.62k  |       Bool inUse16[16];  | 
497  | 61.6k  |       for (i = 0; i < 16; i++) { | 
498  | 57.9k  |           inUse16[i] = False;  | 
499  | 985k  |           for (j = 0; j < 16; j++)  | 
500  | 927k  |              if (s->inUse[i * 16 + j]) inUse16[i] = True;  | 
501  | 57.9k  |       }  | 
502  |  |        | 
503  | 3.62k  |       nBytes = s->numZ;  | 
504  | 61.6k  |       for (i = 0; i < 16; i++)  | 
505  | 57.9k  |          if (inUse16[i]) bsW(s,1,1); else bsW(s,1,0);  | 
506  |  |  | 
507  | 61.6k  |       for (i = 0; i < 16; i++)  | 
508  | 57.9k  |          if (inUse16[i])  | 
509  | 462k  |             for (j = 0; j < 16; j++) { | 
510  | 435k  |                if (s->inUse[i * 16 + j]) bsW(s,1,1); else bsW(s,1,0);  | 
511  | 435k  |             }  | 
512  |  |  | 
513  | 3.62k  |       if (s->verbosity >= 3)   | 
514  | 0  |          VPrintf1( "      bytes: mapping %d, ", s->numZ-nBytes );  | 
515  | 3.62k  |    }  | 
516  |  |  | 
517  |  |    /*--- Now the selectors. ---*/  | 
518  | 3.62k  |    nBytes = s->numZ;  | 
519  | 3.62k  |    bsW ( s, 3, nGroups );  | 
520  | 3.62k  |    bsW ( s, 15, nSelectors );  | 
521  | 25.7k  |    for (i = 0; i < nSelectors; i++) {  | 
522  | 34.2k  |       for (j = 0; j < s->selectorMtf[i]; j++) bsW(s,1,1);  | 
523  | 22.1k  |       bsW(s,1,0);  | 
524  | 22.1k  |    }  | 
525  | 3.62k  |    if (s->verbosity >= 3)  | 
526  | 0  |       VPrintf1( "selectors %d, ", s->numZ-nBytes );  | 
527  |  |  | 
528  |  |    /*--- Now the coding tables. ---*/  | 
529  | 3.62k  |    nBytes = s->numZ;  | 
530  |  |  | 
531  | 12.5k  |    for (t = 0; t < nGroups; t++) { | 
532  | 8.94k  |       Int32 curr = s->len[t][0];  | 
533  | 8.94k  |       bsW ( s, 5, curr );  | 
534  | 291k  |       for (i = 0; i < alphaSize; i++) { | 
535  | 355k  |          while (curr < s->len[t][i]) { bsW(s,2,2); curr++; /* 10 */ }; | 
536  | 339k  |          while (curr > s->len[t][i]) { bsW(s,2,3); curr--; /* 11 */ }; | 
537  | 282k  |          bsW ( s, 1, 0 );  | 
538  | 282k  |       }  | 
539  | 8.94k  |    }  | 
540  |  |  | 
541  | 3.62k  |    if (s->verbosity >= 3)  | 
542  | 0  |       VPrintf1 ( "code lengths %d, ", s->numZ-nBytes );  | 
543  |  |  | 
544  |  |    /*--- And finally, the block data proper ---*/  | 
545  | 3.62k  |    nBytes = s->numZ;  | 
546  | 3.62k  |    selCtr = 0;  | 
547  | 3.62k  |    gs = 0;  | 
548  | 25.7k  |    while (True) { | 
549  | 25.7k  |       if (gs >= s->nMTF) break;  | 
550  | 22.1k  |       ge = gs + BZ_G_SIZE - 1;   | 
551  | 22.1k  |       if (ge >= s->nMTF) ge = s->nMTF-1;  | 
552  | 22.1k  |       AssertH ( s->selector[selCtr] < nGroups, 3006 );  | 
553  |  |  | 
554  | 22.1k  |       if (nGroups == 6 && 50 == ge-gs+1) { | 
555  |  |             /*--- fast track the common case ---*/  | 
556  | 8.05k  |             UInt16 mtfv_i;  | 
557  | 8.05k  |             UChar* s_len_sel_selCtr   | 
558  | 8.05k  |                = &(s->len[s->selector[selCtr]][0]);  | 
559  | 8.05k  |             Int32* s_code_sel_selCtr  | 
560  | 8.05k  |                = &(s->code[s->selector[selCtr]][0]);  | 
561  |  |  | 
562  | 8.05k  | #           define BZ_ITAH(nn)                      \  | 
563  | 402k  |                mtfv_i = mtfv[gs+(nn)];              \  | 
564  | 402k  |                bsW ( s,                             \  | 
565  | 402k  |                      s_len_sel_selCtr[mtfv_i],      \  | 
566  | 402k  |                      s_code_sel_selCtr[mtfv_i] )  | 
567  |  |  | 
568  | 8.05k  |             BZ_ITAH(0);  BZ_ITAH(1);  BZ_ITAH(2);  BZ_ITAH(3);  BZ_ITAH(4);  | 
569  | 8.05k  |             BZ_ITAH(5);  BZ_ITAH(6);  BZ_ITAH(7);  BZ_ITAH(8);  BZ_ITAH(9);  | 
570  | 8.05k  |             BZ_ITAH(10); BZ_ITAH(11); BZ_ITAH(12); BZ_ITAH(13); BZ_ITAH(14);  | 
571  | 8.05k  |             BZ_ITAH(15); BZ_ITAH(16); BZ_ITAH(17); BZ_ITAH(18); BZ_ITAH(19);  | 
572  | 8.05k  |             BZ_ITAH(20); BZ_ITAH(21); BZ_ITAH(22); BZ_ITAH(23); BZ_ITAH(24);  | 
573  | 8.05k  |             BZ_ITAH(25); BZ_ITAH(26); BZ_ITAH(27); BZ_ITAH(28); BZ_ITAH(29);  | 
574  | 8.05k  |             BZ_ITAH(30); BZ_ITAH(31); BZ_ITAH(32); BZ_ITAH(33); BZ_ITAH(34);  | 
575  | 8.05k  |             BZ_ITAH(35); BZ_ITAH(36); BZ_ITAH(37); BZ_ITAH(38); BZ_ITAH(39);  | 
576  | 8.05k  |             BZ_ITAH(40); BZ_ITAH(41); BZ_ITAH(42); BZ_ITAH(43); BZ_ITAH(44);  | 
577  | 8.05k  |             BZ_ITAH(45); BZ_ITAH(46); BZ_ITAH(47); BZ_ITAH(48); BZ_ITAH(49);  | 
578  |  |  | 
579  | 8.05k  | #           undef BZ_ITAH  | 
580  |  |  | 
581  | 14.1k  |       } else { | 
582  |  |    /*--- slow version which correctly handles all situations ---*/  | 
583  | 611k  |          for (i = gs; i <= ge; i++) { | 
584  | 597k  |             bsW ( s,   | 
585  | 597k  |                   s->len  [s->selector[selCtr]] [mtfv[i]],  | 
586  | 597k  |                   s->code [s->selector[selCtr]] [mtfv[i]] );  | 
587  | 597k  |          }  | 
588  | 14.1k  |       }  | 
589  |  |  | 
590  |  |  | 
591  | 22.1k  |       gs = ge+1;  | 
592  | 22.1k  |       selCtr++;  | 
593  | 22.1k  |    }  | 
594  | 3.62k  |    AssertH( selCtr == nSelectors, 3007 );  | 
595  |  |  | 
596  | 3.62k  |    if (s->verbosity >= 3)  | 
597  | 0  |       VPrintf1( "codes %d\n", s->numZ-nBytes );  | 
598  | 3.62k  | }  | 
599  |  |  | 
600  |  |  | 
601  |  | /*---------------------------------------------------*/  | 
602  |  | void BZ2_compressBlock ( EState* s, Bool is_last_block )  | 
603  | 3.62k  | { | 
604  | 3.62k  |    if (s->nblock > 0) { | 
605  |  |  | 
606  | 3.62k  |       BZ_FINALISE_CRC ( s->blockCRC );  | 
607  | 3.62k  |       s->combinedCRC = (s->combinedCRC << 1) | (s->combinedCRC >> 31);  | 
608  | 3.62k  |       s->combinedCRC ^= s->blockCRC;  | 
609  | 3.62k  |       if (s->blockNo > 1) s->numZ = 0;  | 
610  |  |  | 
611  | 3.62k  |       if (s->verbosity >= 2)  | 
612  | 0  |          VPrintf4( "    block %d: crc = 0x%08x, "  | 
613  | 3.62k  |                    "combined CRC = 0x%08x, size = %d\n",  | 
614  | 3.62k  |                    s->blockNo, s->blockCRC, s->combinedCRC, s->nblock );  | 
615  |  |  | 
616  | 3.62k  |       BZ2_blockSort ( s );  | 
617  | 3.62k  |    }  | 
618  |  |  | 
619  | 3.62k  |    s->zbits = (UChar*) (&((UChar*)s->arr2)[s->nblock]);  | 
620  |  |  | 
621  |  |    /*-- If this is the first block, create the stream header. --*/  | 
622  | 3.62k  |    if (s->blockNo == 1) { | 
623  | 3.59k  |       BZ2_bsInitWrite ( s );  | 
624  | 3.59k  |       bsPutUChar ( s, BZ_HDR_B );  | 
625  | 3.59k  |       bsPutUChar ( s, BZ_HDR_Z );  | 
626  | 3.59k  |       bsPutUChar ( s, BZ_HDR_h );  | 
627  | 3.59k  |       bsPutUChar ( s, (UChar)(BZ_HDR_0 + s->blockSize100k) );  | 
628  | 3.59k  |    }  | 
629  |  |  | 
630  | 3.62k  |    if (s->nblock > 0) { | 
631  |  |  | 
632  | 3.62k  |       bsPutUChar ( s, 0x31 ); bsPutUChar ( s, 0x41 );  | 
633  | 3.62k  |       bsPutUChar ( s, 0x59 ); bsPutUChar ( s, 0x26 );  | 
634  | 3.62k  |       bsPutUChar ( s, 0x53 ); bsPutUChar ( s, 0x59 );  | 
635  |  |  | 
636  |  |       /*-- Now the block's CRC, so it is in a known place. --*/  | 
637  | 3.62k  |       bsPutUInt32 ( s, s->blockCRC );  | 
638  |  |  | 
639  |  |       /*--   | 
640  |  |          Now a single bit indicating (non-)randomisation.   | 
641  |  |          As of version 0.9.5, we use a better sorting algorithm  | 
642  |  |          which makes randomisation unnecessary.  So always set  | 
643  |  |          the randomised bit to 'no'.  Of course, the decoder  | 
644  |  |          still needs to be able to handle randomised blocks  | 
645  |  |          so as to maintain backwards compatibility with  | 
646  |  |          older versions of bzip2.  | 
647  |  |       --*/  | 
648  | 3.62k  |       bsW(s,1,0);  | 
649  |  |  | 
650  | 3.62k  |       bsW ( s, 24, s->origPtr );  | 
651  | 3.62k  |       generateMTFValues ( s );  | 
652  | 3.62k  |       sendMTFValues ( s );  | 
653  | 3.62k  |    }  | 
654  |  |  | 
655  |  |  | 
656  |  |    /*-- If this is the last block, add the stream trailer. --*/  | 
657  | 3.62k  |    if (is_last_block) { | 
658  |  |  | 
659  | 3.59k  |       bsPutUChar ( s, 0x17 ); bsPutUChar ( s, 0x72 );  | 
660  | 3.59k  |       bsPutUChar ( s, 0x45 ); bsPutUChar ( s, 0x38 );  | 
661  | 3.59k  |       bsPutUChar ( s, 0x50 ); bsPutUChar ( s, 0x90 );  | 
662  | 3.59k  |       bsPutUInt32 ( s, s->combinedCRC );  | 
663  | 3.59k  |       if (s->verbosity >= 2)  | 
664  | 0  |          VPrintf1( "    final combined CRC = 0x%08x\n   ", s->combinedCRC );  | 
665  | 3.59k  |       bsFinishWrite ( s );  | 
666  | 3.59k  |    }  | 
667  | 3.62k  | }  | 
668  |  |  | 
669  |  |  | 
670  |  | /*-------------------------------------------------------------*/  | 
671  |  | /*--- end                                        compress.c ---*/  | 
672  |  | /*-------------------------------------------------------------*/  |