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 fa325e9b 2020-01-10 cross 2. The origin of this software must not be misrepresented; you must
32 fa325e9b 2020-01-10 cross not claim that you wrote the original software. If you use this
33 fa325e9b 2020-01-10 cross 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 fa325e9b 2020-01-10 cross 4. The name of the author may not be used to endorse or promote
40 fa325e9b 2020-01-10 cross 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 #include "bzlib_stdio.h"
91 ff3adf60 2004-04-14 devnull #include "bzlib_stdio_private.h"
92 ff3adf60 2004-04-14 devnull
93 ff3adf60 2004-04-14 devnull /*---------------------------------------------------*/
94 ff3adf60 2004-04-14 devnull /*--
95 ff3adf60 2004-04-14 devnull Code contributed by Yoshioka Tsuneo
96 ff3adf60 2004-04-14 devnull (QWF00133@niftyserve.or.jp/tsuneo-y@is.aist-nara.ac.jp),
97 ff3adf60 2004-04-14 devnull to support better zlib compatibility.
98 ff3adf60 2004-04-14 devnull This code is not _officially_ part of libbzip2 (yet);
99 ff3adf60 2004-04-14 devnull I haven't tested it, documented it, or considered the
100 ff3adf60 2004-04-14 devnull threading-safeness of it.
101 ff3adf60 2004-04-14 devnull If this code breaks, please contact both Yoshioka and me.
102 ff3adf60 2004-04-14 devnull --*/
103 ff3adf60 2004-04-14 devnull /*---------------------------------------------------*/
104 ff3adf60 2004-04-14 devnull
105 ff3adf60 2004-04-14 devnull /*---------------------------------------------------*/
106 ff3adf60 2004-04-14 devnull
107 ff3adf60 2004-04-14 devnull #if defined(_WIN32) || defined(OS2) || defined(MSDOS)
108 ff3adf60 2004-04-14 devnull # include <fcntl.h>
109 ff3adf60 2004-04-14 devnull # include <io.h>
110 ff3adf60 2004-04-14 devnull # define SET_BINARY_MODE(file) setmode(fileno(file),O_BINARY)
111 ff3adf60 2004-04-14 devnull #else
112 ff3adf60 2004-04-14 devnull # define SET_BINARY_MODE(file)
113 ff3adf60 2004-04-14 devnull #endif
114 ff3adf60 2004-04-14 devnull static
115 ff3adf60 2004-04-14 devnull BZFILE * bzopen_or_bzdopen
116 ff3adf60 2004-04-14 devnull ( const char *path, /* no use when bzdopen */
117 ff3adf60 2004-04-14 devnull int fd, /* no use when bzdopen */
118 ff3adf60 2004-04-14 devnull const char *mode,
119 ff3adf60 2004-04-14 devnull int open_mode) /* bzopen: 0, bzdopen:1 */
120 ff3adf60 2004-04-14 devnull {
121 ff3adf60 2004-04-14 devnull int bzerr;
122 ff3adf60 2004-04-14 devnull char unused[BZ_MAX_UNUSED];
123 ff3adf60 2004-04-14 devnull int blockSize100k = 9;
124 ff3adf60 2004-04-14 devnull int writing = 0;
125 ff3adf60 2004-04-14 devnull char mode2[10] = "";
126 ff3adf60 2004-04-14 devnull FILE *fp = NULL;
127 ff3adf60 2004-04-14 devnull BZFILE *bzfp = NULL;
128 ff3adf60 2004-04-14 devnull int verbosity = 0;
129 ff3adf60 2004-04-14 devnull int workFactor = 30;
130 ff3adf60 2004-04-14 devnull int smallMode = 0;
131 fa325e9b 2020-01-10 cross int nUnused = 0;
132 ff3adf60 2004-04-14 devnull
133 ff3adf60 2004-04-14 devnull if (mode == NULL) return NULL;
134 ff3adf60 2004-04-14 devnull while (*mode) {
135 ff3adf60 2004-04-14 devnull switch (*mode) {
136 ff3adf60 2004-04-14 devnull case 'r':
137 ff3adf60 2004-04-14 devnull writing = 0; break;
138 ff3adf60 2004-04-14 devnull case 'w':
139 ff3adf60 2004-04-14 devnull writing = 1; break;
140 ff3adf60 2004-04-14 devnull case 's':
141 ff3adf60 2004-04-14 devnull smallMode = 1; break;
142 ff3adf60 2004-04-14 devnull default:
143 ff3adf60 2004-04-14 devnull if (isdigit((int)(*mode))) {
144 ff3adf60 2004-04-14 devnull blockSize100k = *mode-'0';
145 ff3adf60 2004-04-14 devnull }
146 ff3adf60 2004-04-14 devnull }
147 ff3adf60 2004-04-14 devnull mode++;
148 ff3adf60 2004-04-14 devnull }
149 ff3adf60 2004-04-14 devnull strcat(mode2, writing ? "w" : "r" );
150 ff3adf60 2004-04-14 devnull strcat(mode2,"b"); /* binary mode */
151 ff3adf60 2004-04-14 devnull
152 ff3adf60 2004-04-14 devnull if (open_mode==0) {
153 ff3adf60 2004-04-14 devnull if (path==NULL || strcmp(path,"")==0) {
154 ff3adf60 2004-04-14 devnull fp = (writing ? stdout : stdin);
155 ff3adf60 2004-04-14 devnull SET_BINARY_MODE(fp);
156 ff3adf60 2004-04-14 devnull } else {
157 ff3adf60 2004-04-14 devnull fp = fopen(path,mode2);
158 ff3adf60 2004-04-14 devnull }
159 ff3adf60 2004-04-14 devnull } else {
160 ff3adf60 2004-04-14 devnull #ifdef BZ_STRICT_ANSI
161 ff3adf60 2004-04-14 devnull fp = NULL;
162 ff3adf60 2004-04-14 devnull #else
163 ff3adf60 2004-04-14 devnull fp = fdopen(fd,mode2);
164 ff3adf60 2004-04-14 devnull #endif
165 ff3adf60 2004-04-14 devnull }
166 ff3adf60 2004-04-14 devnull if (fp == NULL) return NULL;
167 ff3adf60 2004-04-14 devnull
168 ff3adf60 2004-04-14 devnull if (writing) {
169 ff3adf60 2004-04-14 devnull /* Guard against total chaos and anarchy -- JRS */
170 ff3adf60 2004-04-14 devnull if (blockSize100k < 1) blockSize100k = 1;
171 fa325e9b 2020-01-10 cross if (blockSize100k > 9) blockSize100k = 9;
172 ff3adf60 2004-04-14 devnull bzfp = BZ2_bzWriteOpen(&bzerr,fp,blockSize100k,
173 ff3adf60 2004-04-14 devnull verbosity,workFactor);
174 ff3adf60 2004-04-14 devnull } else {
175 ff3adf60 2004-04-14 devnull bzfp = BZ2_bzReadOpen(&bzerr,fp,verbosity,smallMode,
176 ff3adf60 2004-04-14 devnull unused,nUnused);
177 ff3adf60 2004-04-14 devnull }
178 ff3adf60 2004-04-14 devnull if (bzfp == NULL) {
179 ff3adf60 2004-04-14 devnull if (fp != stdin && fp != stdout) fclose(fp);
180 ff3adf60 2004-04-14 devnull return NULL;
181 ff3adf60 2004-04-14 devnull }
182 ff3adf60 2004-04-14 devnull return bzfp;
183 ff3adf60 2004-04-14 devnull }
184 ff3adf60 2004-04-14 devnull
185 ff3adf60 2004-04-14 devnull
186 ff3adf60 2004-04-14 devnull /*---------------------------------------------------*/
187 ff3adf60 2004-04-14 devnull /*--
188 ff3adf60 2004-04-14 devnull open file for read or write.
189 ff3adf60 2004-04-14 devnull ex) bzopen("file","w9")
190 ff3adf60 2004-04-14 devnull case path="" or NULL => use stdin or stdout.
191 ff3adf60 2004-04-14 devnull --*/
192 ff3adf60 2004-04-14 devnull BZFILE * BZ_API(BZ2_bzopen)
193 ff3adf60 2004-04-14 devnull ( const char *path,
194 ff3adf60 2004-04-14 devnull const char *mode )
195 ff3adf60 2004-04-14 devnull {
196 ff3adf60 2004-04-14 devnull return bzopen_or_bzdopen(path,-1,mode,/*bzopen*/0);
197 ff3adf60 2004-04-14 devnull }
198 ff3adf60 2004-04-14 devnull
199 ff3adf60 2004-04-14 devnull
200 ff3adf60 2004-04-14 devnull /*---------------------------------------------------*/
201 ff3adf60 2004-04-14 devnull BZFILE * BZ_API(BZ2_bzdopen)
202 ff3adf60 2004-04-14 devnull ( int fd,
203 ff3adf60 2004-04-14 devnull const char *mode )
204 ff3adf60 2004-04-14 devnull {
205 ff3adf60 2004-04-14 devnull return bzopen_or_bzdopen(NULL,fd,mode,/*bzdopen*/1);
206 ff3adf60 2004-04-14 devnull }
207 ff3adf60 2004-04-14 devnull
208 ff3adf60 2004-04-14 devnull
209 ff3adf60 2004-04-14 devnull /*---------------------------------------------------*/
210 ff3adf60 2004-04-14 devnull int BZ_API(BZ2_bzread) (BZFILE* b, void* buf, int len )
211 ff3adf60 2004-04-14 devnull {
212 ff3adf60 2004-04-14 devnull int bzerr, nread;
213 ff3adf60 2004-04-14 devnull if (((bzFile*)b)->lastErr == BZ_STREAM_END) return 0;
214 ff3adf60 2004-04-14 devnull nread = BZ2_bzRead(&bzerr,b,buf,len);
215 ff3adf60 2004-04-14 devnull if (bzerr == BZ_OK || bzerr == BZ_STREAM_END) {
216 ff3adf60 2004-04-14 devnull return nread;
217 ff3adf60 2004-04-14 devnull } else {
218 ff3adf60 2004-04-14 devnull return -1;
219 ff3adf60 2004-04-14 devnull }
220 ff3adf60 2004-04-14 devnull }
221 ff3adf60 2004-04-14 devnull
222 ff3adf60 2004-04-14 devnull
223 ff3adf60 2004-04-14 devnull /*---------------------------------------------------*/
224 ff3adf60 2004-04-14 devnull int BZ_API(BZ2_bzwrite) (BZFILE* b, void* buf, int len )
225 ff3adf60 2004-04-14 devnull {
226 ff3adf60 2004-04-14 devnull int bzerr;
227 ff3adf60 2004-04-14 devnull
228 ff3adf60 2004-04-14 devnull BZ2_bzWrite(&bzerr,b,buf,len);
229 ff3adf60 2004-04-14 devnull if(bzerr == BZ_OK){
230 ff3adf60 2004-04-14 devnull return len;
231 ff3adf60 2004-04-14 devnull }else{
232 ff3adf60 2004-04-14 devnull return -1;
233 ff3adf60 2004-04-14 devnull }
234 ff3adf60 2004-04-14 devnull }
235 ff3adf60 2004-04-14 devnull
236 ff3adf60 2004-04-14 devnull
237 ff3adf60 2004-04-14 devnull /*---------------------------------------------------*/
238 ff3adf60 2004-04-14 devnull int BZ_API(BZ2_bzflush) (BZFILE *b)
239 ff3adf60 2004-04-14 devnull {
240 ff3adf60 2004-04-14 devnull /* do nothing now... */
241 ff3adf60 2004-04-14 devnull return 0;
242 ff3adf60 2004-04-14 devnull }
243 ff3adf60 2004-04-14 devnull
244 ff3adf60 2004-04-14 devnull
245 ff3adf60 2004-04-14 devnull /*---------------------------------------------------*/
246 ff3adf60 2004-04-14 devnull void BZ_API(BZ2_bzclose) (BZFILE* b)
247 ff3adf60 2004-04-14 devnull {
248 ff3adf60 2004-04-14 devnull int bzerr;
249 ff3adf60 2004-04-14 devnull FILE *fp = ((bzFile *)b)->handle;
250 fa325e9b 2020-01-10 cross
251 ff3adf60 2004-04-14 devnull if (b==NULL) {return;}
252 ff3adf60 2004-04-14 devnull if(((bzFile*)b)->writing){
253 ff3adf60 2004-04-14 devnull BZ2_bzWriteClose(&bzerr,b,0,NULL,NULL);
254 ff3adf60 2004-04-14 devnull if(bzerr != BZ_OK){
255 ff3adf60 2004-04-14 devnull BZ2_bzWriteClose(NULL,b,1,NULL,NULL);
256 ff3adf60 2004-04-14 devnull }
257 ff3adf60 2004-04-14 devnull }else{
258 ff3adf60 2004-04-14 devnull BZ2_bzReadClose(&bzerr,b);
259 ff3adf60 2004-04-14 devnull }
260 ff3adf60 2004-04-14 devnull if(fp!=stdin && fp!=stdout){
261 ff3adf60 2004-04-14 devnull fclose(fp);
262 ff3adf60 2004-04-14 devnull }
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 fa325e9b 2020-01-10 cross return last error code
269 ff3adf60 2004-04-14 devnull --*/
270 ff3adf60 2004-04-14 devnull static char *bzerrorstrings[] = {
271 ff3adf60 2004-04-14 devnull "OK"
272 ff3adf60 2004-04-14 devnull ,"SEQUENCE_ERROR"
273 ff3adf60 2004-04-14 devnull ,"PARAM_ERROR"
274 ff3adf60 2004-04-14 devnull ,"MEM_ERROR"
275 ff3adf60 2004-04-14 devnull ,"DATA_ERROR"
276 ff3adf60 2004-04-14 devnull ,"DATA_ERROR_MAGIC"
277 ff3adf60 2004-04-14 devnull ,"IO_ERROR"
278 ff3adf60 2004-04-14 devnull ,"UNEXPECTED_EOF"
279 ff3adf60 2004-04-14 devnull ,"OUTBUFF_FULL"
280 ff3adf60 2004-04-14 devnull ,"CONFIG_ERROR"
281 ff3adf60 2004-04-14 devnull ,"???" /* for future */
282 ff3adf60 2004-04-14 devnull ,"???" /* for future */
283 ff3adf60 2004-04-14 devnull ,"???" /* for future */
284 ff3adf60 2004-04-14 devnull ,"???" /* for future */
285 ff3adf60 2004-04-14 devnull ,"???" /* for future */
286 ff3adf60 2004-04-14 devnull ,"???" /* for future */
287 ff3adf60 2004-04-14 devnull };
288 ff3adf60 2004-04-14 devnull
289 ff3adf60 2004-04-14 devnull
290 ff3adf60 2004-04-14 devnull const char * BZ_API(BZ2_bzerror) (BZFILE *b, int *errnum)
291 ff3adf60 2004-04-14 devnull {
292 ff3adf60 2004-04-14 devnull int err = ((bzFile *)b)->lastErr;
293 ff3adf60 2004-04-14 devnull
294 ff3adf60 2004-04-14 devnull if(err>0) err = 0;
295 ff3adf60 2004-04-14 devnull *errnum = err;
296 ff3adf60 2004-04-14 devnull return bzerrorstrings[err*-1];
297 ff3adf60 2004-04-14 devnull }