| /* |
| * 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_bzBuffToBuffDecompress) |
| ( char* dest, |
| unsigned int* destLen, |
| char* source, |
| unsigned int sourceLen, |
| int small, |
| int verbosity ) |
| { |
| bz_stream strm; |
| int ret; |
| |
| if (dest == NULL || destLen == NULL || |
| source == NULL || |
| (small != 0 && small != 1) || |
| verbosity < 0 || verbosity > 4) |
| return BZ_PARAM_ERROR; |
| |
| strm.bzalloc = NULL; |
| strm.bzfree = NULL; |
| strm.opaque = NULL; |
| ret = BZ2_bzDecompressInit ( &strm, verbosity, small ); |
| if (ret != BZ_OK) return ret; |
| |
| strm.next_in = source; |
| strm.next_out = dest; |
| strm.avail_in = sourceLen; |
| strm.avail_out = *destLen; |
| |
| ret = BZ2_bzDecompress ( &strm ); |
| if (ret == BZ_OK) goto output_overflow_or_eof; |
| if (ret != BZ_STREAM_END) goto errhandler; |
| |
| /* normal termination */ |
| *destLen -= strm.avail_out; |
| BZ2_bzDecompressEnd ( &strm ); |
| return BZ_OK; |
| |
| output_overflow_or_eof: |
| if (strm.avail_out > 0) { |
| BZ2_bzDecompressEnd ( &strm ); |
| return BZ_UNEXPECTED_EOF; |
| } else { |
| BZ2_bzDecompressEnd ( &strm ); |
| return BZ_OUTBUFF_FULL; |
| }; |
| |
| errhandler: |
| BZ2_bzDecompressEnd ( &strm ); |
| return ret; |
| } |
| |
| |