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
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 /*-------------------------------------------------------------*/
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.
13 ff3adf60 2004-04-14 devnull Copyright (C) 1996-2000 Julian R Seward. All rights reserved.
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
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.
22 ff3adf60 2004-04-14 devnull 2. The origin of this software must not be misrepresented; you must
23 ff3adf60 2004-04-14 devnull not claim that you wrote the original software. If you use this
24 ff3adf60 2004-04-14 devnull software in a product, an acknowledgment in the product
25 ff3adf60 2004-04-14 devnull documentation would be appreciated but is not required.
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.
30 ff3adf60 2004-04-14 devnull 4. The name of the author may not be used to endorse or promote
31 ff3adf60 2004-04-14 devnull products derived from this software without specific prior written
32 ff3adf60 2004-04-14 devnull permission.
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.
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
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
60 ff3adf60 2004-04-14 devnull For more information on these sources, see the manual.
66 ff3adf60 2004-04-14 devnull 0.9.0 -- original version.
68 ff3adf60 2004-04-14 devnull 0.9.0a/b -- no changes in this file.
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.
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"
84 ff3adf60 2004-04-14 devnull /*---------------------------------------------------*/
85 ff3adf60 2004-04-14 devnull BZFILE* BZ_API(BZ2_bzReadOpen)
86 ff3adf60 2004-04-14 devnull ( int* bzerror,
88 ff3adf60 2004-04-14 devnull int verbosity,
89 ff3adf60 2004-04-14 devnull int small,
90 ff3adf60 2004-04-14 devnull void* unused,
91 ff3adf60 2004-04-14 devnull int nUnused )
93 ff3adf60 2004-04-14 devnull bzFile* bzf = NULL;
96 ff3adf60 2004-04-14 devnull BZ_SETERR(BZ_OK);
98 ff3adf60 2004-04-14 devnull if (f == NULL ||
99 ff3adf60 2004-04-14 devnull (small != 0 && small != 1) ||
100 ff3adf60 2004-04-14 devnull (verbosity < 0 || verbosity > 4) ||
101 ff3adf60 2004-04-14 devnull (unused == NULL && nUnused != 0) ||
102 ff3adf60 2004-04-14 devnull (unused != NULL && (nUnused < 0 || nUnused > BZ_MAX_UNUSED)))
103 ff3adf60 2004-04-14 devnull { BZ_SETERR(BZ_PARAM_ERROR); return NULL; };
105 ff3adf60 2004-04-14 devnull if (ferror(f))
106 ff3adf60 2004-04-14 devnull { BZ_SETERR(BZ_IO_ERROR); return NULL; };
108 ff3adf60 2004-04-14 devnull bzf = malloc ( sizeof(bzFile) );
109 ff3adf60 2004-04-14 devnull if (bzf == NULL)
110 ff3adf60 2004-04-14 devnull { BZ_SETERR(BZ_MEM_ERROR); return NULL; };
112 ff3adf60 2004-04-14 devnull BZ_SETERR(BZ_OK);
114 ff3adf60 2004-04-14 devnull bzf->initialisedOk = False;
115 ff3adf60 2004-04-14 devnull bzf->handle = f;
116 ff3adf60 2004-04-14 devnull bzf->bufN = 0;
117 ff3adf60 2004-04-14 devnull bzf->writing = False;
118 ff3adf60 2004-04-14 devnull bzf->strm.bzalloc = NULL;
119 ff3adf60 2004-04-14 devnull bzf->strm.bzfree = NULL;
120 ff3adf60 2004-04-14 devnull bzf->strm.opaque = NULL;
122 ff3adf60 2004-04-14 devnull while (nUnused > 0) {
123 ff3adf60 2004-04-14 devnull bzf->buf[bzf->bufN] = *((UChar*)(unused)); bzf->bufN++;
124 ff3adf60 2004-04-14 devnull unused = ((void*)( 1 + ((UChar*)(unused)) ));
125 ff3adf60 2004-04-14 devnull nUnused--;
128 ff3adf60 2004-04-14 devnull ret = BZ2_bzDecompressInit ( &(bzf->strm), verbosity, small );
129 ff3adf60 2004-04-14 devnull if (ret != BZ_OK)
130 ff3adf60 2004-04-14 devnull { BZ_SETERR(ret); free(bzf); return NULL; };
132 ff3adf60 2004-04-14 devnull bzf->strm.avail_in = bzf->bufN;
133 ff3adf60 2004-04-14 devnull bzf->strm.next_in = bzf->buf;
135 ff3adf60 2004-04-14 devnull bzf->initialisedOk = True;
136 ff3adf60 2004-04-14 devnull return bzf;
140 ff3adf60 2004-04-14 devnull /*---------------------------------------------------*/
141 ff3adf60 2004-04-14 devnull void BZ_API(BZ2_bzReadClose) ( int *bzerror, BZFILE *b )
143 ff3adf60 2004-04-14 devnull bzFile* bzf = (bzFile*)b;
145 ff3adf60 2004-04-14 devnull BZ_SETERR(BZ_OK);
146 ff3adf60 2004-04-14 devnull if (bzf == NULL)
147 ff3adf60 2004-04-14 devnull { BZ_SETERR(BZ_OK); return; };
149 ff3adf60 2004-04-14 devnull if (bzf->writing)
150 ff3adf60 2004-04-14 devnull { BZ_SETERR(BZ_SEQUENCE_ERROR); return; };
152 ff3adf60 2004-04-14 devnull if (bzf->initialisedOk)
153 ff3adf60 2004-04-14 devnull (void)BZ2_bzDecompressEnd ( &(bzf->strm) );
154 ff3adf60 2004-04-14 devnull free ( bzf );
158 ff3adf60 2004-04-14 devnull /*---------------------------------------------------*/
159 ff3adf60 2004-04-14 devnull int BZ_API(BZ2_bzRead)
160 ff3adf60 2004-04-14 devnull ( int* bzerror,
161 ff3adf60 2004-04-14 devnull BZFILE* b,
162 ff3adf60 2004-04-14 devnull void* buf,
163 ff3adf60 2004-04-14 devnull int len )
165 ff3adf60 2004-04-14 devnull Int32 n, ret;
166 ff3adf60 2004-04-14 devnull bzFile* bzf = (bzFile*)b;
168 ff3adf60 2004-04-14 devnull BZ_SETERR(BZ_OK);
170 ff3adf60 2004-04-14 devnull if (bzf == NULL || buf == NULL || len < 0)
171 ff3adf60 2004-04-14 devnull { BZ_SETERR(BZ_PARAM_ERROR); return 0; };
173 ff3adf60 2004-04-14 devnull if (bzf->writing)
174 ff3adf60 2004-04-14 devnull { BZ_SETERR(BZ_SEQUENCE_ERROR); return 0; };
176 ff3adf60 2004-04-14 devnull if (len == 0)
177 ff3adf60 2004-04-14 devnull { BZ_SETERR(BZ_OK); return 0; };
179 ff3adf60 2004-04-14 devnull bzf->strm.avail_out = len;
180 ff3adf60 2004-04-14 devnull bzf->strm.next_out = buf;
182 ff3adf60 2004-04-14 devnull while (True) {
184 ff3adf60 2004-04-14 devnull if (ferror(bzf->handle))
185 ff3adf60 2004-04-14 devnull { BZ_SETERR(BZ_IO_ERROR); return 0; };
187 ff3adf60 2004-04-14 devnull if (bzf->strm.avail_in == 0 && !bz_feof(bzf->handle)) {
188 ff3adf60 2004-04-14 devnull n = fread ( bzf->buf, sizeof(UChar),
189 ff3adf60 2004-04-14 devnull BZ_MAX_UNUSED, bzf->handle );
190 ff3adf60 2004-04-14 devnull if (ferror(bzf->handle))
191 ff3adf60 2004-04-14 devnull { BZ_SETERR(BZ_IO_ERROR); return 0; };
192 ff3adf60 2004-04-14 devnull bzf->bufN = n;
193 ff3adf60 2004-04-14 devnull bzf->strm.avail_in = bzf->bufN;
194 ff3adf60 2004-04-14 devnull bzf->strm.next_in = bzf->buf;
197 ff3adf60 2004-04-14 devnull ret = BZ2_bzDecompress ( &(bzf->strm) );
199 ff3adf60 2004-04-14 devnull if (ret != BZ_OK && ret != BZ_STREAM_END)
200 ff3adf60 2004-04-14 devnull { BZ_SETERR(ret); return 0; };
202 ff3adf60 2004-04-14 devnull if (ret == BZ_OK && bz_feof(bzf->handle) &&
203 ff3adf60 2004-04-14 devnull bzf->strm.avail_in == 0 && bzf->strm.avail_out > 0)
204 ff3adf60 2004-04-14 devnull { BZ_SETERR(BZ_UNEXPECTED_EOF); return 0; };
206 ff3adf60 2004-04-14 devnull if (ret == BZ_STREAM_END)
207 ff3adf60 2004-04-14 devnull { BZ_SETERR(BZ_STREAM_END);
208 ff3adf60 2004-04-14 devnull return len - bzf->strm.avail_out; };
209 ff3adf60 2004-04-14 devnull if (bzf->strm.avail_out == 0)
210 ff3adf60 2004-04-14 devnull { BZ_SETERR(BZ_OK); return len; };
214 ff3adf60 2004-04-14 devnull return 0; /*not reached*/
218 ff3adf60 2004-04-14 devnull /*---------------------------------------------------*/
219 ff3adf60 2004-04-14 devnull void BZ_API(BZ2_bzReadGetUnused)
220 ff3adf60 2004-04-14 devnull ( int* bzerror,
221 ff3adf60 2004-04-14 devnull BZFILE* b,
222 ff3adf60 2004-04-14 devnull void** unused,
223 ff3adf60 2004-04-14 devnull int* nUnused )
225 ff3adf60 2004-04-14 devnull bzFile* bzf = (bzFile*)b;
226 ff3adf60 2004-04-14 devnull if (bzf == NULL)
227 ff3adf60 2004-04-14 devnull { BZ_SETERR(BZ_PARAM_ERROR); return; };
228 ff3adf60 2004-04-14 devnull if (bzf->lastErr != BZ_STREAM_END)
229 ff3adf60 2004-04-14 devnull { BZ_SETERR(BZ_SEQUENCE_ERROR); return; };
230 ff3adf60 2004-04-14 devnull if (unused == NULL || nUnused == NULL)
231 ff3adf60 2004-04-14 devnull { BZ_SETERR(BZ_PARAM_ERROR); return; };
233 ff3adf60 2004-04-14 devnull BZ_SETERR(BZ_OK);
234 ff3adf60 2004-04-14 devnull *nUnused = bzf->strm.avail_in;
235 ff3adf60 2004-04-14 devnull *unused = bzf->strm.next_in;