Blame


1 ff3adf60 2004-04-14 devnull /* THIS FILE HAS BEEN MODIFIED -- rsc split bzlib.c into bzlib.c,
2 ff3adf60 2004-04-14 devnull bzlibcompress.c, bzlibdecompress.c, bzlibread.c, bzlibwrite.c
3 ff3adf60 2004-04-14 devnull */
4 ff3adf60 2004-04-14 devnull /*-------------------------------------------------------------*/
5 ff3adf60 2004-04-14 devnull /*--- Library top-level functions. ---*/
6 ff3adf60 2004-04-14 devnull /*--- bzlib.c ---*/
7 ff3adf60 2004-04-14 devnull /*-------------------------------------------------------------*/
8 ff3adf60 2004-04-14 devnull
9 ff3adf60 2004-04-14 devnull /*--
10 ff3adf60 2004-04-14 devnull This file is a part of bzip2 and/or libbzip2, a program and
11 ff3adf60 2004-04-14 devnull library for lossless, block-sorting data compression.
12 ff3adf60 2004-04-14 devnull
13 ff3adf60 2004-04-14 devnull Copyright (C) 1996-2000 Julian R Seward. All rights reserved.
14 ff3adf60 2004-04-14 devnull
15 ff3adf60 2004-04-14 devnull Redistribution and use in source and binary forms, with or without
16 ff3adf60 2004-04-14 devnull modification, are permitted provided that the following conditions
17 ff3adf60 2004-04-14 devnull are met:
18 ff3adf60 2004-04-14 devnull
19 ff3adf60 2004-04-14 devnull 1. Redistributions of source code must retain the above copyright
20 ff3adf60 2004-04-14 devnull notice, this list of conditions and the following disclaimer.
21 ff3adf60 2004-04-14 devnull
22 fa325e9b 2020-01-10 cross 2. The origin of this software must not be misrepresented; you must
23 fa325e9b 2020-01-10 cross not claim that you wrote the original software. If you use this
24 fa325e9b 2020-01-10 cross software in a product, an acknowledgment in the product
25 ff3adf60 2004-04-14 devnull documentation would be appreciated but is not required.
26 ff3adf60 2004-04-14 devnull
27 ff3adf60 2004-04-14 devnull 3. Altered source versions must be plainly marked as such, and must
28 ff3adf60 2004-04-14 devnull not be misrepresented as being the original software.
29 ff3adf60 2004-04-14 devnull
30 fa325e9b 2020-01-10 cross 4. The name of the author may not be used to endorse or promote
31 fa325e9b 2020-01-10 cross products derived from this software without specific prior written
32 ff3adf60 2004-04-14 devnull permission.
33 ff3adf60 2004-04-14 devnull
34 ff3adf60 2004-04-14 devnull THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
35 ff3adf60 2004-04-14 devnull OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
36 ff3adf60 2004-04-14 devnull WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
37 ff3adf60 2004-04-14 devnull ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
38 ff3adf60 2004-04-14 devnull DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
39 ff3adf60 2004-04-14 devnull DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
40 ff3adf60 2004-04-14 devnull GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
41 ff3adf60 2004-04-14 devnull INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
42 ff3adf60 2004-04-14 devnull WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
43 ff3adf60 2004-04-14 devnull NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
44 ff3adf60 2004-04-14 devnull SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
45 ff3adf60 2004-04-14 devnull
46 ff3adf60 2004-04-14 devnull Julian Seward, Cambridge, UK.
47 ff3adf60 2004-04-14 devnull jseward@acm.org
48 ff3adf60 2004-04-14 devnull bzip2/libbzip2 version 1.0 of 21 March 2000
49 ff3adf60 2004-04-14 devnull
50 ff3adf60 2004-04-14 devnull This program is based on (at least) the work of:
51 ff3adf60 2004-04-14 devnull Mike Burrows
52 ff3adf60 2004-04-14 devnull David Wheeler
53 ff3adf60 2004-04-14 devnull Peter Fenwick
54 ff3adf60 2004-04-14 devnull Alistair Moffat
55 ff3adf60 2004-04-14 devnull Radford Neal
56 ff3adf60 2004-04-14 devnull Ian H. Witten
57 ff3adf60 2004-04-14 devnull Robert Sedgewick
58 ff3adf60 2004-04-14 devnull Jon L. Bentley
59 ff3adf60 2004-04-14 devnull
60 ff3adf60 2004-04-14 devnull For more information on these sources, see the manual.
61 ff3adf60 2004-04-14 devnull --*/
62 ff3adf60 2004-04-14 devnull
63 ff3adf60 2004-04-14 devnull /*--
64 ff3adf60 2004-04-14 devnull CHANGES
65 ff3adf60 2004-04-14 devnull ~~~~~~~
66 ff3adf60 2004-04-14 devnull 0.9.0 -- original version.
67 ff3adf60 2004-04-14 devnull
68 ff3adf60 2004-04-14 devnull 0.9.0a/b -- no changes in this file.
69 ff3adf60 2004-04-14 devnull
70 ff3adf60 2004-04-14 devnull 0.9.0c
71 ff3adf60 2004-04-14 devnull * made zero-length BZ_FLUSH work correctly in bzCompress().
72 ff3adf60 2004-04-14 devnull * fixed bzWrite/bzRead to ignore zero-length requests.
73 ff3adf60 2004-04-14 devnull * fixed bzread to correctly handle read requests after EOF.
74 ff3adf60 2004-04-14 devnull * wrong parameter order in call to bzDecompressInit in
75 ff3adf60 2004-04-14 devnull bzBuffToBuffDecompress. Fixed.
76 ff3adf60 2004-04-14 devnull --*/
77 ff3adf60 2004-04-14 devnull
78 ff3adf60 2004-04-14 devnull #include "os.h"
79 ff3adf60 2004-04-14 devnull #include "bzlib.h"
80 ff3adf60 2004-04-14 devnull #include "bzlib_private.h"
81 ff3adf60 2004-04-14 devnull #include "bzlib_stdio.h"
82 ff3adf60 2004-04-14 devnull #include "bzlib_stdio_private.h"
83 ff3adf60 2004-04-14 devnull
84 ff3adf60 2004-04-14 devnull /*---------------------------------------------------*/
85 fa325e9b 2020-01-10 cross BZFILE* BZ_API(BZ2_bzWriteOpen)
86 fa325e9b 2020-01-10 cross ( int* bzerror,
87 fa325e9b 2020-01-10 cross FILE* f,
88 fa325e9b 2020-01-10 cross int blockSize100k,
89 ff3adf60 2004-04-14 devnull int verbosity,
90 ff3adf60 2004-04-14 devnull int workFactor )
91 ff3adf60 2004-04-14 devnull {
92 ff3adf60 2004-04-14 devnull Int32 ret;
93 ff3adf60 2004-04-14 devnull bzFile* bzf = NULL;
94 ff3adf60 2004-04-14 devnull
95 ff3adf60 2004-04-14 devnull BZ_SETERR(BZ_OK);
96 ff3adf60 2004-04-14 devnull
97 ff3adf60 2004-04-14 devnull if (f == NULL ||
98 ff3adf60 2004-04-14 devnull (blockSize100k < 1 || blockSize100k > 9) ||
99 ff3adf60 2004-04-14 devnull (workFactor < 0 || workFactor > 250) ||
100 ff3adf60 2004-04-14 devnull (verbosity < 0 || verbosity > 4))
101 ff3adf60 2004-04-14 devnull { BZ_SETERR(BZ_PARAM_ERROR); return NULL; };
102 ff3adf60 2004-04-14 devnull
103 ff3adf60 2004-04-14 devnull if (ferror(f))
104 ff3adf60 2004-04-14 devnull { BZ_SETERR(BZ_IO_ERROR); return NULL; };
105 ff3adf60 2004-04-14 devnull
106 ff3adf60 2004-04-14 devnull bzf = malloc ( sizeof(bzFile) );
107 ff3adf60 2004-04-14 devnull if (bzf == NULL)
108 ff3adf60 2004-04-14 devnull { BZ_SETERR(BZ_MEM_ERROR); return NULL; };
109 ff3adf60 2004-04-14 devnull
110 ff3adf60 2004-04-14 devnull BZ_SETERR(BZ_OK);
111 ff3adf60 2004-04-14 devnull bzf->initialisedOk = False;
112 ff3adf60 2004-04-14 devnull bzf->bufN = 0;
113 ff3adf60 2004-04-14 devnull bzf->handle = f;
114 ff3adf60 2004-04-14 devnull bzf->writing = True;
115 ff3adf60 2004-04-14 devnull bzf->strm.bzalloc = NULL;
116 ff3adf60 2004-04-14 devnull bzf->strm.bzfree = NULL;
117 ff3adf60 2004-04-14 devnull bzf->strm.opaque = NULL;
118 ff3adf60 2004-04-14 devnull
119 ff3adf60 2004-04-14 devnull if (workFactor == 0) workFactor = 30;
120 fa325e9b 2020-01-10 cross ret = BZ2_bzCompressInit ( &(bzf->strm), blockSize100k,
121 ff3adf60 2004-04-14 devnull verbosity, workFactor );
122 ff3adf60 2004-04-14 devnull if (ret != BZ_OK)
123 ff3adf60 2004-04-14 devnull { BZ_SETERR(ret); free(bzf); return NULL; };
124 ff3adf60 2004-04-14 devnull
125 ff3adf60 2004-04-14 devnull bzf->strm.avail_in = 0;
126 ff3adf60 2004-04-14 devnull bzf->initialisedOk = True;
127 fa325e9b 2020-01-10 cross return bzf;
128 ff3adf60 2004-04-14 devnull }
129 ff3adf60 2004-04-14 devnull
130 ff3adf60 2004-04-14 devnull
131 ff3adf60 2004-04-14 devnull
132 ff3adf60 2004-04-14 devnull /*---------------------------------------------------*/
133 ff3adf60 2004-04-14 devnull void BZ_API(BZ2_bzWrite)
134 fa325e9b 2020-01-10 cross ( int* bzerror,
135 fa325e9b 2020-01-10 cross BZFILE* b,
136 fa325e9b 2020-01-10 cross void* buf,
137 ff3adf60 2004-04-14 devnull int len )
138 ff3adf60 2004-04-14 devnull {
139 ff3adf60 2004-04-14 devnull Int32 n, n2, ret;
140 ff3adf60 2004-04-14 devnull bzFile* bzf = (bzFile*)b;
141 ff3adf60 2004-04-14 devnull
142 ff3adf60 2004-04-14 devnull BZ_SETERR(BZ_OK);
143 ff3adf60 2004-04-14 devnull if (bzf == NULL || buf == NULL || len < 0)
144 ff3adf60 2004-04-14 devnull { BZ_SETERR(BZ_PARAM_ERROR); return; };
145 ff3adf60 2004-04-14 devnull if (!(bzf->writing))
146 ff3adf60 2004-04-14 devnull { BZ_SETERR(BZ_SEQUENCE_ERROR); return; };
147 ff3adf60 2004-04-14 devnull if (ferror(bzf->handle))
148 ff3adf60 2004-04-14 devnull { BZ_SETERR(BZ_IO_ERROR); return; };
149 ff3adf60 2004-04-14 devnull
150 ff3adf60 2004-04-14 devnull if (len == 0)
151 ff3adf60 2004-04-14 devnull { BZ_SETERR(BZ_OK); return; };
152 ff3adf60 2004-04-14 devnull
153 ff3adf60 2004-04-14 devnull bzf->strm.avail_in = len;
154 ff3adf60 2004-04-14 devnull bzf->strm.next_in = buf;
155 ff3adf60 2004-04-14 devnull
156 ff3adf60 2004-04-14 devnull while (True) {
157 ff3adf60 2004-04-14 devnull bzf->strm.avail_out = BZ_MAX_UNUSED;
158 ff3adf60 2004-04-14 devnull bzf->strm.next_out = bzf->buf;
159 ff3adf60 2004-04-14 devnull ret = BZ2_bzCompress ( &(bzf->strm), BZ_RUN );
160 ff3adf60 2004-04-14 devnull if (ret != BZ_RUN_OK)
161 ff3adf60 2004-04-14 devnull { BZ_SETERR(ret); return; };
162 ff3adf60 2004-04-14 devnull
163 ff3adf60 2004-04-14 devnull if (bzf->strm.avail_out < BZ_MAX_UNUSED) {
164 ff3adf60 2004-04-14 devnull n = BZ_MAX_UNUSED - bzf->strm.avail_out;
165 fa325e9b 2020-01-10 cross n2 = fwrite ( (void*)(bzf->buf), sizeof(UChar),
166 ff3adf60 2004-04-14 devnull n, bzf->handle );
167 ff3adf60 2004-04-14 devnull if (n != n2 || ferror(bzf->handle))
168 ff3adf60 2004-04-14 devnull { BZ_SETERR(BZ_IO_ERROR); return; };
169 ff3adf60 2004-04-14 devnull }
170 ff3adf60 2004-04-14 devnull
171 ff3adf60 2004-04-14 devnull if (bzf->strm.avail_in == 0)
172 ff3adf60 2004-04-14 devnull { BZ_SETERR(BZ_OK); return; };
173 ff3adf60 2004-04-14 devnull }
174 ff3adf60 2004-04-14 devnull }
175 ff3adf60 2004-04-14 devnull
176 ff3adf60 2004-04-14 devnull
177 ff3adf60 2004-04-14 devnull /*---------------------------------------------------*/
178 ff3adf60 2004-04-14 devnull void BZ_API(BZ2_bzWriteClose)
179 fa325e9b 2020-01-10 cross ( int* bzerror,
180 fa325e9b 2020-01-10 cross BZFILE* b,
181 ff3adf60 2004-04-14 devnull int abandon,
182 ff3adf60 2004-04-14 devnull unsigned int* nbytes_in,
183 ff3adf60 2004-04-14 devnull unsigned int* nbytes_out )
184 ff3adf60 2004-04-14 devnull {
185 fa325e9b 2020-01-10 cross BZ2_bzWriteClose64 ( bzerror, b, abandon,
186 ff3adf60 2004-04-14 devnull nbytes_in, NULL, nbytes_out, NULL );
187 ff3adf60 2004-04-14 devnull }
188 ff3adf60 2004-04-14 devnull
189 ff3adf60 2004-04-14 devnull
190 ff3adf60 2004-04-14 devnull void BZ_API(BZ2_bzWriteClose64)
191 fa325e9b 2020-01-10 cross ( int* bzerror,
192 fa325e9b 2020-01-10 cross BZFILE* b,
193 ff3adf60 2004-04-14 devnull int abandon,
194 ff3adf60 2004-04-14 devnull unsigned int* nbytes_in_lo32,
195 ff3adf60 2004-04-14 devnull unsigned int* nbytes_in_hi32,
196 ff3adf60 2004-04-14 devnull unsigned int* nbytes_out_lo32,
197 ff3adf60 2004-04-14 devnull unsigned int* nbytes_out_hi32 )
198 ff3adf60 2004-04-14 devnull {
199 ff3adf60 2004-04-14 devnull Int32 n, n2, ret;
200 ff3adf60 2004-04-14 devnull bzFile* bzf = (bzFile*)b;
201 ff3adf60 2004-04-14 devnull
202 ff3adf60 2004-04-14 devnull if (bzf == NULL)
203 ff3adf60 2004-04-14 devnull { BZ_SETERR(BZ_OK); return; };
204 ff3adf60 2004-04-14 devnull if (!(bzf->writing))
205 ff3adf60 2004-04-14 devnull { BZ_SETERR(BZ_SEQUENCE_ERROR); return; };
206 ff3adf60 2004-04-14 devnull if (ferror(bzf->handle))
207 ff3adf60 2004-04-14 devnull { BZ_SETERR(BZ_IO_ERROR); return; };
208 ff3adf60 2004-04-14 devnull
209 ff3adf60 2004-04-14 devnull if (nbytes_in_lo32 != NULL) *nbytes_in_lo32 = 0;
210 ff3adf60 2004-04-14 devnull if (nbytes_in_hi32 != NULL) *nbytes_in_hi32 = 0;
211 ff3adf60 2004-04-14 devnull if (nbytes_out_lo32 != NULL) *nbytes_out_lo32 = 0;
212 ff3adf60 2004-04-14 devnull if (nbytes_out_hi32 != NULL) *nbytes_out_hi32 = 0;
213 ff3adf60 2004-04-14 devnull
214 ff3adf60 2004-04-14 devnull if ((!abandon) && bzf->lastErr == BZ_OK) {
215 ff3adf60 2004-04-14 devnull while (True) {
216 ff3adf60 2004-04-14 devnull bzf->strm.avail_out = BZ_MAX_UNUSED;
217 ff3adf60 2004-04-14 devnull bzf->strm.next_out = bzf->buf;
218 ff3adf60 2004-04-14 devnull ret = BZ2_bzCompress ( &(bzf->strm), BZ_FINISH );
219 ff3adf60 2004-04-14 devnull if (ret != BZ_FINISH_OK && ret != BZ_STREAM_END)
220 ff3adf60 2004-04-14 devnull { BZ_SETERR(ret); return; };
221 ff3adf60 2004-04-14 devnull
222 ff3adf60 2004-04-14 devnull if (bzf->strm.avail_out < BZ_MAX_UNUSED) {
223 ff3adf60 2004-04-14 devnull n = BZ_MAX_UNUSED - bzf->strm.avail_out;
224 fa325e9b 2020-01-10 cross n2 = fwrite ( (void*)(bzf->buf), sizeof(UChar),
225 ff3adf60 2004-04-14 devnull n, bzf->handle );
226 ff3adf60 2004-04-14 devnull if (n != n2 || ferror(bzf->handle))
227 ff3adf60 2004-04-14 devnull { BZ_SETERR(BZ_IO_ERROR); return; };
228 ff3adf60 2004-04-14 devnull }
229 ff3adf60 2004-04-14 devnull
230 ff3adf60 2004-04-14 devnull if (ret == BZ_STREAM_END) break;
231 ff3adf60 2004-04-14 devnull }
232 ff3adf60 2004-04-14 devnull }
233 ff3adf60 2004-04-14 devnull
234 ff3adf60 2004-04-14 devnull if ( !abandon && !ferror ( bzf->handle ) ) {
235 ff3adf60 2004-04-14 devnull fflush ( bzf->handle );
236 ff3adf60 2004-04-14 devnull if (ferror(bzf->handle))
237 ff3adf60 2004-04-14 devnull { BZ_SETERR(BZ_IO_ERROR); return; };
238 ff3adf60 2004-04-14 devnull }
239 ff3adf60 2004-04-14 devnull
240 ff3adf60 2004-04-14 devnull if (nbytes_in_lo32 != NULL)
241 ff3adf60 2004-04-14 devnull *nbytes_in_lo32 = bzf->strm.total_in_lo32;
242 ff3adf60 2004-04-14 devnull if (nbytes_in_hi32 != NULL)
243 ff3adf60 2004-04-14 devnull *nbytes_in_hi32 = bzf->strm.total_in_hi32;
244 ff3adf60 2004-04-14 devnull if (nbytes_out_lo32 != NULL)
245 ff3adf60 2004-04-14 devnull *nbytes_out_lo32 = bzf->strm.total_out_lo32;
246 ff3adf60 2004-04-14 devnull if (nbytes_out_hi32 != NULL)
247 ff3adf60 2004-04-14 devnull *nbytes_out_hi32 = bzf->strm.total_out_hi32;
248 ff3adf60 2004-04-14 devnull
249 ff3adf60 2004-04-14 devnull BZ_SETERR(BZ_OK);
250 ff3adf60 2004-04-14 devnull BZ2_bzCompressEnd ( &(bzf->strm) );
251 ff3adf60 2004-04-14 devnull free ( bzf );
252 ff3adf60 2004-04-14 devnull }