2 ff3adf60 2004-04-14 devnull * THIS FILE IS NOT IDENTICAL TO THE ORIGINAL
3 ff3adf60 2004-04-14 devnull * FROM THE BZIP2 DISTRIBUTION.
5 ff3adf60 2004-04-14 devnull * It has been modified, mainly to break the library
6 ff3adf60 2004-04-14 devnull * into smaller pieces.
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
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 /*-------------------------------------------------------------*/
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.
22 ff3adf60 2004-04-14 devnull Copyright (C) 1996-2000 Julian R Seward. All rights reserved.
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
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.
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.
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.
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.
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.
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
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
69 ff3adf60 2004-04-14 devnull For more information on these sources, see the manual.
75 ff3adf60 2004-04-14 devnull 0.9.0 -- original version.
77 ff3adf60 2004-04-14 devnull 0.9.0a/b -- no changes in this file.
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.
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"
93 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.
103 ff3adf60 2004-04-14 devnull /*---------------------------------------------------*/
105 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)
112 ff3adf60 2004-04-14 devnull # define SET_BINARY_MODE(file)
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 */
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;
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';
149 ff3adf60 2004-04-14 devnull strcat(mode2, writing ? "w" : "r" );
150 ff3adf60 2004-04-14 devnull strcat(mode2,"b"); /* binary mode */
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);
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;
163 ff3adf60 2004-04-14 devnull fp = fdopen(fd,mode2);
166 ff3adf60 2004-04-14 devnull if (fp == NULL) return NULL;
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);
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;
182 ff3adf60 2004-04-14 devnull return bzfp;
186 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.
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 )
196 ff3adf60 2004-04-14 devnull return bzopen_or_bzdopen(path,-1,mode,/*bzopen*/0);
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 )
205 ff3adf60 2004-04-14 devnull return bzopen_or_bzdopen(NULL,fd,mode,/*bzdopen*/1);
209 ff3adf60 2004-04-14 devnull /*---------------------------------------------------*/
210 ff3adf60 2004-04-14 devnull int BZ_API(BZ2_bzread) (BZFILE* b, void* buf, int len )
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;
223 ff3adf60 2004-04-14 devnull /*---------------------------------------------------*/
224 ff3adf60 2004-04-14 devnull int BZ_API(BZ2_bzwrite) (BZFILE* b, void* buf, int len )
226 ff3adf60 2004-04-14 devnull int bzerr;
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;
232 ff3adf60 2004-04-14 devnull return -1;
237 ff3adf60 2004-04-14 devnull /*---------------------------------------------------*/
238 ff3adf60 2004-04-14 devnull int BZ_API(BZ2_bzflush) (BZFILE *b)
240 ff3adf60 2004-04-14 devnull /* do nothing now... */
241 ff3adf60 2004-04-14 devnull return 0;
245 ff3adf60 2004-04-14 devnull /*---------------------------------------------------*/
246 ff3adf60 2004-04-14 devnull void BZ_API(BZ2_bzclose) (BZFILE* b)
248 ff3adf60 2004-04-14 devnull int bzerr;
249 ff3adf60 2004-04-14 devnull FILE *fp = ((bzFile *)b)->handle;
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);
258 ff3adf60 2004-04-14 devnull BZ2_bzReadClose(&bzerr,b);
260 ff3adf60 2004-04-14 devnull if(fp!=stdin && fp!=stdout){
261 ff3adf60 2004-04-14 devnull fclose(fp);
266 ff3adf60 2004-04-14 devnull /*---------------------------------------------------*/
268 fa325e9b 2020-01-10 cross return last error code
270 ff3adf60 2004-04-14 devnull static char *bzerrorstrings[] = {
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 */
290 ff3adf60 2004-04-14 devnull const char * BZ_API(BZ2_bzerror) (BZFILE *b, int *errnum)
292 ff3adf60 2004-04-14 devnull int err = ((bzFile *)b)->lastErr;
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];