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 /*--- Compression 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 static
97 ff3adf60 2004-04-14 devnull void prepare_new_block ( EState* s )
98 ff3adf60 2004-04-14 devnull {
99 ff3adf60 2004-04-14 devnull Int32 i;
100 ff3adf60 2004-04-14 devnull s->nblock = 0;
101 ff3adf60 2004-04-14 devnull s->numZ = 0;
102 ff3adf60 2004-04-14 devnull s->state_out_pos = 0;
103 ff3adf60 2004-04-14 devnull BZ_INITIALISE_CRC ( s->blockCRC );
104 ff3adf60 2004-04-14 devnull for (i = 0; i < 256; i++) s->inUse[i] = False;
105 ff3adf60 2004-04-14 devnull s->blockNo++;
106 ff3adf60 2004-04-14 devnull }
107 ff3adf60 2004-04-14 devnull
108 ff3adf60 2004-04-14 devnull
109 ff3adf60 2004-04-14 devnull /*---------------------------------------------------*/
110 ff3adf60 2004-04-14 devnull static
111 ff3adf60 2004-04-14 devnull void init_RL ( EState* s )
112 ff3adf60 2004-04-14 devnull {
113 ff3adf60 2004-04-14 devnull s->state_in_ch = 256;
114 ff3adf60 2004-04-14 devnull s->state_in_len = 0;
115 ff3adf60 2004-04-14 devnull }
116 ff3adf60 2004-04-14 devnull
117 ff3adf60 2004-04-14 devnull
118 ff3adf60 2004-04-14 devnull static
119 ff3adf60 2004-04-14 devnull Bool isempty_RL ( EState* s )
120 ff3adf60 2004-04-14 devnull {
121 ff3adf60 2004-04-14 devnull if (s->state_in_ch < 256 && s->state_in_len > 0)
122 ff3adf60 2004-04-14 devnull return False; else
123 ff3adf60 2004-04-14 devnull return True;
124 ff3adf60 2004-04-14 devnull }
125 ff3adf60 2004-04-14 devnull
126 ff3adf60 2004-04-14 devnull
127 ff3adf60 2004-04-14 devnull /*---------------------------------------------------*/
128 ff3adf60 2004-04-14 devnull int BZ_API(BZ2_bzCompressInit)
129 ff3adf60 2004-04-14 devnull ( bz_stream* strm,
130 ff3adf60 2004-04-14 devnull int blockSize100k,
131 ff3adf60 2004-04-14 devnull int verbosity,
132 ff3adf60 2004-04-14 devnull int workFactor )
133 ff3adf60 2004-04-14 devnull {
134 ff3adf60 2004-04-14 devnull Int32 n;
135 ff3adf60 2004-04-14 devnull EState* s;
136 ff3adf60 2004-04-14 devnull
137 ff3adf60 2004-04-14 devnull if (!bz_config_ok()) return BZ_CONFIG_ERROR;
138 ff3adf60 2004-04-14 devnull
139 ff3adf60 2004-04-14 devnull if (strm == NULL ||
140 ff3adf60 2004-04-14 devnull blockSize100k < 1 || blockSize100k > 9 ||
141 ff3adf60 2004-04-14 devnull workFactor < 0 || workFactor > 250)
142 ff3adf60 2004-04-14 devnull return BZ_PARAM_ERROR;
143 ff3adf60 2004-04-14 devnull
144 ff3adf60 2004-04-14 devnull if (workFactor == 0) workFactor = 30;
145 ff3adf60 2004-04-14 devnull if (strm->bzalloc == NULL) strm->bzalloc = default_bzalloc;
146 ff3adf60 2004-04-14 devnull if (strm->bzfree == NULL) strm->bzfree = default_bzfree;
147 ff3adf60 2004-04-14 devnull
148 ff3adf60 2004-04-14 devnull s = BZALLOC( sizeof(EState) );
149 ff3adf60 2004-04-14 devnull if (s == NULL) return BZ_MEM_ERROR;
150 ff3adf60 2004-04-14 devnull s->strm = strm;
151 ff3adf60 2004-04-14 devnull
152 ff3adf60 2004-04-14 devnull s->arr1 = NULL;
153 ff3adf60 2004-04-14 devnull s->arr2 = NULL;
154 ff3adf60 2004-04-14 devnull s->ftab = NULL;
155 ff3adf60 2004-04-14 devnull
156 ff3adf60 2004-04-14 devnull n = 100000 * blockSize100k;
157 ff3adf60 2004-04-14 devnull s->arr1 = BZALLOC( n * sizeof(UInt32) );
158 ff3adf60 2004-04-14 devnull s->arr2 = BZALLOC( (n+BZ_N_OVERSHOOT) * sizeof(UInt32) );
159 ff3adf60 2004-04-14 devnull s->ftab = BZALLOC( 65537 * sizeof(UInt32) );
160 ff3adf60 2004-04-14 devnull
161 ff3adf60 2004-04-14 devnull if (s->arr1 == NULL || s->arr2 == NULL || s->ftab == NULL) {
162 ff3adf60 2004-04-14 devnull if (s->arr1 != NULL) BZFREE(s->arr1);
163 ff3adf60 2004-04-14 devnull if (s->arr2 != NULL) BZFREE(s->arr2);
164 ff3adf60 2004-04-14 devnull if (s->ftab != NULL) BZFREE(s->ftab);
165 ff3adf60 2004-04-14 devnull if (s != NULL) BZFREE(s);
166 ff3adf60 2004-04-14 devnull return BZ_MEM_ERROR;
167 ff3adf60 2004-04-14 devnull }
168 ff3adf60 2004-04-14 devnull
169 ff3adf60 2004-04-14 devnull s->blockNo = 0;
170 ff3adf60 2004-04-14 devnull s->state = BZ_S_INPUT;
171 ff3adf60 2004-04-14 devnull s->mode = BZ_M_RUNNING;
172 ff3adf60 2004-04-14 devnull s->combinedCRC = 0;
173 ff3adf60 2004-04-14 devnull s->blockSize100k = blockSize100k;
174 ff3adf60 2004-04-14 devnull s->nblockMAX = 100000 * blockSize100k - 19;
175 ff3adf60 2004-04-14 devnull s->verbosity = verbosity;
176 ff3adf60 2004-04-14 devnull s->workFactor = workFactor;
177 ff3adf60 2004-04-14 devnull
178 ff3adf60 2004-04-14 devnull s->block = (UChar*)s->arr2;
179 ff3adf60 2004-04-14 devnull s->mtfv = (UInt16*)s->arr1;
180 ff3adf60 2004-04-14 devnull s->zbits = NULL;
181 ff3adf60 2004-04-14 devnull s->ptr = (UInt32*)s->arr1;
182 ff3adf60 2004-04-14 devnull
183 ff3adf60 2004-04-14 devnull strm->state = s;
184 ff3adf60 2004-04-14 devnull strm->total_in_lo32 = 0;
185 ff3adf60 2004-04-14 devnull strm->total_in_hi32 = 0;
186 ff3adf60 2004-04-14 devnull strm->total_out_lo32 = 0;
187 ff3adf60 2004-04-14 devnull strm->total_out_hi32 = 0;
188 ff3adf60 2004-04-14 devnull init_RL ( s );
189 ff3adf60 2004-04-14 devnull prepare_new_block ( s );
190 ff3adf60 2004-04-14 devnull return BZ_OK;
191 ff3adf60 2004-04-14 devnull }
192 ff3adf60 2004-04-14 devnull
193 ff3adf60 2004-04-14 devnull
194 ff3adf60 2004-04-14 devnull /*---------------------------------------------------*/
195 ff3adf60 2004-04-14 devnull static
196 ff3adf60 2004-04-14 devnull void add_pair_to_block ( EState* s )
197 ff3adf60 2004-04-14 devnull {
198 ff3adf60 2004-04-14 devnull Int32 i;
199 ff3adf60 2004-04-14 devnull UChar ch = (UChar)(s->state_in_ch);
200 ff3adf60 2004-04-14 devnull for (i = 0; i < s->state_in_len; i++) {
201 ff3adf60 2004-04-14 devnull BZ_UPDATE_CRC( s->blockCRC, ch );
202 ff3adf60 2004-04-14 devnull }
203 ff3adf60 2004-04-14 devnull s->inUse[s->state_in_ch] = True;
204 ff3adf60 2004-04-14 devnull switch (s->state_in_len) {
205 ff3adf60 2004-04-14 devnull case 1:
206 ff3adf60 2004-04-14 devnull s->block[s->nblock] = (UChar)ch; s->nblock++;
207 ff3adf60 2004-04-14 devnull break;
208 ff3adf60 2004-04-14 devnull case 2:
209 ff3adf60 2004-04-14 devnull s->block[s->nblock] = (UChar)ch; s->nblock++;
210 ff3adf60 2004-04-14 devnull s->block[s->nblock] = (UChar)ch; s->nblock++;
211 ff3adf60 2004-04-14 devnull break;
212 ff3adf60 2004-04-14 devnull case 3:
213 ff3adf60 2004-04-14 devnull s->block[s->nblock] = (UChar)ch; s->nblock++;
214 ff3adf60 2004-04-14 devnull s->block[s->nblock] = (UChar)ch; s->nblock++;
215 ff3adf60 2004-04-14 devnull s->block[s->nblock] = (UChar)ch; s->nblock++;
216 ff3adf60 2004-04-14 devnull break;
217 ff3adf60 2004-04-14 devnull default:
218 ff3adf60 2004-04-14 devnull s->inUse[s->state_in_len-4] = True;
219 ff3adf60 2004-04-14 devnull s->block[s->nblock] = (UChar)ch; s->nblock++;
220 ff3adf60 2004-04-14 devnull s->block[s->nblock] = (UChar)ch; s->nblock++;
221 ff3adf60 2004-04-14 devnull s->block[s->nblock] = (UChar)ch; s->nblock++;
222 ff3adf60 2004-04-14 devnull s->block[s->nblock] = (UChar)ch; s->nblock++;
223 ff3adf60 2004-04-14 devnull s->block[s->nblock] = ((UChar)(s->state_in_len-4));
224 ff3adf60 2004-04-14 devnull s->nblock++;
225 ff3adf60 2004-04-14 devnull break;
226 ff3adf60 2004-04-14 devnull }
227 ff3adf60 2004-04-14 devnull }
228 ff3adf60 2004-04-14 devnull
229 ff3adf60 2004-04-14 devnull
230 ff3adf60 2004-04-14 devnull /*---------------------------------------------------*/
231 ff3adf60 2004-04-14 devnull static
232 ff3adf60 2004-04-14 devnull void flush_RL ( EState* s )
233 ff3adf60 2004-04-14 devnull {
234 ff3adf60 2004-04-14 devnull if (s->state_in_ch < 256) add_pair_to_block ( s );
235 ff3adf60 2004-04-14 devnull init_RL ( s );
236 ff3adf60 2004-04-14 devnull }
237 ff3adf60 2004-04-14 devnull
238 ff3adf60 2004-04-14 devnull
239 ff3adf60 2004-04-14 devnull /*---------------------------------------------------*/
240 ff3adf60 2004-04-14 devnull #define ADD_CHAR_TO_BLOCK(zs,zchh0) \
241 ff3adf60 2004-04-14 devnull { \
242 ff3adf60 2004-04-14 devnull UInt32 zchh = (UInt32)(zchh0); \
243 ff3adf60 2004-04-14 devnull /*-- fast track the common case --*/ \
244 ff3adf60 2004-04-14 devnull if (zchh != zs->state_in_ch && \
245 ff3adf60 2004-04-14 devnull zs->state_in_len == 1) { \
246 ff3adf60 2004-04-14 devnull UChar ch = (UChar)(zs->state_in_ch); \
247 ff3adf60 2004-04-14 devnull BZ_UPDATE_CRC( zs->blockCRC, ch ); \
248 ff3adf60 2004-04-14 devnull zs->inUse[zs->state_in_ch] = True; \
249 ff3adf60 2004-04-14 devnull zs->block[zs->nblock] = (UChar)ch; \
250 ff3adf60 2004-04-14 devnull zs->nblock++; \
251 ff3adf60 2004-04-14 devnull zs->state_in_ch = zchh; \
252 ff3adf60 2004-04-14 devnull } \
253 ff3adf60 2004-04-14 devnull else \
254 ff3adf60 2004-04-14 devnull /*-- general, uncommon cases --*/ \
255 ff3adf60 2004-04-14 devnull if (zchh != zs->state_in_ch || \
256 ff3adf60 2004-04-14 devnull zs->state_in_len == 255) { \
257 ff3adf60 2004-04-14 devnull if (zs->state_in_ch < 256) \
258 ff3adf60 2004-04-14 devnull add_pair_to_block ( zs ); \
259 ff3adf60 2004-04-14 devnull zs->state_in_ch = zchh; \
260 ff3adf60 2004-04-14 devnull zs->state_in_len = 1; \
261 ff3adf60 2004-04-14 devnull } else { \
262 ff3adf60 2004-04-14 devnull zs->state_in_len++; \
263 ff3adf60 2004-04-14 devnull } \
264 ff3adf60 2004-04-14 devnull }
265 ff3adf60 2004-04-14 devnull
266 ff3adf60 2004-04-14 devnull
267 ff3adf60 2004-04-14 devnull /*---------------------------------------------------*/
268 ff3adf60 2004-04-14 devnull static
269 ff3adf60 2004-04-14 devnull Bool copy_input_until_stop ( EState* s )
270 ff3adf60 2004-04-14 devnull {
271 ff3adf60 2004-04-14 devnull Bool progress_in = False;
272 ff3adf60 2004-04-14 devnull
273 ff3adf60 2004-04-14 devnull if (s->mode == BZ_M_RUNNING) {
274 ff3adf60 2004-04-14 devnull
275 ff3adf60 2004-04-14 devnull /*-- fast track the common case --*/
276 ff3adf60 2004-04-14 devnull while (True) {
277 ff3adf60 2004-04-14 devnull /*-- block full? --*/
278 ff3adf60 2004-04-14 devnull if (s->nblock >= s->nblockMAX) break;
279 ff3adf60 2004-04-14 devnull /*-- no input? --*/
280 ff3adf60 2004-04-14 devnull if (s->strm->avail_in == 0) break;
281 ff3adf60 2004-04-14 devnull progress_in = True;
282 ff3adf60 2004-04-14 devnull ADD_CHAR_TO_BLOCK ( s, (UInt32)(*((UChar*)(s->strm->next_in))) );
283 ff3adf60 2004-04-14 devnull s->strm->next_in++;
284 ff3adf60 2004-04-14 devnull s->strm->avail_in--;
285 ff3adf60 2004-04-14 devnull s->strm->total_in_lo32++;
286 ff3adf60 2004-04-14 devnull if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++;
287 ff3adf60 2004-04-14 devnull }
288 ff3adf60 2004-04-14 devnull
289 ff3adf60 2004-04-14 devnull } else {
290 ff3adf60 2004-04-14 devnull
291 ff3adf60 2004-04-14 devnull /*-- general, uncommon case --*/
292 ff3adf60 2004-04-14 devnull while (True) {
293 ff3adf60 2004-04-14 devnull /*-- block full? --*/
294 ff3adf60 2004-04-14 devnull if (s->nblock >= s->nblockMAX) break;
295 ff3adf60 2004-04-14 devnull /*-- no input? --*/
296 ff3adf60 2004-04-14 devnull if (s->strm->avail_in == 0) break;
297 ff3adf60 2004-04-14 devnull /*-- flush/finish end? --*/
298 ff3adf60 2004-04-14 devnull if (s->avail_in_expect == 0) break;
299 ff3adf60 2004-04-14 devnull progress_in = True;
300 ff3adf60 2004-04-14 devnull ADD_CHAR_TO_BLOCK ( s, (UInt32)(*((UChar*)(s->strm->next_in))) );
301 ff3adf60 2004-04-14 devnull s->strm->next_in++;
302 ff3adf60 2004-04-14 devnull s->strm->avail_in--;
303 ff3adf60 2004-04-14 devnull s->strm->total_in_lo32++;
304 ff3adf60 2004-04-14 devnull if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++;
305 ff3adf60 2004-04-14 devnull s->avail_in_expect--;
306 ff3adf60 2004-04-14 devnull }
307 ff3adf60 2004-04-14 devnull }
308 ff3adf60 2004-04-14 devnull return progress_in;
309 ff3adf60 2004-04-14 devnull }
310 ff3adf60 2004-04-14 devnull
311 ff3adf60 2004-04-14 devnull
312 ff3adf60 2004-04-14 devnull /*---------------------------------------------------*/
313 ff3adf60 2004-04-14 devnull static
314 ff3adf60 2004-04-14 devnull Bool copy_output_until_stop ( EState* s )
315 ff3adf60 2004-04-14 devnull {
316 ff3adf60 2004-04-14 devnull Bool progress_out = False;
317 ff3adf60 2004-04-14 devnull
318 ff3adf60 2004-04-14 devnull while (True) {
319 ff3adf60 2004-04-14 devnull
320 ff3adf60 2004-04-14 devnull /*-- no output space? --*/
321 ff3adf60 2004-04-14 devnull if (s->strm->avail_out == 0) break;
322 ff3adf60 2004-04-14 devnull
323 ff3adf60 2004-04-14 devnull /*-- block done? --*/
324 ff3adf60 2004-04-14 devnull if (s->state_out_pos >= s->numZ) break;
325 ff3adf60 2004-04-14 devnull
326 ff3adf60 2004-04-14 devnull progress_out = True;
327 ff3adf60 2004-04-14 devnull *(s->strm->next_out) = s->zbits[s->state_out_pos];
328 ff3adf60 2004-04-14 devnull s->state_out_pos++;
329 ff3adf60 2004-04-14 devnull s->strm->avail_out--;
330 ff3adf60 2004-04-14 devnull s->strm->next_out++;
331 ff3adf60 2004-04-14 devnull s->strm->total_out_lo32++;
332 ff3adf60 2004-04-14 devnull if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++;
333 ff3adf60 2004-04-14 devnull }
334 ff3adf60 2004-04-14 devnull
335 ff3adf60 2004-04-14 devnull return progress_out;
336 ff3adf60 2004-04-14 devnull }
337 ff3adf60 2004-04-14 devnull
338 ff3adf60 2004-04-14 devnull
339 ff3adf60 2004-04-14 devnull /*---------------------------------------------------*/
340 ff3adf60 2004-04-14 devnull static
341 ff3adf60 2004-04-14 devnull Bool handle_compress ( bz_stream* strm )
342 ff3adf60 2004-04-14 devnull {
343 ff3adf60 2004-04-14 devnull Bool progress_in = False;
344 ff3adf60 2004-04-14 devnull Bool progress_out = False;
345 ff3adf60 2004-04-14 devnull EState* s = strm->state;
346 ff3adf60 2004-04-14 devnull
347 ff3adf60 2004-04-14 devnull while (True) {
348 ff3adf60 2004-04-14 devnull
349 ff3adf60 2004-04-14 devnull if (s->state == BZ_S_OUTPUT) {
350 ff3adf60 2004-04-14 devnull progress_out |= copy_output_until_stop ( s );
351 ff3adf60 2004-04-14 devnull if (s->state_out_pos < s->numZ) break;
352 ff3adf60 2004-04-14 devnull if (s->mode == BZ_M_FINISHING &&
353 ff3adf60 2004-04-14 devnull s->avail_in_expect == 0 &&
354 ff3adf60 2004-04-14 devnull isempty_RL(s)) break;
355 ff3adf60 2004-04-14 devnull prepare_new_block ( s );
356 ff3adf60 2004-04-14 devnull s->state = BZ_S_INPUT;
357 ff3adf60 2004-04-14 devnull if (s->mode == BZ_M_FLUSHING &&
358 ff3adf60 2004-04-14 devnull s->avail_in_expect == 0 &&
359 ff3adf60 2004-04-14 devnull isempty_RL(s)) break;
360 ff3adf60 2004-04-14 devnull }
361 ff3adf60 2004-04-14 devnull
362 ff3adf60 2004-04-14 devnull if (s->state == BZ_S_INPUT) {
363 ff3adf60 2004-04-14 devnull progress_in |= copy_input_until_stop ( s );
364 ff3adf60 2004-04-14 devnull if (s->mode != BZ_M_RUNNING && s->avail_in_expect == 0) {
365 ff3adf60 2004-04-14 devnull flush_RL ( s );
366 ff3adf60 2004-04-14 devnull BZ2_compressBlock ( s, (Bool)(s->mode == BZ_M_FINISHING) );
367 ff3adf60 2004-04-14 devnull s->state = BZ_S_OUTPUT;
368 ff3adf60 2004-04-14 devnull }
369 ff3adf60 2004-04-14 devnull else
370 ff3adf60 2004-04-14 devnull if (s->nblock >= s->nblockMAX) {
371 ff3adf60 2004-04-14 devnull BZ2_compressBlock ( s, False );
372 ff3adf60 2004-04-14 devnull s->state = BZ_S_OUTPUT;
373 ff3adf60 2004-04-14 devnull }
374 ff3adf60 2004-04-14 devnull else
375 ff3adf60 2004-04-14 devnull if (s->strm->avail_in == 0) {
376 ff3adf60 2004-04-14 devnull break;
377 ff3adf60 2004-04-14 devnull }
378 ff3adf60 2004-04-14 devnull }
379 ff3adf60 2004-04-14 devnull
380 ff3adf60 2004-04-14 devnull }
381 ff3adf60 2004-04-14 devnull
382 ff3adf60 2004-04-14 devnull return progress_in || progress_out;
383 ff3adf60 2004-04-14 devnull }
384 ff3adf60 2004-04-14 devnull
385 ff3adf60 2004-04-14 devnull /*---------------------------------------------------*/
386 ff3adf60 2004-04-14 devnull int BZ_API(BZ2_bzCompress) ( bz_stream *strm, int action )
387 ff3adf60 2004-04-14 devnull {
388 ff3adf60 2004-04-14 devnull Bool progress;
389 ff3adf60 2004-04-14 devnull EState* s;
390 ff3adf60 2004-04-14 devnull if (strm == NULL) return BZ_PARAM_ERROR;
391 ff3adf60 2004-04-14 devnull s = strm->state;
392 ff3adf60 2004-04-14 devnull if (s == NULL) return BZ_PARAM_ERROR;
393 ff3adf60 2004-04-14 devnull if (s->strm != strm) return BZ_PARAM_ERROR;
394 ff3adf60 2004-04-14 devnull
395 ff3adf60 2004-04-14 devnull preswitch:
396 ff3adf60 2004-04-14 devnull switch (s->mode) {
397 ff3adf60 2004-04-14 devnull
398 ff3adf60 2004-04-14 devnull case BZ_M_IDLE:
399 ff3adf60 2004-04-14 devnull return BZ_SEQUENCE_ERROR;
400 ff3adf60 2004-04-14 devnull
401 ff3adf60 2004-04-14 devnull case BZ_M_RUNNING:
402 ff3adf60 2004-04-14 devnull if (action == BZ_RUN) {
403 ff3adf60 2004-04-14 devnull progress = handle_compress ( strm );
404 ff3adf60 2004-04-14 devnull return progress ? BZ_RUN_OK : BZ_PARAM_ERROR;
405 ff3adf60 2004-04-14 devnull }
406 ff3adf60 2004-04-14 devnull else
407 ff3adf60 2004-04-14 devnull if (action == BZ_FLUSH) {
408 ff3adf60 2004-04-14 devnull s->avail_in_expect = strm->avail_in;
409 ff3adf60 2004-04-14 devnull s->mode = BZ_M_FLUSHING;
410 ff3adf60 2004-04-14 devnull goto preswitch;
411 ff3adf60 2004-04-14 devnull }
412 ff3adf60 2004-04-14 devnull else
413 ff3adf60 2004-04-14 devnull if (action == BZ_FINISH) {
414 ff3adf60 2004-04-14 devnull s->avail_in_expect = strm->avail_in;
415 ff3adf60 2004-04-14 devnull s->mode = BZ_M_FINISHING;
416 ff3adf60 2004-04-14 devnull goto preswitch;
417 ff3adf60 2004-04-14 devnull }
418 ff3adf60 2004-04-14 devnull else
419 ff3adf60 2004-04-14 devnull return BZ_PARAM_ERROR;
420 ff3adf60 2004-04-14 devnull
421 ff3adf60 2004-04-14 devnull case BZ_M_FLUSHING:
422 ff3adf60 2004-04-14 devnull if (action != BZ_FLUSH) return BZ_SEQUENCE_ERROR;
423 ff3adf60 2004-04-14 devnull if (s->avail_in_expect != s->strm->avail_in)
424 ff3adf60 2004-04-14 devnull return BZ_SEQUENCE_ERROR;
425 ff3adf60 2004-04-14 devnull progress = handle_compress ( strm );
426 cbeb0b26 2006-04-01 devnull if (!progress) return BZ_SEQUENCE_ERROR; /*rsc added */
427 ff3adf60 2004-04-14 devnull if (s->avail_in_expect > 0 || !isempty_RL(s) ||
428 ff3adf60 2004-04-14 devnull s->state_out_pos < s->numZ) return BZ_FLUSH_OK;
429 ff3adf60 2004-04-14 devnull s->mode = BZ_M_RUNNING;
430 ff3adf60 2004-04-14 devnull return BZ_RUN_OK;
431 ff3adf60 2004-04-14 devnull
432 ff3adf60 2004-04-14 devnull case BZ_M_FINISHING:
433 ff3adf60 2004-04-14 devnull if (action != BZ_FINISH) return BZ_SEQUENCE_ERROR;
434 ff3adf60 2004-04-14 devnull if (s->avail_in_expect != s->strm->avail_in)
435 ff3adf60 2004-04-14 devnull return BZ_SEQUENCE_ERROR;
436 ff3adf60 2004-04-14 devnull progress = handle_compress ( strm );
437 ff3adf60 2004-04-14 devnull if (!progress) return BZ_SEQUENCE_ERROR;
438 ff3adf60 2004-04-14 devnull if (s->avail_in_expect > 0 || !isempty_RL(s) ||
439 ff3adf60 2004-04-14 devnull s->state_out_pos < s->numZ) return BZ_FINISH_OK;
440 ff3adf60 2004-04-14 devnull s->mode = BZ_M_IDLE;
441 ff3adf60 2004-04-14 devnull return BZ_STREAM_END;
442 ff3adf60 2004-04-14 devnull }
443 ff3adf60 2004-04-14 devnull return BZ_OK; /*--not reached--*/
444 ff3adf60 2004-04-14 devnull }
445 ff3adf60 2004-04-14 devnull
446 ff3adf60 2004-04-14 devnull
447 ff3adf60 2004-04-14 devnull /*---------------------------------------------------*/
448 ff3adf60 2004-04-14 devnull int BZ_API(BZ2_bzCompressEnd) ( bz_stream *strm )
449 ff3adf60 2004-04-14 devnull {
450 ff3adf60 2004-04-14 devnull EState* s;
451 ff3adf60 2004-04-14 devnull if (strm == NULL) return BZ_PARAM_ERROR;
452 ff3adf60 2004-04-14 devnull s = strm->state;
453 ff3adf60 2004-04-14 devnull if (s == NULL) return BZ_PARAM_ERROR;
454 ff3adf60 2004-04-14 devnull if (s->strm != strm) return BZ_PARAM_ERROR;
455 ff3adf60 2004-04-14 devnull
456 ff3adf60 2004-04-14 devnull if (s->arr1 != NULL) BZFREE(s->arr1);
457 ff3adf60 2004-04-14 devnull if (s->arr2 != NULL) BZFREE(s->arr2);
458 ff3adf60 2004-04-14 devnull if (s->ftab != NULL) BZFREE(s->ftab);
459 ff3adf60 2004-04-14 devnull BZFREE(strm->state);
460 ff3adf60 2004-04-14 devnull
461 ff3adf60 2004-04-14 devnull strm->state = NULL;
462 ff3adf60 2004-04-14 devnull
463 ff3adf60 2004-04-14 devnull return BZ_OK;
464 ff3adf60 2004-04-14 devnull }
465 ff3adf60 2004-04-14 devnull