1*59cc4ca5SDavid du Colombier /*
2*59cc4ca5SDavid du Colombier * THIS FILE IS NOT IDENTICAL TO THE ORIGINAL
3*59cc4ca5SDavid du Colombier * FROM THE BZIP2 DISTRIBUTION.
4*59cc4ca5SDavid du Colombier *
5*59cc4ca5SDavid du Colombier * It has been modified, mainly to break the library
6*59cc4ca5SDavid du Colombier * into smaller pieces.
7*59cc4ca5SDavid du Colombier *
8*59cc4ca5SDavid du Colombier * Russ Cox
9*59cc4ca5SDavid du Colombier * rsc@plan9.bell-labs.com
10*59cc4ca5SDavid du Colombier * July 2000
11*59cc4ca5SDavid du Colombier */
12*59cc4ca5SDavid du Colombier
13*59cc4ca5SDavid du Colombier /*-------------------------------------------------------------*/
14*59cc4ca5SDavid du Colombier /*--- Library top-level functions. ---*/
15*59cc4ca5SDavid du Colombier /*--- bzlib.c ---*/
16*59cc4ca5SDavid du Colombier /*-------------------------------------------------------------*/
17*59cc4ca5SDavid du Colombier
18*59cc4ca5SDavid du Colombier /*--
19*59cc4ca5SDavid du Colombier This file is a part of bzip2 and/or libbzip2, a program and
20*59cc4ca5SDavid du Colombier library for lossless, block-sorting data compression.
21*59cc4ca5SDavid du Colombier
22*59cc4ca5SDavid du Colombier Copyright (C) 1996-2000 Julian R Seward. All rights reserved.
23*59cc4ca5SDavid du Colombier
24*59cc4ca5SDavid du Colombier Redistribution and use in source and binary forms, with or without
25*59cc4ca5SDavid du Colombier modification, are permitted provided that the following conditions
26*59cc4ca5SDavid du Colombier are met:
27*59cc4ca5SDavid du Colombier
28*59cc4ca5SDavid du Colombier 1. Redistributions of source code must retain the above copyright
29*59cc4ca5SDavid du Colombier notice, this list of conditions and the following disclaimer.
30*59cc4ca5SDavid du Colombier
31*59cc4ca5SDavid du Colombier 2. The origin of this software must not be misrepresented; you must
32*59cc4ca5SDavid du Colombier not claim that you wrote the original software. If you use this
33*59cc4ca5SDavid du Colombier software in a product, an acknowledgment in the product
34*59cc4ca5SDavid du Colombier documentation would be appreciated but is not required.
35*59cc4ca5SDavid du Colombier
36*59cc4ca5SDavid du Colombier 3. Altered source versions must be plainly marked as such, and must
37*59cc4ca5SDavid du Colombier not be misrepresented as being the original software.
38*59cc4ca5SDavid du Colombier
39*59cc4ca5SDavid du Colombier 4. The name of the author may not be used to endorse or promote
40*59cc4ca5SDavid du Colombier products derived from this software without specific prior written
41*59cc4ca5SDavid du Colombier permission.
42*59cc4ca5SDavid du Colombier
43*59cc4ca5SDavid du Colombier THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
44*59cc4ca5SDavid du Colombier OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
45*59cc4ca5SDavid du Colombier WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
46*59cc4ca5SDavid du Colombier ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
47*59cc4ca5SDavid du Colombier DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
48*59cc4ca5SDavid du Colombier DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
49*59cc4ca5SDavid du Colombier GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
50*59cc4ca5SDavid du Colombier INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
51*59cc4ca5SDavid du Colombier WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
52*59cc4ca5SDavid du Colombier NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
53*59cc4ca5SDavid du Colombier SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
54*59cc4ca5SDavid du Colombier
55*59cc4ca5SDavid du Colombier Julian Seward, Cambridge, UK.
56*59cc4ca5SDavid du Colombier jseward@acm.org
57*59cc4ca5SDavid du Colombier bzip2/libbzip2 version 1.0 of 21 March 2000
58*59cc4ca5SDavid du Colombier
59*59cc4ca5SDavid du Colombier This program is based on (at least) the work of:
60*59cc4ca5SDavid du Colombier Mike Burrows
61*59cc4ca5SDavid du Colombier David Wheeler
62*59cc4ca5SDavid du Colombier Peter Fenwick
63*59cc4ca5SDavid du Colombier Alistair Moffat
64*59cc4ca5SDavid du Colombier Radford Neal
65*59cc4ca5SDavid du Colombier Ian H. Witten
66*59cc4ca5SDavid du Colombier Robert Sedgewick
67*59cc4ca5SDavid du Colombier Jon L. Bentley
68*59cc4ca5SDavid du Colombier
69*59cc4ca5SDavid du Colombier For more information on these sources, see the manual.
70*59cc4ca5SDavid du Colombier --*/
71*59cc4ca5SDavid du Colombier
72*59cc4ca5SDavid du Colombier /*--
73*59cc4ca5SDavid du Colombier CHANGES
74*59cc4ca5SDavid du Colombier ~~~~~~~
75*59cc4ca5SDavid du Colombier 0.9.0 -- original version.
76*59cc4ca5SDavid du Colombier
77*59cc4ca5SDavid du Colombier 0.9.0a/b -- no changes in this file.
78*59cc4ca5SDavid du Colombier
79*59cc4ca5SDavid du Colombier 0.9.0c
80*59cc4ca5SDavid du Colombier * made zero-length BZ_FLUSH work correctly in bzCompress().
81*59cc4ca5SDavid du Colombier * fixed bzWrite/bzRead to ignore zero-length requests.
82*59cc4ca5SDavid du Colombier * fixed bzread to correctly handle read requests after EOF.
83*59cc4ca5SDavid du Colombier * wrong parameter order in call to bzDecompressInit in
84*59cc4ca5SDavid du Colombier bzBuffToBuffDecompress. Fixed.
85*59cc4ca5SDavid du Colombier --*/
86*59cc4ca5SDavid du Colombier
87*59cc4ca5SDavid du Colombier #include "os.h"
88*59cc4ca5SDavid du Colombier #include "bzlib.h"
89*59cc4ca5SDavid du Colombier #include "bzlib_private.h"
90*59cc4ca5SDavid du Colombier
91*59cc4ca5SDavid du Colombier /*---------------------------------------------------*/
BZ_API(BZ2_bzBuffToBuffCompress)92*59cc4ca5SDavid du Colombier int BZ_API(BZ2_bzBuffToBuffCompress)
93*59cc4ca5SDavid du Colombier ( char* dest,
94*59cc4ca5SDavid du Colombier unsigned int* destLen,
95*59cc4ca5SDavid du Colombier char* source,
96*59cc4ca5SDavid du Colombier unsigned int sourceLen,
97*59cc4ca5SDavid du Colombier int blockSize100k,
98*59cc4ca5SDavid du Colombier int verbosity,
99*59cc4ca5SDavid du Colombier int workFactor )
100*59cc4ca5SDavid du Colombier {
101*59cc4ca5SDavid du Colombier bz_stream strm;
102*59cc4ca5SDavid du Colombier int ret;
103*59cc4ca5SDavid du Colombier
104*59cc4ca5SDavid du Colombier if (dest == NULL || destLen == NULL ||
105*59cc4ca5SDavid du Colombier source == NULL ||
106*59cc4ca5SDavid du Colombier blockSize100k < 1 || blockSize100k > 9 ||
107*59cc4ca5SDavid du Colombier verbosity < 0 || verbosity > 4 ||
108*59cc4ca5SDavid du Colombier workFactor < 0 || workFactor > 250)
109*59cc4ca5SDavid du Colombier return BZ_PARAM_ERROR;
110*59cc4ca5SDavid du Colombier
111*59cc4ca5SDavid du Colombier if (workFactor == 0) workFactor = 30;
112*59cc4ca5SDavid du Colombier strm.bzalloc = NULL;
113*59cc4ca5SDavid du Colombier strm.bzfree = NULL;
114*59cc4ca5SDavid du Colombier strm.opaque = NULL;
115*59cc4ca5SDavid du Colombier ret = BZ2_bzCompressInit ( &strm, blockSize100k,
116*59cc4ca5SDavid du Colombier verbosity, workFactor );
117*59cc4ca5SDavid du Colombier if (ret != BZ_OK) return ret;
118*59cc4ca5SDavid du Colombier
119*59cc4ca5SDavid du Colombier strm.next_in = source;
120*59cc4ca5SDavid du Colombier strm.next_out = dest;
121*59cc4ca5SDavid du Colombier strm.avail_in = sourceLen;
122*59cc4ca5SDavid du Colombier strm.avail_out = *destLen;
123*59cc4ca5SDavid du Colombier
124*59cc4ca5SDavid du Colombier ret = BZ2_bzCompress ( &strm, BZ_FINISH );
125*59cc4ca5SDavid du Colombier if (ret == BZ_FINISH_OK) goto output_overflow;
126*59cc4ca5SDavid du Colombier if (ret != BZ_STREAM_END) goto errhandler;
127*59cc4ca5SDavid du Colombier
128*59cc4ca5SDavid du Colombier /* normal termination */
129*59cc4ca5SDavid du Colombier *destLen -= strm.avail_out;
130*59cc4ca5SDavid du Colombier BZ2_bzCompressEnd ( &strm );
131*59cc4ca5SDavid du Colombier return BZ_OK;
132*59cc4ca5SDavid du Colombier
133*59cc4ca5SDavid du Colombier output_overflow:
134*59cc4ca5SDavid du Colombier BZ2_bzCompressEnd ( &strm );
135*59cc4ca5SDavid du Colombier return BZ_OUTBUFF_FULL;
136*59cc4ca5SDavid du Colombier
137*59cc4ca5SDavid du Colombier errhandler:
138*59cc4ca5SDavid du Colombier BZ2_bzCompressEnd ( &strm );
139*59cc4ca5SDavid du Colombier return ret;
140*59cc4ca5SDavid du Colombier }
141*59cc4ca5SDavid du Colombier
142