xref: /plan9/sys/src/cmd/bzip2/lib/bzbuffcompress.c (revision 59cc4ca53493a3c6d2349fe2b7f7c40f7dce7294)
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