mirror of
https://github.com/9fans/plan9port.git
synced 2025-01-30 11:54:57 +00:00
141 lines
4.5 KiB
C
141 lines
4.5 KiB
C
/*
|
|
* THIS FILE IS NOT IDENTICAL TO THE ORIGINAL
|
|
* FROM THE BZIP2 DISTRIBUTION.
|
|
*
|
|
* It has been modified, mainly to break the library
|
|
* into smaller pieces.
|
|
*
|
|
* Russ Cox
|
|
* rsc@plan9.bell-labs.com
|
|
* July 2000
|
|
*/
|
|
|
|
/*-------------------------------------------------------------*/
|
|
/*--- Library top-level functions. ---*/
|
|
/*--- bzlib.c ---*/
|
|
/*-------------------------------------------------------------*/
|
|
|
|
/*--
|
|
This file is a part of bzip2 and/or libbzip2, a program and
|
|
library for lossless, block-sorting data compression.
|
|
|
|
Copyright (C) 1996-2000 Julian R Seward. All rights reserved.
|
|
|
|
Redistribution and use in source and binary forms, with or without
|
|
modification, are permitted provided that the following conditions
|
|
are met:
|
|
|
|
1. Redistributions of source code must retain the above copyright
|
|
notice, this list of conditions and the following disclaimer.
|
|
|
|
2. The origin of this software must not be misrepresented; you must
|
|
not claim that you wrote the original software. If you use this
|
|
software in a product, an acknowledgment in the product
|
|
documentation would be appreciated but is not required.
|
|
|
|
3. Altered source versions must be plainly marked as such, and must
|
|
not be misrepresented as being the original software.
|
|
|
|
4. The name of the author may not be used to endorse or promote
|
|
products derived from this software without specific prior written
|
|
permission.
|
|
|
|
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
|
|
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
|
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
|
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
Julian Seward, Cambridge, UK.
|
|
jseward@acm.org
|
|
bzip2/libbzip2 version 1.0 of 21 March 2000
|
|
|
|
This program is based on (at least) the work of:
|
|
Mike Burrows
|
|
David Wheeler
|
|
Peter Fenwick
|
|
Alistair Moffat
|
|
Radford Neal
|
|
Ian H. Witten
|
|
Robert Sedgewick
|
|
Jon L. Bentley
|
|
|
|
For more information on these sources, see the manual.
|
|
--*/
|
|
|
|
/*--
|
|
CHANGES
|
|
~~~~~~~
|
|
0.9.0 -- original version.
|
|
|
|
0.9.0a/b -- no changes in this file.
|
|
|
|
0.9.0c
|
|
* made zero-length BZ_FLUSH work correctly in bzCompress().
|
|
* fixed bzWrite/bzRead to ignore zero-length requests.
|
|
* fixed bzread to correctly handle read requests after EOF.
|
|
* wrong parameter order in call to bzDecompressInit in
|
|
bzBuffToBuffDecompress. Fixed.
|
|
--*/
|
|
|
|
#include "os.h"
|
|
#include "bzlib.h"
|
|
#include "bzlib_private.h"
|
|
|
|
/*---------------------------------------------------*/
|
|
int BZ_API(BZ2_bzBuffToBuffCompress)
|
|
( char* dest,
|
|
unsigned int* destLen,
|
|
char* source,
|
|
unsigned int sourceLen,
|
|
int blockSize100k,
|
|
int verbosity,
|
|
int workFactor )
|
|
{
|
|
bz_stream strm;
|
|
int ret;
|
|
|
|
if (dest == NULL || destLen == NULL ||
|
|
source == NULL ||
|
|
blockSize100k < 1 || blockSize100k > 9 ||
|
|
verbosity < 0 || verbosity > 4 ||
|
|
workFactor < 0 || workFactor > 250)
|
|
return BZ_PARAM_ERROR;
|
|
|
|
if (workFactor == 0) workFactor = 30;
|
|
strm.bzalloc = NULL;
|
|
strm.bzfree = NULL;
|
|
strm.opaque = NULL;
|
|
ret = BZ2_bzCompressInit ( &strm, blockSize100k,
|
|
verbosity, workFactor );
|
|
if (ret != BZ_OK) return ret;
|
|
|
|
strm.next_in = source;
|
|
strm.next_out = dest;
|
|
strm.avail_in = sourceLen;
|
|
strm.avail_out = *destLen;
|
|
|
|
ret = BZ2_bzCompress ( &strm, BZ_FINISH );
|
|
if (ret == BZ_FINISH_OK) goto output_overflow;
|
|
if (ret != BZ_STREAM_END) goto errhandler;
|
|
|
|
/* normal termination */
|
|
*destLen -= strm.avail_out;
|
|
BZ2_bzCompressEnd ( &strm );
|
|
return BZ_OK;
|
|
|
|
output_overflow:
|
|
BZ2_bzCompressEnd ( &strm );
|
|
return BZ_OUTBUFF_FULL;
|
|
|
|
errhandler:
|
|
BZ2_bzCompressEnd ( &strm );
|
|
return ret;
|
|
}
|
|
|