Blame


1 ff3adf60 2004-04-14 devnull /*
2 ff3adf60 2004-04-14 devnull * THIS FILE IS NOT IDENTICAL TO THE ORIGINAL
3 ff3adf60 2004-04-14 devnull * FROM THE BZIP2 DISTRIBUTION.
4 ff3adf60 2004-04-14 devnull *
5 ff3adf60 2004-04-14 devnull * It has been modified, mainly to break the library
6 ff3adf60 2004-04-14 devnull * into smaller pieces.
7 ff3adf60 2004-04-14 devnull *
8 ff3adf60 2004-04-14 devnull * Russ Cox
9 ff3adf60 2004-04-14 devnull * rsc@plan9.bell-labs.com
10 ff3adf60 2004-04-14 devnull * July 2000
11 ff3adf60 2004-04-14 devnull */
12 ff3adf60 2004-04-14 devnull
13 ff3adf60 2004-04-14 devnull /*-------------------------------------------------------------*/
14 ff3adf60 2004-04-14 devnull /*--- Library top-level functions. ---*/
15 ff3adf60 2004-04-14 devnull /*--- bzlib.c ---*/
16 ff3adf60 2004-04-14 devnull /*-------------------------------------------------------------*/
17 ff3adf60 2004-04-14 devnull
18 ff3adf60 2004-04-14 devnull /*--
19 ff3adf60 2004-04-14 devnull This file is a part of bzip2 and/or libbzip2, a program and
20 ff3adf60 2004-04-14 devnull library for lossless, block-sorting data compression.
21 ff3adf60 2004-04-14 devnull
22 ff3adf60 2004-04-14 devnull Copyright (C) 1996-2000 Julian R Seward. All rights reserved.
23 ff3adf60 2004-04-14 devnull
24 ff3adf60 2004-04-14 devnull Redistribution and use in source and binary forms, with or without
25 ff3adf60 2004-04-14 devnull modification, are permitted provided that the following conditions
26 ff3adf60 2004-04-14 devnull are met:
27 ff3adf60 2004-04-14 devnull
28 ff3adf60 2004-04-14 devnull 1. Redistributions of source code must retain the above copyright
29 ff3adf60 2004-04-14 devnull notice, this list of conditions and the following disclaimer.
30 ff3adf60 2004-04-14 devnull
31 ff3adf60 2004-04-14 devnull 2. The origin of this software must not be misrepresented; you must
32 ff3adf60 2004-04-14 devnull not claim that you wrote the original software. If you use this
33 ff3adf60 2004-04-14 devnull software in a product, an acknowledgment in the product
34 ff3adf60 2004-04-14 devnull documentation would be appreciated but is not required.
35 ff3adf60 2004-04-14 devnull
36 ff3adf60 2004-04-14 devnull 3. Altered source versions must be plainly marked as such, and must
37 ff3adf60 2004-04-14 devnull not be misrepresented as being the original software.
38 ff3adf60 2004-04-14 devnull
39 ff3adf60 2004-04-14 devnull 4. The name of the author may not be used to endorse or promote
40 ff3adf60 2004-04-14 devnull products derived from this software without specific prior written
41 ff3adf60 2004-04-14 devnull permission.
42 ff3adf60 2004-04-14 devnull
43 ff3adf60 2004-04-14 devnull THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
44 ff3adf60 2004-04-14 devnull OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
45 ff3adf60 2004-04-14 devnull WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
46 ff3adf60 2004-04-14 devnull ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
47 ff3adf60 2004-04-14 devnull DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
48 ff3adf60 2004-04-14 devnull DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
49 ff3adf60 2004-04-14 devnull GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
50 ff3adf60 2004-04-14 devnull INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
51 ff3adf60 2004-04-14 devnull WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
52 ff3adf60 2004-04-14 devnull NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
53 ff3adf60 2004-04-14 devnull SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
54 ff3adf60 2004-04-14 devnull
55 ff3adf60 2004-04-14 devnull Julian Seward, Cambridge, UK.
56 ff3adf60 2004-04-14 devnull jseward@acm.org
57 ff3adf60 2004-04-14 devnull bzip2/libbzip2 version 1.0 of 21 March 2000
58 ff3adf60 2004-04-14 devnull
59 ff3adf60 2004-04-14 devnull This program is based on (at least) the work of:
60 ff3adf60 2004-04-14 devnull Mike Burrows
61 ff3adf60 2004-04-14 devnull David Wheeler
62 ff3adf60 2004-04-14 devnull Peter Fenwick
63 ff3adf60 2004-04-14 devnull Alistair Moffat
64 ff3adf60 2004-04-14 devnull Radford Neal
65 ff3adf60 2004-04-14 devnull Ian H. Witten
66 ff3adf60 2004-04-14 devnull Robert Sedgewick
67 ff3adf60 2004-04-14 devnull Jon L. Bentley
68 ff3adf60 2004-04-14 devnull
69 ff3adf60 2004-04-14 devnull For more information on these sources, see the manual.
70 ff3adf60 2004-04-14 devnull --*/
71 ff3adf60 2004-04-14 devnull
72 ff3adf60 2004-04-14 devnull /*--
73 ff3adf60 2004-04-14 devnull CHANGES
74 ff3adf60 2004-04-14 devnull ~~~~~~~
75 ff3adf60 2004-04-14 devnull 0.9.0 -- original version.
76 ff3adf60 2004-04-14 devnull
77 ff3adf60 2004-04-14 devnull 0.9.0a/b -- no changes in this file.
78 ff3adf60 2004-04-14 devnull
79 ff3adf60 2004-04-14 devnull 0.9.0c
80 ff3adf60 2004-04-14 devnull * made zero-length BZ_FLUSH work correctly in bzCompress().
81 ff3adf60 2004-04-14 devnull * fixed bzWrite/bzRead to ignore zero-length requests.
82 ff3adf60 2004-04-14 devnull * fixed bzread to correctly handle read requests after EOF.
83 ff3adf60 2004-04-14 devnull * wrong parameter order in call to bzDecompressInit in
84 ff3adf60 2004-04-14 devnull bzBuffToBuffDecompress. Fixed.
85 ff3adf60 2004-04-14 devnull --*/
86 ff3adf60 2004-04-14 devnull
87 ff3adf60 2004-04-14 devnull #include "os.h"
88 ff3adf60 2004-04-14 devnull #include "bzlib.h"
89 ff3adf60 2004-04-14 devnull #include "bzlib_private.h"
90 ff3adf60 2004-04-14 devnull
91 ff3adf60 2004-04-14 devnull /*---------------------------------------------------*/
92 ff3adf60 2004-04-14 devnull /*--- Decompression stuff ---*/
93 ff3adf60 2004-04-14 devnull /*---------------------------------------------------*/
94 ff3adf60 2004-04-14 devnull
95 ff3adf60 2004-04-14 devnull /*---------------------------------------------------*/
96 ff3adf60 2004-04-14 devnull int BZ_API(BZ2_bzDecompressInit)
97 ff3adf60 2004-04-14 devnull ( bz_stream* strm,
98 ff3adf60 2004-04-14 devnull int verbosity,
99 ff3adf60 2004-04-14 devnull int small )
100 ff3adf60 2004-04-14 devnull {
101 ff3adf60 2004-04-14 devnull DState* s;
102 ff3adf60 2004-04-14 devnull
103 ff3adf60 2004-04-14 devnull if (!bz_config_ok()) return BZ_CONFIG_ERROR;
104 ff3adf60 2004-04-14 devnull
105 ff3adf60 2004-04-14 devnull if (strm == NULL) return BZ_PARAM_ERROR;
106 ff3adf60 2004-04-14 devnull if (small != 0 && small != 1) return BZ_PARAM_ERROR;
107 ff3adf60 2004-04-14 devnull if (verbosity < 0 || verbosity > 4) return BZ_PARAM_ERROR;
108 ff3adf60 2004-04-14 devnull
109 ff3adf60 2004-04-14 devnull if (strm->bzalloc == NULL) strm->bzalloc = default_bzalloc;
110 ff3adf60 2004-04-14 devnull if (strm->bzfree == NULL) strm->bzfree = default_bzfree;
111 ff3adf60 2004-04-14 devnull
112 ff3adf60 2004-04-14 devnull s = BZALLOC( sizeof(DState) );
113 ff3adf60 2004-04-14 devnull if (s == NULL) return BZ_MEM_ERROR;
114 ff3adf60 2004-04-14 devnull s->strm = strm;
115 ff3adf60 2004-04-14 devnull strm->state = s;
116 ff3adf60 2004-04-14 devnull s->state = BZ_X_MAGIC_1;
117 ff3adf60 2004-04-14 devnull s->bsLive = 0;
118 ff3adf60 2004-04-14 devnull s->bsBuff = 0;
119 ff3adf60 2004-04-14 devnull s->calculatedCombinedCRC = 0;
120 ff3adf60 2004-04-14 devnull strm->total_in_lo32 = 0;
121 ff3adf60 2004-04-14 devnull strm->total_in_hi32 = 0;
122 ff3adf60 2004-04-14 devnull strm->total_out_lo32 = 0;
123 ff3adf60 2004-04-14 devnull strm->total_out_hi32 = 0;
124 ff3adf60 2004-04-14 devnull s->smallDecompress = (Bool)small;
125 ff3adf60 2004-04-14 devnull s->ll4 = NULL;
126 ff3adf60 2004-04-14 devnull s->ll16 = NULL;
127 ff3adf60 2004-04-14 devnull s->tt = NULL;
128 ff3adf60 2004-04-14 devnull s->currBlockNo = 0;
129 ff3adf60 2004-04-14 devnull s->verbosity = verbosity;
130 ff3adf60 2004-04-14 devnull
131 ff3adf60 2004-04-14 devnull return BZ_OK;
132 ff3adf60 2004-04-14 devnull }
133 ff3adf60 2004-04-14 devnull
134 ff3adf60 2004-04-14 devnull
135 ff3adf60 2004-04-14 devnull /*---------------------------------------------------*/
136 ff3adf60 2004-04-14 devnull static
137 ff3adf60 2004-04-14 devnull void unRLE_obuf_to_output_FAST ( DState* s )
138 ff3adf60 2004-04-14 devnull {
139 ff3adf60 2004-04-14 devnull UChar k1;
140 ff3adf60 2004-04-14 devnull
141 ff3adf60 2004-04-14 devnull if (s->blockRandomised) {
142 ff3adf60 2004-04-14 devnull
143 ff3adf60 2004-04-14 devnull while (True) {
144 ff3adf60 2004-04-14 devnull /* try to finish existing run */
145 ff3adf60 2004-04-14 devnull while (True) {
146 ff3adf60 2004-04-14 devnull if (s->strm->avail_out == 0) return;
147 ff3adf60 2004-04-14 devnull if (s->state_out_len == 0) break;
148 ff3adf60 2004-04-14 devnull *( (UChar*)(s->strm->next_out) ) = s->state_out_ch;
149 ff3adf60 2004-04-14 devnull BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch );
150 ff3adf60 2004-04-14 devnull s->state_out_len--;
151 ff3adf60 2004-04-14 devnull s->strm->next_out++;
152 ff3adf60 2004-04-14 devnull s->strm->avail_out--;
153 ff3adf60 2004-04-14 devnull s->strm->total_out_lo32++;
154 ff3adf60 2004-04-14 devnull if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++;
155 ff3adf60 2004-04-14 devnull }
156 ff3adf60 2004-04-14 devnull
157 ff3adf60 2004-04-14 devnull /* can a new run be started? */
158 ff3adf60 2004-04-14 devnull if (s->nblock_used == s->save_nblock+1) return;
159 ff3adf60 2004-04-14 devnull
160 ff3adf60 2004-04-14 devnull
161 ff3adf60 2004-04-14 devnull s->state_out_len = 1;
162 ff3adf60 2004-04-14 devnull s->state_out_ch = s->k0;
163 ff3adf60 2004-04-14 devnull BZ_GET_FAST(k1); BZ_RAND_UPD_MASK;
164 ff3adf60 2004-04-14 devnull k1 ^= BZ_RAND_MASK; s->nblock_used++;
165 ff3adf60 2004-04-14 devnull if (s->nblock_used == s->save_nblock+1) continue;
166 ff3adf60 2004-04-14 devnull if (k1 != s->k0) { s->k0 = k1; continue; };
167 ff3adf60 2004-04-14 devnull
168 ff3adf60 2004-04-14 devnull s->state_out_len = 2;
169 ff3adf60 2004-04-14 devnull BZ_GET_FAST(k1); BZ_RAND_UPD_MASK;
170 ff3adf60 2004-04-14 devnull k1 ^= BZ_RAND_MASK; s->nblock_used++;
171 ff3adf60 2004-04-14 devnull if (s->nblock_used == s->save_nblock+1) continue;
172 ff3adf60 2004-04-14 devnull if (k1 != s->k0) { s->k0 = k1; continue; };
173 ff3adf60 2004-04-14 devnull
174 ff3adf60 2004-04-14 devnull s->state_out_len = 3;
175 ff3adf60 2004-04-14 devnull BZ_GET_FAST(k1); BZ_RAND_UPD_MASK;
176 ff3adf60 2004-04-14 devnull k1 ^= BZ_RAND_MASK; s->nblock_used++;
177 ff3adf60 2004-04-14 devnull if (s->nblock_used == s->save_nblock+1) continue;
178 ff3adf60 2004-04-14 devnull if (k1 != s->k0) { s->k0 = k1; continue; };
179 ff3adf60 2004-04-14 devnull
180 ff3adf60 2004-04-14 devnull BZ_GET_FAST(k1); BZ_RAND_UPD_MASK;
181 ff3adf60 2004-04-14 devnull k1 ^= BZ_RAND_MASK; s->nblock_used++;
182 ff3adf60 2004-04-14 devnull s->state_out_len = ((Int32)k1) + 4;
183 ff3adf60 2004-04-14 devnull BZ_GET_FAST(s->k0); BZ_RAND_UPD_MASK;
184 ff3adf60 2004-04-14 devnull s->k0 ^= BZ_RAND_MASK; s->nblock_used++;
185 ff3adf60 2004-04-14 devnull }
186 ff3adf60 2004-04-14 devnull
187 ff3adf60 2004-04-14 devnull } else {
188 ff3adf60 2004-04-14 devnull
189 ff3adf60 2004-04-14 devnull /* restore */
190 ff3adf60 2004-04-14 devnull UInt32 c_calculatedBlockCRC = s->calculatedBlockCRC;
191 ff3adf60 2004-04-14 devnull UChar c_state_out_ch = s->state_out_ch;
192 ff3adf60 2004-04-14 devnull Int32 c_state_out_len = s->state_out_len;
193 ff3adf60 2004-04-14 devnull Int32 c_nblock_used = s->nblock_used;
194 ff3adf60 2004-04-14 devnull Int32 c_k0 = s->k0;
195 ff3adf60 2004-04-14 devnull UInt32* c_tt = s->tt;
196 ff3adf60 2004-04-14 devnull UInt32 c_tPos = s->tPos;
197 ff3adf60 2004-04-14 devnull char* cs_next_out = s->strm->next_out;
198 ff3adf60 2004-04-14 devnull unsigned int cs_avail_out = s->strm->avail_out;
199 ff3adf60 2004-04-14 devnull /* end restore */
200 ff3adf60 2004-04-14 devnull
201 ff3adf60 2004-04-14 devnull UInt32 avail_out_INIT = cs_avail_out;
202 ff3adf60 2004-04-14 devnull Int32 s_save_nblockPP = s->save_nblock+1;
203 ff3adf60 2004-04-14 devnull unsigned int total_out_lo32_old;
204 ff3adf60 2004-04-14 devnull
205 ff3adf60 2004-04-14 devnull while (True) {
206 ff3adf60 2004-04-14 devnull
207 ff3adf60 2004-04-14 devnull /* try to finish existing run */
208 ff3adf60 2004-04-14 devnull if (c_state_out_len > 0) {
209 ff3adf60 2004-04-14 devnull while (True) {
210 ff3adf60 2004-04-14 devnull if (cs_avail_out == 0) goto return_notr;
211 ff3adf60 2004-04-14 devnull if (c_state_out_len == 1) break;
212 ff3adf60 2004-04-14 devnull *( (UChar*)(cs_next_out) ) = c_state_out_ch;
213 ff3adf60 2004-04-14 devnull BZ_UPDATE_CRC ( c_calculatedBlockCRC, c_state_out_ch );
214 ff3adf60 2004-04-14 devnull c_state_out_len--;
215 ff3adf60 2004-04-14 devnull cs_next_out++;
216 ff3adf60 2004-04-14 devnull cs_avail_out--;
217 ff3adf60 2004-04-14 devnull }
218 ff3adf60 2004-04-14 devnull s_state_out_len_eq_one:
219 ff3adf60 2004-04-14 devnull {
220 ff3adf60 2004-04-14 devnull if (cs_avail_out == 0) {
221 ff3adf60 2004-04-14 devnull c_state_out_len = 1; goto return_notr;
222 ff3adf60 2004-04-14 devnull };
223 ff3adf60 2004-04-14 devnull *( (UChar*)(cs_next_out) ) = c_state_out_ch;
224 ff3adf60 2004-04-14 devnull BZ_UPDATE_CRC ( c_calculatedBlockCRC, c_state_out_ch );
225 ff3adf60 2004-04-14 devnull cs_next_out++;
226 ff3adf60 2004-04-14 devnull cs_avail_out--;
227 ff3adf60 2004-04-14 devnull }
228 ff3adf60 2004-04-14 devnull }
229 ff3adf60 2004-04-14 devnull /* can a new run be started? */
230 ff3adf60 2004-04-14 devnull if (c_nblock_used == s_save_nblockPP) {
231 ff3adf60 2004-04-14 devnull c_state_out_len = 0; goto return_notr;
232 ff3adf60 2004-04-14 devnull };
233 ff3adf60 2004-04-14 devnull c_state_out_ch = c_k0;
234 ff3adf60 2004-04-14 devnull BZ_GET_FAST_C(k1); c_nblock_used++;
235 ff3adf60 2004-04-14 devnull if (k1 != c_k0) {
236 ff3adf60 2004-04-14 devnull c_k0 = k1; goto s_state_out_len_eq_one;
237 ff3adf60 2004-04-14 devnull };
238 ff3adf60 2004-04-14 devnull if (c_nblock_used == s_save_nblockPP)
239 ff3adf60 2004-04-14 devnull goto s_state_out_len_eq_one;
240 ff3adf60 2004-04-14 devnull
241 ff3adf60 2004-04-14 devnull c_state_out_len = 2;
242 ff3adf60 2004-04-14 devnull BZ_GET_FAST_C(k1); c_nblock_used++;
243 ff3adf60 2004-04-14 devnull if (c_nblock_used == s_save_nblockPP) continue;
244 ff3adf60 2004-04-14 devnull if (k1 != c_k0) { c_k0 = k1; continue; };
245 ff3adf60 2004-04-14 devnull
246 ff3adf60 2004-04-14 devnull c_state_out_len = 3;
247 ff3adf60 2004-04-14 devnull BZ_GET_FAST_C(k1); c_nblock_used++;
248 ff3adf60 2004-04-14 devnull if (c_nblock_used == s_save_nblockPP) continue;
249 ff3adf60 2004-04-14 devnull if (k1 != c_k0) { c_k0 = k1; continue; };
250 ff3adf60 2004-04-14 devnull
251 ff3adf60 2004-04-14 devnull BZ_GET_FAST_C(k1); c_nblock_used++;
252 ff3adf60 2004-04-14 devnull c_state_out_len = ((Int32)k1) + 4;
253 ff3adf60 2004-04-14 devnull BZ_GET_FAST_C(c_k0); c_nblock_used++;
254 ff3adf60 2004-04-14 devnull }
255 ff3adf60 2004-04-14 devnull
256 ff3adf60 2004-04-14 devnull return_notr:
257 ff3adf60 2004-04-14 devnull total_out_lo32_old = s->strm->total_out_lo32;
258 ff3adf60 2004-04-14 devnull s->strm->total_out_lo32 += (avail_out_INIT - cs_avail_out);
259 ff3adf60 2004-04-14 devnull if (s->strm->total_out_lo32 < total_out_lo32_old)
260 ff3adf60 2004-04-14 devnull s->strm->total_out_hi32++;
261 ff3adf60 2004-04-14 devnull
262 ff3adf60 2004-04-14 devnull /* save */
263 ff3adf60 2004-04-14 devnull s->calculatedBlockCRC = c_calculatedBlockCRC;
264 ff3adf60 2004-04-14 devnull s->state_out_ch = c_state_out_ch;
265 ff3adf60 2004-04-14 devnull s->state_out_len = c_state_out_len;
266 ff3adf60 2004-04-14 devnull s->nblock_used = c_nblock_used;
267 ff3adf60 2004-04-14 devnull s->k0 = c_k0;
268 ff3adf60 2004-04-14 devnull s->tt = c_tt;
269 ff3adf60 2004-04-14 devnull s->tPos = c_tPos;
270 ff3adf60 2004-04-14 devnull s->strm->next_out = cs_next_out;
271 ff3adf60 2004-04-14 devnull s->strm->avail_out = cs_avail_out;
272 ff3adf60 2004-04-14 devnull /* end save */
273 ff3adf60 2004-04-14 devnull }
274 ff3adf60 2004-04-14 devnull }
275 ff3adf60 2004-04-14 devnull
276 ff3adf60 2004-04-14 devnull
277 ff3adf60 2004-04-14 devnull
278 ff3adf60 2004-04-14 devnull /*---------------------------------------------------*/
279 ff3adf60 2004-04-14 devnull __inline__ Int32 BZ2_indexIntoF ( Int32 indx, Int32 *cftab )
280 ff3adf60 2004-04-14 devnull {
281 ff3adf60 2004-04-14 devnull Int32 nb, na, mid;
282 ff3adf60 2004-04-14 devnull nb = 0;
283 ff3adf60 2004-04-14 devnull na = 256;
284 ff3adf60 2004-04-14 devnull do {
285 ff3adf60 2004-04-14 devnull mid = (nb + na) >> 1;
286 ff3adf60 2004-04-14 devnull if (indx >= cftab[mid]) nb = mid; else na = mid;
287 ff3adf60 2004-04-14 devnull }
288 ff3adf60 2004-04-14 devnull while (na - nb != 1);
289 ff3adf60 2004-04-14 devnull return nb;
290 ff3adf60 2004-04-14 devnull }
291 ff3adf60 2004-04-14 devnull
292 ff3adf60 2004-04-14 devnull
293 ff3adf60 2004-04-14 devnull /*---------------------------------------------------*/
294 ff3adf60 2004-04-14 devnull static
295 ff3adf60 2004-04-14 devnull void unRLE_obuf_to_output_SMALL ( DState* s )
296 ff3adf60 2004-04-14 devnull {
297 ff3adf60 2004-04-14 devnull UChar k1;
298 ff3adf60 2004-04-14 devnull
299 ff3adf60 2004-04-14 devnull if (s->blockRandomised) {
300 ff3adf60 2004-04-14 devnull
301 ff3adf60 2004-04-14 devnull while (True) {
302 ff3adf60 2004-04-14 devnull /* try to finish existing run */
303 ff3adf60 2004-04-14 devnull while (True) {
304 ff3adf60 2004-04-14 devnull if (s->strm->avail_out == 0) return;
305 ff3adf60 2004-04-14 devnull if (s->state_out_len == 0) break;
306 ff3adf60 2004-04-14 devnull *( (UChar*)(s->strm->next_out) ) = s->state_out_ch;
307 ff3adf60 2004-04-14 devnull BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch );
308 ff3adf60 2004-04-14 devnull s->state_out_len--;
309 ff3adf60 2004-04-14 devnull s->strm->next_out++;
310 ff3adf60 2004-04-14 devnull s->strm->avail_out--;
311 ff3adf60 2004-04-14 devnull s->strm->total_out_lo32++;
312 ff3adf60 2004-04-14 devnull if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++;
313 ff3adf60 2004-04-14 devnull }
314 ff3adf60 2004-04-14 devnull
315 ff3adf60 2004-04-14 devnull /* can a new run be started? */
316 ff3adf60 2004-04-14 devnull if (s->nblock_used == s->save_nblock+1) return;
317 ff3adf60 2004-04-14 devnull
318 ff3adf60 2004-04-14 devnull
319 ff3adf60 2004-04-14 devnull s->state_out_len = 1;
320 ff3adf60 2004-04-14 devnull s->state_out_ch = s->k0;
321 ff3adf60 2004-04-14 devnull BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK;
322 ff3adf60 2004-04-14 devnull k1 ^= BZ_RAND_MASK; s->nblock_used++;
323 ff3adf60 2004-04-14 devnull if (s->nblock_used == s->save_nblock+1) continue;
324 ff3adf60 2004-04-14 devnull if (k1 != s->k0) { s->k0 = k1; continue; };
325 ff3adf60 2004-04-14 devnull
326 ff3adf60 2004-04-14 devnull s->state_out_len = 2;
327 ff3adf60 2004-04-14 devnull BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK;
328 ff3adf60 2004-04-14 devnull k1 ^= BZ_RAND_MASK; s->nblock_used++;
329 ff3adf60 2004-04-14 devnull if (s->nblock_used == s->save_nblock+1) continue;
330 ff3adf60 2004-04-14 devnull if (k1 != s->k0) { s->k0 = k1; continue; };
331 ff3adf60 2004-04-14 devnull
332 ff3adf60 2004-04-14 devnull s->state_out_len = 3;
333 ff3adf60 2004-04-14 devnull BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK;
334 ff3adf60 2004-04-14 devnull k1 ^= BZ_RAND_MASK; s->nblock_used++;
335 ff3adf60 2004-04-14 devnull if (s->nblock_used == s->save_nblock+1) continue;
336 ff3adf60 2004-04-14 devnull if (k1 != s->k0) { s->k0 = k1; continue; };
337 ff3adf60 2004-04-14 devnull
338 ff3adf60 2004-04-14 devnull BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK;
339 ff3adf60 2004-04-14 devnull k1 ^= BZ_RAND_MASK; s->nblock_used++;
340 ff3adf60 2004-04-14 devnull s->state_out_len = ((Int32)k1) + 4;
341 ff3adf60 2004-04-14 devnull BZ_GET_SMALL(s->k0); BZ_RAND_UPD_MASK;
342 ff3adf60 2004-04-14 devnull s->k0 ^= BZ_RAND_MASK; s->nblock_used++;
343 ff3adf60 2004-04-14 devnull }
344 ff3adf60 2004-04-14 devnull
345 ff3adf60 2004-04-14 devnull } else {
346 ff3adf60 2004-04-14 devnull
347 ff3adf60 2004-04-14 devnull while (True) {
348 ff3adf60 2004-04-14 devnull /* try to finish existing run */
349 ff3adf60 2004-04-14 devnull while (True) {
350 ff3adf60 2004-04-14 devnull if (s->strm->avail_out == 0) return;
351 ff3adf60 2004-04-14 devnull if (s->state_out_len == 0) break;
352 ff3adf60 2004-04-14 devnull *( (UChar*)(s->strm->next_out) ) = s->state_out_ch;
353 ff3adf60 2004-04-14 devnull BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch );
354 ff3adf60 2004-04-14 devnull s->state_out_len--;
355 ff3adf60 2004-04-14 devnull s->strm->next_out++;
356 ff3adf60 2004-04-14 devnull s->strm->avail_out--;
357 ff3adf60 2004-04-14 devnull s->strm->total_out_lo32++;
358 ff3adf60 2004-04-14 devnull if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++;
359 ff3adf60 2004-04-14 devnull }
360 ff3adf60 2004-04-14 devnull
361 ff3adf60 2004-04-14 devnull /* can a new run be started? */
362 ff3adf60 2004-04-14 devnull if (s->nblock_used == s->save_nblock+1) return;
363 ff3adf60 2004-04-14 devnull
364 ff3adf60 2004-04-14 devnull s->state_out_len = 1;
365 ff3adf60 2004-04-14 devnull s->state_out_ch = s->k0;
366 ff3adf60 2004-04-14 devnull BZ_GET_SMALL(k1); s->nblock_used++;
367 ff3adf60 2004-04-14 devnull if (s->nblock_used == s->save_nblock+1) continue;
368 ff3adf60 2004-04-14 devnull if (k1 != s->k0) { s->k0 = k1; continue; };
369 ff3adf60 2004-04-14 devnull
370 ff3adf60 2004-04-14 devnull s->state_out_len = 2;
371 ff3adf60 2004-04-14 devnull BZ_GET_SMALL(k1); s->nblock_used++;
372 ff3adf60 2004-04-14 devnull if (s->nblock_used == s->save_nblock+1) continue;
373 ff3adf60 2004-04-14 devnull if (k1 != s->k0) { s->k0 = k1; continue; };
374 ff3adf60 2004-04-14 devnull
375 ff3adf60 2004-04-14 devnull s->state_out_len = 3;
376 ff3adf60 2004-04-14 devnull BZ_GET_SMALL(k1); s->nblock_used++;
377 ff3adf60 2004-04-14 devnull if (s->nblock_used == s->save_nblock+1) continue;
378 ff3adf60 2004-04-14 devnull if (k1 != s->k0) { s->k0 = k1; continue; };
379 ff3adf60 2004-04-14 devnull
380 ff3adf60 2004-04-14 devnull BZ_GET_SMALL(k1); s->nblock_used++;
381 ff3adf60 2004-04-14 devnull s->state_out_len = ((Int32)k1) + 4;
382 ff3adf60 2004-04-14 devnull BZ_GET_SMALL(s->k0); s->nblock_used++;
383 ff3adf60 2004-04-14 devnull }
384 ff3adf60 2004-04-14 devnull
385 ff3adf60 2004-04-14 devnull }
386 ff3adf60 2004-04-14 devnull }
387 ff3adf60 2004-04-14 devnull
388 ff3adf60 2004-04-14 devnull
389 ff3adf60 2004-04-14 devnull /*---------------------------------------------------*/
390 ff3adf60 2004-04-14 devnull int BZ_API(BZ2_bzDecompress) ( bz_stream *strm )
391 ff3adf60 2004-04-14 devnull {
392 ff3adf60 2004-04-14 devnull DState* s;
393 ff3adf60 2004-04-14 devnull if (strm == NULL) return BZ_PARAM_ERROR;
394 ff3adf60 2004-04-14 devnull s = strm->state;
395 ff3adf60 2004-04-14 devnull if (s == NULL) return BZ_PARAM_ERROR;
396 ff3adf60 2004-04-14 devnull if (s->strm != strm) return BZ_PARAM_ERROR;
397 ff3adf60 2004-04-14 devnull
398 ff3adf60 2004-04-14 devnull while (True) {
399 ff3adf60 2004-04-14 devnull if (s->state == BZ_X_IDLE) return BZ_SEQUENCE_ERROR;
400 ff3adf60 2004-04-14 devnull if (s->state == BZ_X_OUTPUT) {
401 ff3adf60 2004-04-14 devnull if (s->smallDecompress)
402 ff3adf60 2004-04-14 devnull unRLE_obuf_to_output_SMALL ( s ); else
403 ff3adf60 2004-04-14 devnull unRLE_obuf_to_output_FAST ( s );
404 ff3adf60 2004-04-14 devnull if (s->nblock_used == s->save_nblock+1 && s->state_out_len == 0) {
405 ff3adf60 2004-04-14 devnull BZ_FINALISE_CRC ( s->calculatedBlockCRC );
406 ff3adf60 2004-04-14 devnull if (s->verbosity >= 3)
407 ff3adf60 2004-04-14 devnull VPrintf2 ( " {0x%x, 0x%x}", s->storedBlockCRC,
408 ff3adf60 2004-04-14 devnull s->calculatedBlockCRC );
409 ff3adf60 2004-04-14 devnull if (s->verbosity >= 2) VPrintf0 ( "]" );
410 ff3adf60 2004-04-14 devnull if (s->calculatedBlockCRC != s->storedBlockCRC)
411 ff3adf60 2004-04-14 devnull return BZ_DATA_ERROR;
412 ff3adf60 2004-04-14 devnull s->calculatedCombinedCRC
413 ff3adf60 2004-04-14 devnull = (s->calculatedCombinedCRC << 1) |
414 ff3adf60 2004-04-14 devnull (s->calculatedCombinedCRC >> 31);
415 ff3adf60 2004-04-14 devnull s->calculatedCombinedCRC ^= s->calculatedBlockCRC;
416 ff3adf60 2004-04-14 devnull s->state = BZ_X_BLKHDR_1;
417 ff3adf60 2004-04-14 devnull } else {
418 ff3adf60 2004-04-14 devnull return BZ_OK;
419 ff3adf60 2004-04-14 devnull }
420 ff3adf60 2004-04-14 devnull }
421 ff3adf60 2004-04-14 devnull if (s->state >= BZ_X_MAGIC_1) {
422 ff3adf60 2004-04-14 devnull Int32 r = BZ2_decompress ( s );
423 ff3adf60 2004-04-14 devnull if (r == BZ_STREAM_END) {
424 ff3adf60 2004-04-14 devnull if (s->verbosity >= 3)
425 ff3adf60 2004-04-14 devnull VPrintf2 ( "\n combined CRCs: stored = 0x%x, computed = 0x%x",
426 ff3adf60 2004-04-14 devnull s->storedCombinedCRC, s->calculatedCombinedCRC );
427 ff3adf60 2004-04-14 devnull if (s->calculatedCombinedCRC != s->storedCombinedCRC)
428 ff3adf60 2004-04-14 devnull return BZ_DATA_ERROR;
429 ff3adf60 2004-04-14 devnull return r;
430 ff3adf60 2004-04-14 devnull }
431 ff3adf60 2004-04-14 devnull if (s->state != BZ_X_OUTPUT) return r;
432 ff3adf60 2004-04-14 devnull }
433 ff3adf60 2004-04-14 devnull }
434 ff3adf60 2004-04-14 devnull
435 d7925b13 2005-01-14 devnull /*
436 ff3adf60 2004-04-14 devnull AssertH ( 0, 6001 );
437 ff3adf60 2004-04-14 devnull
438 d7925b13 2005-01-14 devnull return 0;
439 d7925b13 2005-01-14 devnull */
440 ff3adf60 2004-04-14 devnull }
441 ff3adf60 2004-04-14 devnull
442 ff3adf60 2004-04-14 devnull
443 ff3adf60 2004-04-14 devnull /*---------------------------------------------------*/
444 ff3adf60 2004-04-14 devnull int BZ_API(BZ2_bzDecompressEnd) ( bz_stream *strm )
445 ff3adf60 2004-04-14 devnull {
446 ff3adf60 2004-04-14 devnull DState* s;
447 ff3adf60 2004-04-14 devnull if (strm == NULL) return BZ_PARAM_ERROR;
448 ff3adf60 2004-04-14 devnull s = strm->state;
449 ff3adf60 2004-04-14 devnull if (s == NULL) return BZ_PARAM_ERROR;
450 ff3adf60 2004-04-14 devnull if (s->strm != strm) return BZ_PARAM_ERROR;
451 ff3adf60 2004-04-14 devnull
452 ff3adf60 2004-04-14 devnull if (s->tt != NULL) BZFREE(s->tt);
453 ff3adf60 2004-04-14 devnull if (s->ll16 != NULL) BZFREE(s->ll16);
454 ff3adf60 2004-04-14 devnull if (s->ll4 != NULL) BZFREE(s->ll4);
455 ff3adf60 2004-04-14 devnull
456 ff3adf60 2004-04-14 devnull BZFREE(strm->state);
457 ff3adf60 2004-04-14 devnull strm->state = NULL;
458 ff3adf60 2004-04-14 devnull
459 ff3adf60 2004-04-14 devnull return BZ_OK;
460 ff3adf60 2004-04-14 devnull }
461 ff3adf60 2004-04-14 devnull