186c2349f3dd6574a20f58b31ed901d0006bced4bnjn// This benchmark is basically bzip2 (mashed to be a single file) 286c2349f3dd6574a20f58b31ed901d0006bced4bnjn// compressing and decompressing some data. It tests Valgrind's handling of 386c2349f3dd6574a20f58b31ed901d0006bced4bnjn// realistic and "difficult" (ie. lots of branches and memory accesses) 486c2349f3dd6574a20f58b31ed901d0006bced4bnjn// integer code. Execution is spread out over quite a few basic blocks; 586c2349f3dd6574a20f58b31ed901d0006bced4bnjn// --profile-flags indicates that to get to the top 90%th percentile of 686c2349f3dd6574a20f58b31ed901d0006bced4bnjn// dynamic BB counts requires considering the top 51 basic blocks 786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 846712cd593e0c9ddf48431635e5b3e84a4eb1f42sewardj// This program can be used both as part of the performance test 946712cd593e0c9ddf48431635e5b3e84a4eb1f42sewardj// suite, in which case we want it to run for quite a while, 1046712cd593e0c9ddf48431635e5b3e84a4eb1f42sewardj// and as part of the regression (correctness) test suite, in 1146712cd593e0c9ddf48431635e5b3e84a4eb1f42sewardj// which case we want it to run quickly and be verbose. 1246712cd593e0c9ddf48431635e5b3e84a4eb1f42sewardj// So it does the latter iff given a command line arg. 1346712cd593e0c9ddf48431635e5b3e84a4eb1f42sewardj 1486c2349f3dd6574a20f58b31ed901d0006bced4bnjn// Licensing: the code within is mostly taken from bzip2, which has a BSD 1543c48b6fa0fa17acf31123b8a143e83cbff2c4a1dirk// license. There is a little code from VEX, which is licensed under GPLv2 1643c48b6fa0fa17acf31123b8a143e83cbff2c4a1dirk// And it's all written by Julian Seward. 1786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 1886c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_NO_STDIO 1986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 2086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 2186c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-------------------------------------------------------------*/ 2286c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*--- Private header file for the library. ---*/ 2386c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*--- bzlib_private.h ---*/ 2486c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-------------------------------------------------------------*/ 2586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 2686c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-- 2786c2349f3dd6574a20f58b31ed901d0006bced4bnjn This file is a part of bzip2 and/or libbzip2, a program and 2886c2349f3dd6574a20f58b31ed901d0006bced4bnjn library for lossless, block-sorting data compression. 2986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 3086c2349f3dd6574a20f58b31ed901d0006bced4bnjn Copyright (C) 1996-2004 Julian R Seward. All rights reserved. 3186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 3286c2349f3dd6574a20f58b31ed901d0006bced4bnjn Redistribution and use in source and binary forms, with or without 3386c2349f3dd6574a20f58b31ed901d0006bced4bnjn modification, are permitted provided that the following conditions 3486c2349f3dd6574a20f58b31ed901d0006bced4bnjn are met: 3586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 3686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 1. Redistributions of source code must retain the above copyright 3786c2349f3dd6574a20f58b31ed901d0006bced4bnjn notice, this list of conditions and the following disclaimer. 3886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 3986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 2. The origin of this software must not be misrepresented; you must 4086c2349f3dd6574a20f58b31ed901d0006bced4bnjn not claim that you wrote the original software. If you use this 4186c2349f3dd6574a20f58b31ed901d0006bced4bnjn software in a product, an acknowledgment in the product 4286c2349f3dd6574a20f58b31ed901d0006bced4bnjn documentation would be appreciated but is not required. 4386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 4486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 3. Altered source versions must be plainly marked as such, and must 4586c2349f3dd6574a20f58b31ed901d0006bced4bnjn not be misrepresented as being the original software. 4686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 4786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 4. The name of the author may not be used to endorse or promote 4886c2349f3dd6574a20f58b31ed901d0006bced4bnjn products derived from this software without specific prior written 4986c2349f3dd6574a20f58b31ed901d0006bced4bnjn permission. 5086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 5186c2349f3dd6574a20f58b31ed901d0006bced4bnjn THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 5286c2349f3dd6574a20f58b31ed901d0006bced4bnjn OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 5386c2349f3dd6574a20f58b31ed901d0006bced4bnjn WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 5486c2349f3dd6574a20f58b31ed901d0006bced4bnjn ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 5586c2349f3dd6574a20f58b31ed901d0006bced4bnjn DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 5686c2349f3dd6574a20f58b31ed901d0006bced4bnjn DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 5786c2349f3dd6574a20f58b31ed901d0006bced4bnjn GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 5886c2349f3dd6574a20f58b31ed901d0006bced4bnjn INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 5986c2349f3dd6574a20f58b31ed901d0006bced4bnjn WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 6086c2349f3dd6574a20f58b31ed901d0006bced4bnjn NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 6186c2349f3dd6574a20f58b31ed901d0006bced4bnjn SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 6286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 6386c2349f3dd6574a20f58b31ed901d0006bced4bnjn Julian Seward, Cambridge, UK. 6486c2349f3dd6574a20f58b31ed901d0006bced4bnjn jseward@bzip.org 6586c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzip2/libbzip2 version 1.0 of 21 March 2000 6686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 6786c2349f3dd6574a20f58b31ed901d0006bced4bnjn This program is based on (at least) the work of: 6886c2349f3dd6574a20f58b31ed901d0006bced4bnjn Mike Burrows 6986c2349f3dd6574a20f58b31ed901d0006bced4bnjn David Wheeler 7086c2349f3dd6574a20f58b31ed901d0006bced4bnjn Peter Fenwick 7186c2349f3dd6574a20f58b31ed901d0006bced4bnjn Alistair Moffat 7286c2349f3dd6574a20f58b31ed901d0006bced4bnjn Radford Neal 7386c2349f3dd6574a20f58b31ed901d0006bced4bnjn Ian H. Witten 7486c2349f3dd6574a20f58b31ed901d0006bced4bnjn Robert Sedgewick 7586c2349f3dd6574a20f58b31ed901d0006bced4bnjn Jon L. Bentley 7686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 7786c2349f3dd6574a20f58b31ed901d0006bced4bnjn For more information on these sources, see the manual. 7886c2349f3dd6574a20f58b31ed901d0006bced4bnjn--*/ 7986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 8086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 8186c2349f3dd6574a20f58b31ed901d0006bced4bnjn#ifndef _BZLIB_PRIVATE_H 8286c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define _BZLIB_PRIVATE_H 8386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 8486c2349f3dd6574a20f58b31ed901d0006bced4bnjn#include <stdlib.h> 8586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 8686c2349f3dd6574a20f58b31ed901d0006bced4bnjn#ifndef BZ_NO_STDIO 8786c2349f3dd6574a20f58b31ed901d0006bced4bnjn#include <stdio.h> 8886c2349f3dd6574a20f58b31ed901d0006bced4bnjn#include <ctype.h> 8986c2349f3dd6574a20f58b31ed901d0006bced4bnjn#include <string.h> 9086c2349f3dd6574a20f58b31ed901d0006bced4bnjn#endif 9186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 9286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 9386c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-------------------------------------------------------------*/ 9486c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*--- Public header file for the library. ---*/ 9586c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*--- bzlib.h ---*/ 9686c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-------------------------------------------------------------*/ 9786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 9886c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-- 9986c2349f3dd6574a20f58b31ed901d0006bced4bnjn This file is a part of bzip2 and/or libbzip2, a program and 10086c2349f3dd6574a20f58b31ed901d0006bced4bnjn library for lossless, block-sorting data compression. 10186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 10286c2349f3dd6574a20f58b31ed901d0006bced4bnjn Copyright (C) 1996-2004 Julian R Seward. All rights reserved. 10386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 10486c2349f3dd6574a20f58b31ed901d0006bced4bnjn Redistribution and use in source and binary forms, with or without 10586c2349f3dd6574a20f58b31ed901d0006bced4bnjn modification, are permitted provided that the following conditions 10686c2349f3dd6574a20f58b31ed901d0006bced4bnjn are met: 10786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 10886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 1. Redistributions of source code must retain the above copyright 10986c2349f3dd6574a20f58b31ed901d0006bced4bnjn notice, this list of conditions and the following disclaimer. 11086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 11186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 2. The origin of this software must not be misrepresented; you must 11286c2349f3dd6574a20f58b31ed901d0006bced4bnjn not claim that you wrote the original software. If you use this 11386c2349f3dd6574a20f58b31ed901d0006bced4bnjn software in a product, an acknowledgment in the product 11486c2349f3dd6574a20f58b31ed901d0006bced4bnjn documentation would be appreciated but is not required. 11586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 11686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 3. Altered source versions must be plainly marked as such, and must 11786c2349f3dd6574a20f58b31ed901d0006bced4bnjn not be misrepresented as being the original software. 11886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 11986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 4. The name of the author may not be used to endorse or promote 12086c2349f3dd6574a20f58b31ed901d0006bced4bnjn products derived from this software without specific prior written 12186c2349f3dd6574a20f58b31ed901d0006bced4bnjn permission. 12286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 12386c2349f3dd6574a20f58b31ed901d0006bced4bnjn THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 12486c2349f3dd6574a20f58b31ed901d0006bced4bnjn OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 12586c2349f3dd6574a20f58b31ed901d0006bced4bnjn WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 12686c2349f3dd6574a20f58b31ed901d0006bced4bnjn ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 12786c2349f3dd6574a20f58b31ed901d0006bced4bnjn DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 12886c2349f3dd6574a20f58b31ed901d0006bced4bnjn DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 12986c2349f3dd6574a20f58b31ed901d0006bced4bnjn GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 13086c2349f3dd6574a20f58b31ed901d0006bced4bnjn INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 13186c2349f3dd6574a20f58b31ed901d0006bced4bnjn WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 13286c2349f3dd6574a20f58b31ed901d0006bced4bnjn NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 13386c2349f3dd6574a20f58b31ed901d0006bced4bnjn SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 13486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 13586c2349f3dd6574a20f58b31ed901d0006bced4bnjn Julian Seward, Cambridge, UK. 13686c2349f3dd6574a20f58b31ed901d0006bced4bnjn jseward@bzip.org 13786c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzip2/libbzip2 version 1.0 of 21 March 2000 13886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 13986c2349f3dd6574a20f58b31ed901d0006bced4bnjn This program is based on (at least) the work of: 14086c2349f3dd6574a20f58b31ed901d0006bced4bnjn Mike Burrows 14186c2349f3dd6574a20f58b31ed901d0006bced4bnjn David Wheeler 14286c2349f3dd6574a20f58b31ed901d0006bced4bnjn Peter Fenwick 14386c2349f3dd6574a20f58b31ed901d0006bced4bnjn Alistair Moffat 14486c2349f3dd6574a20f58b31ed901d0006bced4bnjn Radford Neal 14586c2349f3dd6574a20f58b31ed901d0006bced4bnjn Ian H. Witten 14686c2349f3dd6574a20f58b31ed901d0006bced4bnjn Robert Sedgewick 14786c2349f3dd6574a20f58b31ed901d0006bced4bnjn Jon L. Bentley 14886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 14986c2349f3dd6574a20f58b31ed901d0006bced4bnjn For more information on these sources, see the manual. 15086c2349f3dd6574a20f58b31ed901d0006bced4bnjn--*/ 15186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 15286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 15386c2349f3dd6574a20f58b31ed901d0006bced4bnjn#ifndef _BZLIB_H 15486c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define _BZLIB_H 15586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 15686c2349f3dd6574a20f58b31ed901d0006bced4bnjn#ifdef __cplusplus 15786c2349f3dd6574a20f58b31ed901d0006bced4bnjnextern "C" { 15886c2349f3dd6574a20f58b31ed901d0006bced4bnjn#endif 15986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 16086c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_RUN 0 16186c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_FLUSH 1 16286c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_FINISH 2 16386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 16486c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_OK 0 16586c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_RUN_OK 1 16686c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_FLUSH_OK 2 16786c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_FINISH_OK 3 16886c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_STREAM_END 4 16986c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_SEQUENCE_ERROR (-1) 17086c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_PARAM_ERROR (-2) 17186c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_MEM_ERROR (-3) 17286c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_DATA_ERROR (-4) 17386c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_DATA_ERROR_MAGIC (-5) 17486c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_IO_ERROR (-6) 17586c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_UNEXPECTED_EOF (-7) 17686c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_OUTBUFF_FULL (-8) 17786c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_CONFIG_ERROR (-9) 17886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 17986c2349f3dd6574a20f58b31ed901d0006bced4bnjntypedef 18086c2349f3dd6574a20f58b31ed901d0006bced4bnjn struct { 18186c2349f3dd6574a20f58b31ed901d0006bced4bnjn char *next_in; 18286c2349f3dd6574a20f58b31ed901d0006bced4bnjn unsigned int avail_in; 18386c2349f3dd6574a20f58b31ed901d0006bced4bnjn unsigned int total_in_lo32; 18486c2349f3dd6574a20f58b31ed901d0006bced4bnjn unsigned int total_in_hi32; 18586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 18686c2349f3dd6574a20f58b31ed901d0006bced4bnjn char *next_out; 18786c2349f3dd6574a20f58b31ed901d0006bced4bnjn unsigned int avail_out; 18886c2349f3dd6574a20f58b31ed901d0006bced4bnjn unsigned int total_out_lo32; 18986c2349f3dd6574a20f58b31ed901d0006bced4bnjn unsigned int total_out_hi32; 19086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 19186c2349f3dd6574a20f58b31ed901d0006bced4bnjn void *state; 19286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 19386c2349f3dd6574a20f58b31ed901d0006bced4bnjn void *(*bzalloc)(void *,int,int); 19486c2349f3dd6574a20f58b31ed901d0006bced4bnjn void (*bzfree)(void *,void *); 19586c2349f3dd6574a20f58b31ed901d0006bced4bnjn void *opaque; 19686c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 19786c2349f3dd6574a20f58b31ed901d0006bced4bnjn bz_stream; 19886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 19986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 20086c2349f3dd6574a20f58b31ed901d0006bced4bnjn#ifndef BZ_IMPORT 20186c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_EXPORT 20286c2349f3dd6574a20f58b31ed901d0006bced4bnjn#endif 20386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 20486c2349f3dd6574a20f58b31ed901d0006bced4bnjn#ifndef BZ_NO_STDIO 20586c2349f3dd6574a20f58b31ed901d0006bced4bnjn/* Need a definitition for FILE */ 20686c2349f3dd6574a20f58b31ed901d0006bced4bnjn#include <stdio.h> 20786c2349f3dd6574a20f58b31ed901d0006bced4bnjn#endif 20886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 20986c2349f3dd6574a20f58b31ed901d0006bced4bnjn#ifdef _WIN32 21086c2349f3dd6574a20f58b31ed901d0006bced4bnjn# include <windows.h> 21186c2349f3dd6574a20f58b31ed901d0006bced4bnjn# ifdef small 21286c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* windows.h define small to char */ 21386c2349f3dd6574a20f58b31ed901d0006bced4bnjn# undef small 21486c2349f3dd6574a20f58b31ed901d0006bced4bnjn# endif 21586c2349f3dd6574a20f58b31ed901d0006bced4bnjn# ifdef BZ_EXPORT 21686c2349f3dd6574a20f58b31ed901d0006bced4bnjn# define BZ_API(func) WINAPI func 21786c2349f3dd6574a20f58b31ed901d0006bced4bnjn# define BZ_EXTERN extern 21886c2349f3dd6574a20f58b31ed901d0006bced4bnjn# else 21986c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* import windows dll dynamically */ 22086c2349f3dd6574a20f58b31ed901d0006bced4bnjn# define BZ_API(func) (WINAPI * func) 22186c2349f3dd6574a20f58b31ed901d0006bced4bnjn# define BZ_EXTERN 22286c2349f3dd6574a20f58b31ed901d0006bced4bnjn# endif 22386c2349f3dd6574a20f58b31ed901d0006bced4bnjn#else 22486c2349f3dd6574a20f58b31ed901d0006bced4bnjn# define BZ_API(func) func 22586c2349f3dd6574a20f58b31ed901d0006bced4bnjn# define BZ_EXTERN extern 22686c2349f3dd6574a20f58b31ed901d0006bced4bnjn#endif 22786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 22886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 22986c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-- Core (low-level) library functions --*/ 23086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 23186c2349f3dd6574a20f58b31ed901d0006bced4bnjnBZ_EXTERN int BZ_API(BZ2_bzCompressInit) ( 23286c2349f3dd6574a20f58b31ed901d0006bced4bnjn bz_stream* strm, 23386c2349f3dd6574a20f58b31ed901d0006bced4bnjn int blockSize100k, 23486c2349f3dd6574a20f58b31ed901d0006bced4bnjn int verbosity, 23586c2349f3dd6574a20f58b31ed901d0006bced4bnjn int workFactor 23686c2349f3dd6574a20f58b31ed901d0006bced4bnjn ); 23786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 23886c2349f3dd6574a20f58b31ed901d0006bced4bnjnBZ_EXTERN int BZ_API(BZ2_bzCompress) ( 23986c2349f3dd6574a20f58b31ed901d0006bced4bnjn bz_stream* strm, 24086c2349f3dd6574a20f58b31ed901d0006bced4bnjn int action 24186c2349f3dd6574a20f58b31ed901d0006bced4bnjn ); 24286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 24386c2349f3dd6574a20f58b31ed901d0006bced4bnjnBZ_EXTERN int BZ_API(BZ2_bzCompressEnd) ( 24486c2349f3dd6574a20f58b31ed901d0006bced4bnjn bz_stream* strm 24586c2349f3dd6574a20f58b31ed901d0006bced4bnjn ); 24686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 24786c2349f3dd6574a20f58b31ed901d0006bced4bnjnBZ_EXTERN int BZ_API(BZ2_bzDecompressInit) ( 24886c2349f3dd6574a20f58b31ed901d0006bced4bnjn bz_stream *strm, 24986c2349f3dd6574a20f58b31ed901d0006bced4bnjn int verbosity, 25086c2349f3dd6574a20f58b31ed901d0006bced4bnjn int small 25186c2349f3dd6574a20f58b31ed901d0006bced4bnjn ); 25286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 25386c2349f3dd6574a20f58b31ed901d0006bced4bnjnBZ_EXTERN int BZ_API(BZ2_bzDecompress) ( 25486c2349f3dd6574a20f58b31ed901d0006bced4bnjn bz_stream* strm 25586c2349f3dd6574a20f58b31ed901d0006bced4bnjn ); 25686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 25786c2349f3dd6574a20f58b31ed901d0006bced4bnjnBZ_EXTERN int BZ_API(BZ2_bzDecompressEnd) ( 25886c2349f3dd6574a20f58b31ed901d0006bced4bnjn bz_stream *strm 25986c2349f3dd6574a20f58b31ed901d0006bced4bnjn ); 26086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 26186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 26286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 26386c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-- High(er) level library functions --*/ 26486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 26586c2349f3dd6574a20f58b31ed901d0006bced4bnjn#ifndef BZ_NO_STDIO 26686c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_MAX_UNUSED 5000 26786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 26886c2349f3dd6574a20f58b31ed901d0006bced4bnjntypedef void BZFILE; 26986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 27086c2349f3dd6574a20f58b31ed901d0006bced4bnjnBZ_EXTERN BZFILE* BZ_API(BZ2_bzReadOpen) ( 27186c2349f3dd6574a20f58b31ed901d0006bced4bnjn int* bzerror, 27286c2349f3dd6574a20f58b31ed901d0006bced4bnjn FILE* f, 27386c2349f3dd6574a20f58b31ed901d0006bced4bnjn int verbosity, 27486c2349f3dd6574a20f58b31ed901d0006bced4bnjn int small, 27586c2349f3dd6574a20f58b31ed901d0006bced4bnjn void* unused, 27686c2349f3dd6574a20f58b31ed901d0006bced4bnjn int nUnused 27786c2349f3dd6574a20f58b31ed901d0006bced4bnjn ); 27886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 27986c2349f3dd6574a20f58b31ed901d0006bced4bnjnBZ_EXTERN void BZ_API(BZ2_bzReadClose) ( 28086c2349f3dd6574a20f58b31ed901d0006bced4bnjn int* bzerror, 28186c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZFILE* b 28286c2349f3dd6574a20f58b31ed901d0006bced4bnjn ); 28386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 28486c2349f3dd6574a20f58b31ed901d0006bced4bnjnBZ_EXTERN void BZ_API(BZ2_bzReadGetUnused) ( 28586c2349f3dd6574a20f58b31ed901d0006bced4bnjn int* bzerror, 28686c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZFILE* b, 28786c2349f3dd6574a20f58b31ed901d0006bced4bnjn void** unused, 28886c2349f3dd6574a20f58b31ed901d0006bced4bnjn int* nUnused 28986c2349f3dd6574a20f58b31ed901d0006bced4bnjn ); 29086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 29186c2349f3dd6574a20f58b31ed901d0006bced4bnjnBZ_EXTERN int BZ_API(BZ2_bzRead) ( 29286c2349f3dd6574a20f58b31ed901d0006bced4bnjn int* bzerror, 29386c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZFILE* b, 29486c2349f3dd6574a20f58b31ed901d0006bced4bnjn void* buf, 29586c2349f3dd6574a20f58b31ed901d0006bced4bnjn int len 29686c2349f3dd6574a20f58b31ed901d0006bced4bnjn ); 29786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 29886c2349f3dd6574a20f58b31ed901d0006bced4bnjnBZ_EXTERN BZFILE* BZ_API(BZ2_bzWriteOpen) ( 29986c2349f3dd6574a20f58b31ed901d0006bced4bnjn int* bzerror, 30086c2349f3dd6574a20f58b31ed901d0006bced4bnjn FILE* f, 30186c2349f3dd6574a20f58b31ed901d0006bced4bnjn int blockSize100k, 30286c2349f3dd6574a20f58b31ed901d0006bced4bnjn int verbosity, 30386c2349f3dd6574a20f58b31ed901d0006bced4bnjn int workFactor 30486c2349f3dd6574a20f58b31ed901d0006bced4bnjn ); 30586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 30686c2349f3dd6574a20f58b31ed901d0006bced4bnjnBZ_EXTERN void BZ_API(BZ2_bzWrite) ( 30786c2349f3dd6574a20f58b31ed901d0006bced4bnjn int* bzerror, 30886c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZFILE* b, 30986c2349f3dd6574a20f58b31ed901d0006bced4bnjn void* buf, 31086c2349f3dd6574a20f58b31ed901d0006bced4bnjn int len 31186c2349f3dd6574a20f58b31ed901d0006bced4bnjn ); 31286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 31386c2349f3dd6574a20f58b31ed901d0006bced4bnjnBZ_EXTERN void BZ_API(BZ2_bzWriteClose) ( 31486c2349f3dd6574a20f58b31ed901d0006bced4bnjn int* bzerror, 31586c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZFILE* b, 31686c2349f3dd6574a20f58b31ed901d0006bced4bnjn int abandon, 31786c2349f3dd6574a20f58b31ed901d0006bced4bnjn unsigned int* nbytes_in, 31886c2349f3dd6574a20f58b31ed901d0006bced4bnjn unsigned int* nbytes_out 31986c2349f3dd6574a20f58b31ed901d0006bced4bnjn ); 32086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 32186c2349f3dd6574a20f58b31ed901d0006bced4bnjnBZ_EXTERN void BZ_API(BZ2_bzWriteClose64) ( 32286c2349f3dd6574a20f58b31ed901d0006bced4bnjn int* bzerror, 32386c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZFILE* b, 32486c2349f3dd6574a20f58b31ed901d0006bced4bnjn int abandon, 32586c2349f3dd6574a20f58b31ed901d0006bced4bnjn unsigned int* nbytes_in_lo32, 32686c2349f3dd6574a20f58b31ed901d0006bced4bnjn unsigned int* nbytes_in_hi32, 32786c2349f3dd6574a20f58b31ed901d0006bced4bnjn unsigned int* nbytes_out_lo32, 32886c2349f3dd6574a20f58b31ed901d0006bced4bnjn unsigned int* nbytes_out_hi32 32986c2349f3dd6574a20f58b31ed901d0006bced4bnjn ); 33086c2349f3dd6574a20f58b31ed901d0006bced4bnjn#endif 33186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 33286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 33386c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-- Utility functions --*/ 33486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 33586c2349f3dd6574a20f58b31ed901d0006bced4bnjnBZ_EXTERN int BZ_API(BZ2_bzBuffToBuffCompress) ( 33686c2349f3dd6574a20f58b31ed901d0006bced4bnjn char* dest, 33786c2349f3dd6574a20f58b31ed901d0006bced4bnjn unsigned int* destLen, 33886c2349f3dd6574a20f58b31ed901d0006bced4bnjn char* source, 33986c2349f3dd6574a20f58b31ed901d0006bced4bnjn unsigned int sourceLen, 34086c2349f3dd6574a20f58b31ed901d0006bced4bnjn int blockSize100k, 34186c2349f3dd6574a20f58b31ed901d0006bced4bnjn int verbosity, 34286c2349f3dd6574a20f58b31ed901d0006bced4bnjn int workFactor 34386c2349f3dd6574a20f58b31ed901d0006bced4bnjn ); 34486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 34586c2349f3dd6574a20f58b31ed901d0006bced4bnjnBZ_EXTERN int BZ_API(BZ2_bzBuffToBuffDecompress) ( 34686c2349f3dd6574a20f58b31ed901d0006bced4bnjn char* dest, 34786c2349f3dd6574a20f58b31ed901d0006bced4bnjn unsigned int* destLen, 34886c2349f3dd6574a20f58b31ed901d0006bced4bnjn char* source, 34986c2349f3dd6574a20f58b31ed901d0006bced4bnjn unsigned int sourceLen, 35086c2349f3dd6574a20f58b31ed901d0006bced4bnjn int small, 35186c2349f3dd6574a20f58b31ed901d0006bced4bnjn int verbosity 35286c2349f3dd6574a20f58b31ed901d0006bced4bnjn ); 35386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 35486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 35586c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-- 35686c2349f3dd6574a20f58b31ed901d0006bced4bnjn Code contributed by Yoshioka Tsuneo 35786c2349f3dd6574a20f58b31ed901d0006bced4bnjn (QWF00133@niftyserve.or.jp/tsuneo-y@is.aist-nara.ac.jp), 35886c2349f3dd6574a20f58b31ed901d0006bced4bnjn to support better zlib compatibility. 35986c2349f3dd6574a20f58b31ed901d0006bced4bnjn This code is not _officially_ part of libbzip2 (yet); 36086c2349f3dd6574a20f58b31ed901d0006bced4bnjn I haven't tested it, documented it, or considered the 36186c2349f3dd6574a20f58b31ed901d0006bced4bnjn threading-safeness of it. 36286c2349f3dd6574a20f58b31ed901d0006bced4bnjn If this code breaks, please contact both Yoshioka and me. 36386c2349f3dd6574a20f58b31ed901d0006bced4bnjn--*/ 36486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 36586c2349f3dd6574a20f58b31ed901d0006bced4bnjnBZ_EXTERN const char * BZ_API(BZ2_bzlibVersion) ( 36686c2349f3dd6574a20f58b31ed901d0006bced4bnjn void 36786c2349f3dd6574a20f58b31ed901d0006bced4bnjn ); 36886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 36986c2349f3dd6574a20f58b31ed901d0006bced4bnjn#ifndef BZ_NO_STDIO 37086c2349f3dd6574a20f58b31ed901d0006bced4bnjnBZ_EXTERN BZFILE * BZ_API(BZ2_bzopen) ( 37186c2349f3dd6574a20f58b31ed901d0006bced4bnjn const char *path, 37286c2349f3dd6574a20f58b31ed901d0006bced4bnjn const char *mode 37386c2349f3dd6574a20f58b31ed901d0006bced4bnjn ); 37486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 37586c2349f3dd6574a20f58b31ed901d0006bced4bnjnBZ_EXTERN BZFILE * BZ_API(BZ2_bzdopen) ( 37686c2349f3dd6574a20f58b31ed901d0006bced4bnjn int fd, 37786c2349f3dd6574a20f58b31ed901d0006bced4bnjn const char *mode 37886c2349f3dd6574a20f58b31ed901d0006bced4bnjn ); 37986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 38086c2349f3dd6574a20f58b31ed901d0006bced4bnjnBZ_EXTERN int BZ_API(BZ2_bzread) ( 38186c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZFILE* b, 38286c2349f3dd6574a20f58b31ed901d0006bced4bnjn void* buf, 38386c2349f3dd6574a20f58b31ed901d0006bced4bnjn int len 38486c2349f3dd6574a20f58b31ed901d0006bced4bnjn ); 38586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 38686c2349f3dd6574a20f58b31ed901d0006bced4bnjnBZ_EXTERN int BZ_API(BZ2_bzwrite) ( 38786c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZFILE* b, 38886c2349f3dd6574a20f58b31ed901d0006bced4bnjn void* buf, 38986c2349f3dd6574a20f58b31ed901d0006bced4bnjn int len 39086c2349f3dd6574a20f58b31ed901d0006bced4bnjn ); 39186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 39286c2349f3dd6574a20f58b31ed901d0006bced4bnjnBZ_EXTERN int BZ_API(BZ2_bzflush) ( 39386c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZFILE* b 39486c2349f3dd6574a20f58b31ed901d0006bced4bnjn ); 39586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 39686c2349f3dd6574a20f58b31ed901d0006bced4bnjnBZ_EXTERN void BZ_API(BZ2_bzclose) ( 39786c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZFILE* b 39886c2349f3dd6574a20f58b31ed901d0006bced4bnjn ); 39986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 40086c2349f3dd6574a20f58b31ed901d0006bced4bnjnBZ_EXTERN const char * BZ_API(BZ2_bzerror) ( 40186c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZFILE *b, 40286c2349f3dd6574a20f58b31ed901d0006bced4bnjn int *errnum 40386c2349f3dd6574a20f58b31ed901d0006bced4bnjn ); 40486c2349f3dd6574a20f58b31ed901d0006bced4bnjn#endif 40586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 40686c2349f3dd6574a20f58b31ed901d0006bced4bnjn#ifdef __cplusplus 40786c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 40886c2349f3dd6574a20f58b31ed901d0006bced4bnjn#endif 40986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 41086c2349f3dd6574a20f58b31ed901d0006bced4bnjn#endif 41186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 41286c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-------------------------------------------------------------*/ 41386c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*--- end bzlib.h ---*/ 41486c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-------------------------------------------------------------*/ 41586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 41686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 41786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 41886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 41986c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-- General stuff. --*/ 42086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 42186c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_VERSION "1.0.3, 17-Oct-2004" 42286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 42386c2349f3dd6574a20f58b31ed901d0006bced4bnjntypedef char Char; 42486c2349f3dd6574a20f58b31ed901d0006bced4bnjntypedef unsigned char Bool; 42586c2349f3dd6574a20f58b31ed901d0006bced4bnjntypedef unsigned char UChar; 42686c2349f3dd6574a20f58b31ed901d0006bced4bnjntypedef int Int32; 42786c2349f3dd6574a20f58b31ed901d0006bced4bnjntypedef unsigned int UInt32; 42886c2349f3dd6574a20f58b31ed901d0006bced4bnjntypedef short Int16; 42986c2349f3dd6574a20f58b31ed901d0006bced4bnjntypedef unsigned short UInt16; 43086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 43186c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define True ((Bool)1) 43286c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define False ((Bool)0) 43386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 43486c2349f3dd6574a20f58b31ed901d0006bced4bnjn#ifndef __GNUC__ 43586c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define __inline__ /* */ 43686c2349f3dd6574a20f58b31ed901d0006bced4bnjn#endif 43786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 43886c2349f3dd6574a20f58b31ed901d0006bced4bnjn#ifndef BZ_NO_STDIO 43986c2349f3dd6574a20f58b31ed901d0006bced4bnjnextern void BZ2_bz__AssertH__fail ( int errcode ); 44086c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define AssertH(cond,errcode) \ 44186c2349f3dd6574a20f58b31ed901d0006bced4bnjn { if (!(cond)) BZ2_bz__AssertH__fail ( errcode ); } 44286c2349f3dd6574a20f58b31ed901d0006bced4bnjn#if BZ_DEBUG 44386c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define AssertD(cond,msg) \ 44486c2349f3dd6574a20f58b31ed901d0006bced4bnjn { if (!(cond)) { \ 44586c2349f3dd6574a20f58b31ed901d0006bced4bnjn fprintf ( stderr, \ 44686c2349f3dd6574a20f58b31ed901d0006bced4bnjn "\n\nlibbzip2(debug build): internal error\n\t%s\n", msg );\ 44786c2349f3dd6574a20f58b31ed901d0006bced4bnjn exit(1); \ 44886c2349f3dd6574a20f58b31ed901d0006bced4bnjn }} 44986c2349f3dd6574a20f58b31ed901d0006bced4bnjn#else 45086c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define AssertD(cond,msg) /* */ 45186c2349f3dd6574a20f58b31ed901d0006bced4bnjn#endif 45286c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define VPrintf0(zf) \ 45386c2349f3dd6574a20f58b31ed901d0006bced4bnjn fprintf(stderr,zf) 45486c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define VPrintf1(zf,za1) \ 45586c2349f3dd6574a20f58b31ed901d0006bced4bnjn fprintf(stderr,zf,za1) 45686c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define VPrintf2(zf,za1,za2) \ 45786c2349f3dd6574a20f58b31ed901d0006bced4bnjn fprintf(stderr,zf,za1,za2) 45886c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define VPrintf3(zf,za1,za2,za3) \ 45986c2349f3dd6574a20f58b31ed901d0006bced4bnjn fprintf(stderr,zf,za1,za2,za3) 46086c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define VPrintf4(zf,za1,za2,za3,za4) \ 46186c2349f3dd6574a20f58b31ed901d0006bced4bnjn fprintf(stderr,zf,za1,za2,za3,za4) 46286c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define VPrintf5(zf,za1,za2,za3,za4,za5) \ 46386c2349f3dd6574a20f58b31ed901d0006bced4bnjn fprintf(stderr,zf,za1,za2,za3,za4,za5) 46486c2349f3dd6574a20f58b31ed901d0006bced4bnjn#else 46586c2349f3dd6574a20f58b31ed901d0006bced4bnjnextern void bz_internal_error ( int errcode ); 46686c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define AssertH(cond,errcode) \ 46786c2349f3dd6574a20f58b31ed901d0006bced4bnjn { if (!(cond)) bz_internal_error ( errcode ); } 46886c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define AssertD(cond,msg) /* */ 46986c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define VPrintf0(zf) \ 47086c2349f3dd6574a20f58b31ed901d0006bced4bnjn vex_printf(zf) 47186c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define VPrintf1(zf,za1) \ 47286c2349f3dd6574a20f58b31ed901d0006bced4bnjn vex_printf(zf,za1) 47386c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define VPrintf2(zf,za1,za2) \ 47486c2349f3dd6574a20f58b31ed901d0006bced4bnjn vex_printf(zf,za1,za2) 47586c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define VPrintf3(zf,za1,za2,za3) \ 47686c2349f3dd6574a20f58b31ed901d0006bced4bnjn vex_printf(zf,za1,za2,za3) 47786c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define VPrintf4(zf,za1,za2,za3,za4) \ 47886c2349f3dd6574a20f58b31ed901d0006bced4bnjn vex_printf(zf,za1,za2,za3,za4) 47986c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define VPrintf5(zf,za1,za2,za3,za4,za5) \ 48086c2349f3dd6574a20f58b31ed901d0006bced4bnjn vex_printf(zf,za1,za2,za3,za4,za5) 48186c2349f3dd6574a20f58b31ed901d0006bced4bnjn#endif 48286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 48386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 48486c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZALLOC(nnn) (strm->bzalloc)(strm->opaque,(nnn),1) 48586c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZFREE(ppp) (strm->bzfree)(strm->opaque,(ppp)) 48686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 48786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 48886c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-- Header bytes. --*/ 48986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 49086c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_HDR_B 0x42 /* 'B' */ 49186c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_HDR_Z 0x5a /* 'Z' */ 49286c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_HDR_h 0x68 /* 'h' */ 49386c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_HDR_0 0x30 /* '0' */ 49486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 49586c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-- Constants for the back end. --*/ 49686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 49786c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_MAX_ALPHA_SIZE 258 49886c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_MAX_CODE_LEN 23 49986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 50086c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_RUNA 0 50186c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_RUNB 1 50286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 50386c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_N_GROUPS 6 50486c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_G_SIZE 50 50586c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_N_ITERS 4 50686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 50786c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_MAX_SELECTORS (2 + (900000 / BZ_G_SIZE)) 50886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 50986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 51086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 51186c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-- Stuff for randomising repetitive blocks. --*/ 51286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 51386c2349f3dd6574a20f58b31ed901d0006bced4bnjnextern Int32 BZ2_rNums[512]; 51486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 51586c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_RAND_DECLS \ 51686c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 rNToGo; \ 51786c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 rTPos \ 51886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 51986c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_RAND_INIT_MASK \ 52086c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->rNToGo = 0; \ 52186c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->rTPos = 0 \ 52286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 52386c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_RAND_MASK ((s->rNToGo == 1) ? 1 : 0) 52486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 52586c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_RAND_UPD_MASK \ 52686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->rNToGo == 0) { \ 52786c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->rNToGo = BZ2_rNums[s->rTPos]; \ 52886c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->rTPos++; \ 52986c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->rTPos == 512) s->rTPos = 0; \ 53086c2349f3dd6574a20f58b31ed901d0006bced4bnjn } \ 53186c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->rNToGo--; 53286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 53386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 53486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 53586c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-- Stuff for doing CRCs. --*/ 53686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 53786c2349f3dd6574a20f58b31ed901d0006bced4bnjnextern UInt32 BZ2_crc32Table[256]; 53886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 53986c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_INITIALISE_CRC(crcVar) \ 54086c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ \ 54186c2349f3dd6574a20f58b31ed901d0006bced4bnjn crcVar = 0xffffffffL; \ 54286c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 54386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 54486c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_FINALISE_CRC(crcVar) \ 54586c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ \ 54686c2349f3dd6574a20f58b31ed901d0006bced4bnjn crcVar = ~(crcVar); \ 54786c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 54886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 54986c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_UPDATE_CRC(crcVar,cha) \ 55086c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ \ 55186c2349f3dd6574a20f58b31ed901d0006bced4bnjn crcVar = (crcVar << 8) ^ \ 55286c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ2_crc32Table[(crcVar >> 24) ^ \ 55386c2349f3dd6574a20f58b31ed901d0006bced4bnjn ((UChar)cha)]; \ 55486c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 55586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 55686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 55786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 55886c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-- States and modes for compression. --*/ 55986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 56086c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_M_IDLE 1 56186c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_M_RUNNING 2 56286c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_M_FLUSHING 3 56386c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_M_FINISHING 4 56486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 56586c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_S_OUTPUT 1 56686c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_S_INPUT 2 56786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 56886c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_N_RADIX 2 56986c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_N_QSORT 12 57086c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_N_SHELL 18 57186c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_N_OVERSHOOT (BZ_N_RADIX + BZ_N_QSORT + BZ_N_SHELL + 2) 57286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 57386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 57486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 57586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 57686c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-- Structure holding all the compression-side stuff. --*/ 57786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 57886c2349f3dd6574a20f58b31ed901d0006bced4bnjntypedef 57986c2349f3dd6574a20f58b31ed901d0006bced4bnjn struct { 58086c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* pointer back to the struct bz_stream */ 58186c2349f3dd6574a20f58b31ed901d0006bced4bnjn bz_stream* strm; 58286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 58386c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* mode this stream is in, and whether inputting */ 58486c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* or outputting data */ 58586c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 mode; 58686c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 state; 58786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 58886c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* remembers avail_in when flush/finish requested */ 58986c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt32 avail_in_expect; 59086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 59186c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* for doing the block sorting */ 59286c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt32* arr1; 59386c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt32* arr2; 59486c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt32* ftab; 59586c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 origPtr; 59686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 59786c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* aliases for arr1 and arr2 */ 59886c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt32* ptr; 59986c2349f3dd6574a20f58b31ed901d0006bced4bnjn UChar* block; 60086c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt16* mtfv; 60186c2349f3dd6574a20f58b31ed901d0006bced4bnjn UChar* zbits; 60286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 60386c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* for deciding when to use the fallback sorting algorithm */ 60486c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 workFactor; 60586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 60686c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* run-length-encoding of the input */ 60786c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt32 state_in_ch; 60886c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 state_in_len; 60986c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_RAND_DECLS; 61086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 61186c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* input and output limits and current posns */ 61286c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 nblock; 61386c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 nblockMAX; 61486c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 numZ; 61586c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 state_out_pos; 61686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 61786c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* map of bytes used in block */ 61886c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 nInUse; 61986c2349f3dd6574a20f58b31ed901d0006bced4bnjn Bool inUse[256]; 62086c2349f3dd6574a20f58b31ed901d0006bced4bnjn UChar unseqToSeq[256]; 62186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 62286c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* the buffer for bit stream creation */ 62386c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt32 bsBuff; 62486c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 bsLive; 62586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 62686c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* block and combined CRCs */ 62786c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt32 blockCRC; 62886c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt32 combinedCRC; 62986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 63086c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* misc administratium */ 63186c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 verbosity; 63286c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 blockNo; 63386c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 blockSize100k; 63486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 63586c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* stuff for coding the MTF values */ 63686c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 nMTF; 63786c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 mtfFreq [BZ_MAX_ALPHA_SIZE]; 63886c2349f3dd6574a20f58b31ed901d0006bced4bnjn UChar selector [BZ_MAX_SELECTORS]; 63986c2349f3dd6574a20f58b31ed901d0006bced4bnjn UChar selectorMtf[BZ_MAX_SELECTORS]; 64086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 64186c2349f3dd6574a20f58b31ed901d0006bced4bnjn UChar len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; 64286c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 code [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; 64386c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 rfreq [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; 64486c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* second dimension: only 3 needed; 4 makes index calculations faster */ 64586c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt32 len_pack[BZ_MAX_ALPHA_SIZE][4]; 64686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 64786c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 64886c2349f3dd6574a20f58b31ed901d0006bced4bnjn EState; 64986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 65086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 65186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 65286c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-- externs for compression. --*/ 65386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 65486c2349f3dd6574a20f58b31ed901d0006bced4bnjnextern void 65586c2349f3dd6574a20f58b31ed901d0006bced4bnjnBZ2_blockSort ( EState* ); 65686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 65786c2349f3dd6574a20f58b31ed901d0006bced4bnjnextern void 65886c2349f3dd6574a20f58b31ed901d0006bced4bnjnBZ2_compressBlock ( EState*, Bool ); 65986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 66086c2349f3dd6574a20f58b31ed901d0006bced4bnjnextern void 66186c2349f3dd6574a20f58b31ed901d0006bced4bnjnBZ2_bsInitWrite ( EState* ); 66286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 66386c2349f3dd6574a20f58b31ed901d0006bced4bnjnextern void 66486c2349f3dd6574a20f58b31ed901d0006bced4bnjnBZ2_hbAssignCodes ( Int32*, UChar*, Int32, Int32, Int32 ); 66586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 66686c2349f3dd6574a20f58b31ed901d0006bced4bnjnextern void 66786c2349f3dd6574a20f58b31ed901d0006bced4bnjnBZ2_hbMakeCodeLengths ( UChar*, Int32*, Int32, Int32 ); 66886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 66986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 67086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 67186c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-- states for decompression. --*/ 67286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 67386c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_X_IDLE 1 67486c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_X_OUTPUT 2 67586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 67686c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_X_MAGIC_1 10 67786c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_X_MAGIC_2 11 67886c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_X_MAGIC_3 12 67986c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_X_MAGIC_4 13 68086c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_X_BLKHDR_1 14 68186c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_X_BLKHDR_2 15 68286c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_X_BLKHDR_3 16 68386c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_X_BLKHDR_4 17 68486c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_X_BLKHDR_5 18 68586c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_X_BLKHDR_6 19 68686c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_X_BCRC_1 20 68786c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_X_BCRC_2 21 68886c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_X_BCRC_3 22 68986c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_X_BCRC_4 23 69086c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_X_RANDBIT 24 69186c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_X_ORIGPTR_1 25 69286c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_X_ORIGPTR_2 26 69386c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_X_ORIGPTR_3 27 69486c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_X_MAPPING_1 28 69586c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_X_MAPPING_2 29 69686c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_X_SELECTOR_1 30 69786c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_X_SELECTOR_2 31 69886c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_X_SELECTOR_3 32 69986c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_X_CODING_1 33 70086c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_X_CODING_2 34 70186c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_X_CODING_3 35 70286c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_X_MTF_1 36 70386c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_X_MTF_2 37 70486c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_X_MTF_3 38 70586c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_X_MTF_4 39 70686c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_X_MTF_5 40 70786c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_X_MTF_6 41 70886c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_X_ENDHDR_2 42 70986c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_X_ENDHDR_3 43 71086c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_X_ENDHDR_4 44 71186c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_X_ENDHDR_5 45 71286c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_X_ENDHDR_6 46 71386c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_X_CCRC_1 47 71486c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_X_CCRC_2 48 71586c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_X_CCRC_3 49 71686c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_X_CCRC_4 50 71786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 71886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 71986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 72086c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-- Constants for the fast MTF decoder. --*/ 72186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 72286c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define MTFA_SIZE 4096 72386c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define MTFL_SIZE 16 72486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 72586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 72686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 72786c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-- Structure holding all the decompression-side stuff. --*/ 72886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 72986c2349f3dd6574a20f58b31ed901d0006bced4bnjntypedef 73086c2349f3dd6574a20f58b31ed901d0006bced4bnjn struct { 73186c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* pointer back to the struct bz_stream */ 73286c2349f3dd6574a20f58b31ed901d0006bced4bnjn bz_stream* strm; 73386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 73486c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* state indicator for this stream */ 73586c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 state; 73686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 73786c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* for doing the final run-length decoding */ 73886c2349f3dd6574a20f58b31ed901d0006bced4bnjn UChar state_out_ch; 73986c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 state_out_len; 74086c2349f3dd6574a20f58b31ed901d0006bced4bnjn Bool blockRandomised; 74186c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_RAND_DECLS; 74286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 74386c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* the buffer for bit stream reading */ 74486c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt32 bsBuff; 74586c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 bsLive; 74686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 74786c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* misc administratium */ 74886c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 blockSize100k; 74986c2349f3dd6574a20f58b31ed901d0006bced4bnjn Bool smallDecompress; 75086c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 currBlockNo; 75186c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 verbosity; 75286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 75386c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* for undoing the Burrows-Wheeler transform */ 75486c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 origPtr; 75586c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt32 tPos; 75686c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 k0; 75786c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 unzftab[256]; 75886c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 nblock_used; 75986c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 cftab[257]; 76086c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 cftabCopy[257]; 76186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 76286c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* for undoing the Burrows-Wheeler transform (FAST) */ 76386c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt32 *tt; 76486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 76586c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* for undoing the Burrows-Wheeler transform (SMALL) */ 76686c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt16 *ll16; 76786c2349f3dd6574a20f58b31ed901d0006bced4bnjn UChar *ll4; 76886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 76986c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* stored and calculated CRCs */ 77086c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt32 storedBlockCRC; 77186c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt32 storedCombinedCRC; 77286c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt32 calculatedBlockCRC; 77386c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt32 calculatedCombinedCRC; 77486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 77586c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* map of bytes used in block */ 77686c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 nInUse; 77786c2349f3dd6574a20f58b31ed901d0006bced4bnjn Bool inUse[256]; 77886c2349f3dd6574a20f58b31ed901d0006bced4bnjn Bool inUse16[16]; 77986c2349f3dd6574a20f58b31ed901d0006bced4bnjn UChar seqToUnseq[256]; 78086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 78186c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* for decoding the MTF values */ 78286c2349f3dd6574a20f58b31ed901d0006bced4bnjn UChar mtfa [MTFA_SIZE]; 78386c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 mtfbase[256 / MTFL_SIZE]; 78486c2349f3dd6574a20f58b31ed901d0006bced4bnjn UChar selector [BZ_MAX_SELECTORS]; 78586c2349f3dd6574a20f58b31ed901d0006bced4bnjn UChar selectorMtf[BZ_MAX_SELECTORS]; 78686c2349f3dd6574a20f58b31ed901d0006bced4bnjn UChar len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; 78786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 78886c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 limit [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; 78986c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 base [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; 79086c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 perm [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; 79186c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 minLens[BZ_N_GROUPS]; 79286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 79386c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* save area for scalars in the main decompress code */ 79486c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 save_i; 79586c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 save_j; 79686c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 save_t; 79786c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 save_alphaSize; 79886c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 save_nGroups; 79986c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 save_nSelectors; 80086c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 save_EOB; 80186c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 save_groupNo; 80286c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 save_groupPos; 80386c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 save_nextSym; 80486c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 save_nblockMAX; 80586c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 save_nblock; 80686c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 save_es; 80786c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 save_N; 80886c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 save_curr; 80986c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 save_zt; 81086c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 save_zn; 81186c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 save_zvec; 81286c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 save_zj; 81386c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 save_gSel; 81486c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 save_gMinlen; 81586c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32* save_gLimit; 81686c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32* save_gBase; 81786c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32* save_gPerm; 81886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 81986c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 82086c2349f3dd6574a20f58b31ed901d0006bced4bnjn DState; 82186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 82286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 82386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 82486c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-- Macros for decompression. --*/ 82586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 82686c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_GET_FAST(cccc) \ 82786c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->tPos = s->tt[s->tPos]; \ 82886c2349f3dd6574a20f58b31ed901d0006bced4bnjn cccc = (UChar)(s->tPos & 0xff); \ 82986c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->tPos >>= 8; 83086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 83186c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_GET_FAST_C(cccc) \ 83286c2349f3dd6574a20f58b31ed901d0006bced4bnjn c_tPos = c_tt[c_tPos]; \ 83386c2349f3dd6574a20f58b31ed901d0006bced4bnjn cccc = (UChar)(c_tPos & 0xff); \ 83486c2349f3dd6574a20f58b31ed901d0006bced4bnjn c_tPos >>= 8; 83586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 83686c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define SET_LL4(i,n) \ 83786c2349f3dd6574a20f58b31ed901d0006bced4bnjn { if (((i) & 0x1) == 0) \ 83886c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->ll4[(i) >> 1] = (s->ll4[(i) >> 1] & 0xf0) | (n); else \ 83986c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->ll4[(i) >> 1] = (s->ll4[(i) >> 1] & 0x0f) | ((n) << 4); \ 84086c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 84186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 84286c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define GET_LL4(i) \ 84386c2349f3dd6574a20f58b31ed901d0006bced4bnjn ((((UInt32)(s->ll4[(i) >> 1])) >> (((i) << 2) & 0x4)) & 0xF) 84486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 84586c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define SET_LL(i,n) \ 84686c2349f3dd6574a20f58b31ed901d0006bced4bnjn { s->ll16[i] = (UInt16)(n & 0x0000ffff); \ 84786c2349f3dd6574a20f58b31ed901d0006bced4bnjn SET_LL4(i, n >> 16); \ 84886c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 84986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 85086c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define GET_LL(i) \ 85186c2349f3dd6574a20f58b31ed901d0006bced4bnjn (((UInt32)s->ll16[i]) | (GET_LL4(i) << 16)) 85286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 85386c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_GET_SMALL(cccc) \ 85486c2349f3dd6574a20f58b31ed901d0006bced4bnjn cccc = BZ2_indexIntoF ( s->tPos, s->cftab ); \ 85586c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->tPos = GET_LL(s->tPos); 85686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 85786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 85886c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-- externs for decompression. --*/ 85986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 86086c2349f3dd6574a20f58b31ed901d0006bced4bnjnextern Int32 86186c2349f3dd6574a20f58b31ed901d0006bced4bnjnBZ2_indexIntoF ( Int32, Int32* ); 86286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 86386c2349f3dd6574a20f58b31ed901d0006bced4bnjnextern Int32 86486c2349f3dd6574a20f58b31ed901d0006bced4bnjnBZ2_decompress ( DState* ); 86586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 86686c2349f3dd6574a20f58b31ed901d0006bced4bnjnextern void 86786c2349f3dd6574a20f58b31ed901d0006bced4bnjnBZ2_hbCreateDecodeTables ( Int32*, Int32*, Int32*, UChar*, 86886c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32, Int32, Int32 ); 86986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 87086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 87186c2349f3dd6574a20f58b31ed901d0006bced4bnjn#endif 87286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 87386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 87486c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-- BZ_NO_STDIO seems to make NULL disappear on some platforms. --*/ 87586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 87686c2349f3dd6574a20f58b31ed901d0006bced4bnjn#ifdef BZ_NO_STDIO 87786c2349f3dd6574a20f58b31ed901d0006bced4bnjn#ifndef NULL 87886c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define NULL 0 87986c2349f3dd6574a20f58b31ed901d0006bced4bnjn#endif 88086c2349f3dd6574a20f58b31ed901d0006bced4bnjn#endif 88186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 88286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 88386c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-------------------------------------------------------------*/ 88486c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*--- end bzlib_private.h ---*/ 88586c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-------------------------------------------------------------*/ 88686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 88786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 88886c2349f3dd6574a20f58b31ed901d0006bced4bnjn/* Something which has the same size as void* on the host. That is, 88986c2349f3dd6574a20f58b31ed901d0006bced4bnjn it is 32 bits on a 32-bit host and 64 bits on a 64-bit host, and so 89086c2349f3dd6574a20f58b31ed901d0006bced4bnjn it can safely be coerced to and from a pointer type on the host 89186c2349f3dd6574a20f58b31ed901d0006bced4bnjn machine. */ 89286c2349f3dd6574a20f58b31ed901d0006bced4bnjntypedef unsigned long HWord; 89386c2349f3dd6574a20f58b31ed901d0006bced4bnjntypedef char HChar; 89486c2349f3dd6574a20f58b31ed901d0006bced4bnjntypedef signed int Int; 89586c2349f3dd6574a20f58b31ed901d0006bced4bnjntypedef unsigned int UInt; 89686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 89786c2349f3dd6574a20f58b31ed901d0006bced4bnjntypedef signed long long int Long; 89886c2349f3dd6574a20f58b31ed901d0006bced4bnjntypedef unsigned long long int ULong; 89986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 90086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 90186c2349f3dd6574a20f58b31ed901d0006bced4bnjn///////////////////////////////////////////////////////////////////// 90286c2349f3dd6574a20f58b31ed901d0006bced4bnjn///////////////////////////////////////////////////////////////////// 90386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 90486c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic HWord (*serviceFn)(HWord,HWord) = 0; 90586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 90686c2349f3dd6574a20f58b31ed901d0006bced4bnjn#if 0 90786c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic char* my_strcpy ( char* dest, const char* src ) 90886c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 90986c2349f3dd6574a20f58b31ed901d0006bced4bnjn char* dest_orig = dest; 91086c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (*src) *dest++ = *src++; 91186c2349f3dd6574a20f58b31ed901d0006bced4bnjn *dest = 0; 91286c2349f3dd6574a20f58b31ed901d0006bced4bnjn return dest_orig; 91386c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 91486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 91586c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic void* my_memcpy ( void *dest, const void *src, int sz ) 91686c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 91786c2349f3dd6574a20f58b31ed901d0006bced4bnjn const char *s = (const char *)src; 91886c2349f3dd6574a20f58b31ed901d0006bced4bnjn char *d = (char *)dest; 91986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 92086c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (sz--) 92186c2349f3dd6574a20f58b31ed901d0006bced4bnjn *d++ = *s++; 92286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 92386c2349f3dd6574a20f58b31ed901d0006bced4bnjn return dest; 92486c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 92586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 92686c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic void* my_memmove( void *dst, const void *src, unsigned int len ) 92786c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 92886c2349f3dd6574a20f58b31ed901d0006bced4bnjn register char *d; 92986c2349f3dd6574a20f58b31ed901d0006bced4bnjn register char *s; 93086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if ( dst > src ) { 93186c2349f3dd6574a20f58b31ed901d0006bced4bnjn d = (char *)dst + len - 1; 93286c2349f3dd6574a20f58b31ed901d0006bced4bnjn s = (char *)src + len - 1; 93386c2349f3dd6574a20f58b31ed901d0006bced4bnjn while ( len >= 4 ) { 93486c2349f3dd6574a20f58b31ed901d0006bced4bnjn *d-- = *s--; 93586c2349f3dd6574a20f58b31ed901d0006bced4bnjn *d-- = *s--; 93686c2349f3dd6574a20f58b31ed901d0006bced4bnjn *d-- = *s--; 93786c2349f3dd6574a20f58b31ed901d0006bced4bnjn *d-- = *s--; 93886c2349f3dd6574a20f58b31ed901d0006bced4bnjn len -= 4; 93986c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 94086c2349f3dd6574a20f58b31ed901d0006bced4bnjn while ( len-- ) { 94186c2349f3dd6574a20f58b31ed901d0006bced4bnjn *d-- = *s--; 94286c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 94386c2349f3dd6574a20f58b31ed901d0006bced4bnjn } else if ( dst < src ) { 94486c2349f3dd6574a20f58b31ed901d0006bced4bnjn d = (char *)dst; 94586c2349f3dd6574a20f58b31ed901d0006bced4bnjn s = (char *)src; 94686c2349f3dd6574a20f58b31ed901d0006bced4bnjn while ( len >= 4 ) { 94786c2349f3dd6574a20f58b31ed901d0006bced4bnjn *d++ = *s++; 94886c2349f3dd6574a20f58b31ed901d0006bced4bnjn *d++ = *s++; 94986c2349f3dd6574a20f58b31ed901d0006bced4bnjn *d++ = *s++; 95086c2349f3dd6574a20f58b31ed901d0006bced4bnjn *d++ = *s++; 95186c2349f3dd6574a20f58b31ed901d0006bced4bnjn len -= 4; 95286c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 95386c2349f3dd6574a20f58b31ed901d0006bced4bnjn while ( len-- ) { 95486c2349f3dd6574a20f58b31ed901d0006bced4bnjn *d++ = *s++; 95586c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 95686c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 95786c2349f3dd6574a20f58b31ed901d0006bced4bnjn return dst; 95886c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 95986c2349f3dd6574a20f58b31ed901d0006bced4bnjn#endif 96086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 96186c2349f3dd6574a20f58b31ed901d0006bced4bnjnchar* my_strcat ( char* dest, const char* src ) 96286c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 96386c2349f3dd6574a20f58b31ed901d0006bced4bnjn char* dest_orig = dest; 96486c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (*dest) dest++; 96586c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (*src) *dest++ = *src++; 96686c2349f3dd6574a20f58b31ed901d0006bced4bnjn *dest = 0; 96786c2349f3dd6574a20f58b31ed901d0006bced4bnjn return dest_orig; 96886c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 96986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 97086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 97186c2349f3dd6574a20f58b31ed901d0006bced4bnjn///////////////////////////////////////////////////////////////////// 97286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 97386c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic void vex_log_bytes ( char* p, int n ) 97486c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 97586c2349f3dd6574a20f58b31ed901d0006bced4bnjn int i; 97686c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i < n; i++) 97786c2349f3dd6574a20f58b31ed901d0006bced4bnjn (*serviceFn)( 1, (int)p[i] ); 97886c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 97986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 98086c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------------*/ 98186c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*--- vex_printf ---*/ 98286c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------------*/ 98386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 98486c2349f3dd6574a20f58b31ed901d0006bced4bnjn/* This should be the only <...> include in the entire VEX library. 98586c2349f3dd6574a20f58b31ed901d0006bced4bnjn New code for vex_util.c should go above this point. */ 98686c2349f3dd6574a20f58b31ed901d0006bced4bnjn#include <stdarg.h> 98786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 98886c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic HChar vex_toupper ( HChar c ) 98986c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 99086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (c >= 'a' && c <= 'z') 99186c2349f3dd6574a20f58b31ed901d0006bced4bnjn return c + ('A' - 'a'); 99286c2349f3dd6574a20f58b31ed901d0006bced4bnjn else 99386c2349f3dd6574a20f58b31ed901d0006bced4bnjn return c; 99486c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 99586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 99686c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic Int vex_strlen ( const HChar* str ) 99786c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 99886c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int i = 0; 99986c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (str[i] != 0) i++; 100086c2349f3dd6574a20f58b31ed901d0006bced4bnjn return i; 100186c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 100286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 100386c2349f3dd6574a20f58b31ed901d0006bced4bnjnBool vex_streq ( const HChar* s1, const HChar* s2 ) 100486c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 100586c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (True) { 100686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (*s1 == 0 && *s2 == 0) 100786c2349f3dd6574a20f58b31ed901d0006bced4bnjn return True; 100886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (*s1 != *s2) 100986c2349f3dd6574a20f58b31ed901d0006bced4bnjn return False; 101086c2349f3dd6574a20f58b31ed901d0006bced4bnjn s1++; 101186c2349f3dd6574a20f58b31ed901d0006bced4bnjn s2++; 101286c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 101386c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 101486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 101586c2349f3dd6574a20f58b31ed901d0006bced4bnjn/* Some flags. */ 101686c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define VG_MSG_SIGNED 1 /* The value is signed. */ 101786c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define VG_MSG_ZJUSTIFY 2 /* Must justify with '0'. */ 101886c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define VG_MSG_LJUSTIFY 4 /* Must justify on the left. */ 101986c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define VG_MSG_PAREN 8 /* Parenthesize if present (for %y) */ 102086c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define VG_MSG_COMMA 16 /* Add commas to numbers (for %d, %u) */ 102186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 102286c2349f3dd6574a20f58b31ed901d0006bced4bnjn/* Copy a string into the buffer. */ 102386c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic UInt 102486c2349f3dd6574a20f58b31ed901d0006bced4bnjnmyvprintf_str ( void(*send)(HChar), Int flags, Int width, HChar* str, 102586c2349f3dd6574a20f58b31ed901d0006bced4bnjn Bool capitalise ) 102686c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 102786c2349f3dd6574a20f58b31ed901d0006bced4bnjn# define MAYBE_TOUPPER(ch) (capitalise ? vex_toupper(ch) : (ch)) 102886c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt ret = 0; 102986c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int i, extra; 103086c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int len = vex_strlen(str); 103186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 103286c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (width == 0) { 103386c2349f3dd6574a20f58b31ed901d0006bced4bnjn ret += len; 103486c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i < len; i++) 103586c2349f3dd6574a20f58b31ed901d0006bced4bnjn send(MAYBE_TOUPPER(str[i])); 103686c2349f3dd6574a20f58b31ed901d0006bced4bnjn return ret; 103786c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 103886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 103986c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (len > width) { 104086c2349f3dd6574a20f58b31ed901d0006bced4bnjn ret += width; 104186c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i < width; i++) 104286c2349f3dd6574a20f58b31ed901d0006bced4bnjn send(MAYBE_TOUPPER(str[i])); 104386c2349f3dd6574a20f58b31ed901d0006bced4bnjn return ret; 104486c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 104586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 104686c2349f3dd6574a20f58b31ed901d0006bced4bnjn extra = width - len; 104786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (flags & VG_MSG_LJUSTIFY) { 104886c2349f3dd6574a20f58b31ed901d0006bced4bnjn ret += extra; 104986c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i < extra; i++) 105086c2349f3dd6574a20f58b31ed901d0006bced4bnjn send(' '); 105186c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 105286c2349f3dd6574a20f58b31ed901d0006bced4bnjn ret += len; 105386c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i < len; i++) 105486c2349f3dd6574a20f58b31ed901d0006bced4bnjn send(MAYBE_TOUPPER(str[i])); 105586c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (!(flags & VG_MSG_LJUSTIFY)) { 105686c2349f3dd6574a20f58b31ed901d0006bced4bnjn ret += extra; 105786c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i < extra; i++) 105886c2349f3dd6574a20f58b31ed901d0006bced4bnjn send(' '); 105986c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 106086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 106186c2349f3dd6574a20f58b31ed901d0006bced4bnjn# undef MAYBE_TOUPPER 106286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 106386c2349f3dd6574a20f58b31ed901d0006bced4bnjn return ret; 106486c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 106586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 106686c2349f3dd6574a20f58b31ed901d0006bced4bnjn/* Write P into the buffer according to these args: 106786c2349f3dd6574a20f58b31ed901d0006bced4bnjn * If SIGN is true, p is a signed. 106886c2349f3dd6574a20f58b31ed901d0006bced4bnjn * BASE is the base. 106986c2349f3dd6574a20f58b31ed901d0006bced4bnjn * If WITH_ZERO is true, '0' must be added. 107086c2349f3dd6574a20f58b31ed901d0006bced4bnjn * WIDTH is the width of the field. 107186c2349f3dd6574a20f58b31ed901d0006bced4bnjn */ 107286c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic UInt 107386c2349f3dd6574a20f58b31ed901d0006bced4bnjnmyvprintf_int64 ( void(*send)(HChar), Int flags, Int base, Int width, ULong pL) 107486c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 107586c2349f3dd6574a20f58b31ed901d0006bced4bnjn HChar buf[40]; 107686c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int ind = 0; 107786c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int i, nc = 0; 107886c2349f3dd6574a20f58b31ed901d0006bced4bnjn Bool neg = False; 107986c2349f3dd6574a20f58b31ed901d0006bced4bnjn HChar *digits = "0123456789ABCDEF"; 108086c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt ret = 0; 108186c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt p = (UInt)pL; 108286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 108386c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (base < 2 || base > 16) 108486c2349f3dd6574a20f58b31ed901d0006bced4bnjn return ret; 108586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 108686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if ((flags & VG_MSG_SIGNED) && (Int)p < 0) { 108786c2349f3dd6574a20f58b31ed901d0006bced4bnjn p = - (Int)p; 108886c2349f3dd6574a20f58b31ed901d0006bced4bnjn neg = True; 108986c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 109086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 109186c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (p == 0) 109286c2349f3dd6574a20f58b31ed901d0006bced4bnjn buf[ind++] = '0'; 109386c2349f3dd6574a20f58b31ed901d0006bced4bnjn else { 109486c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (p > 0) { 109586c2349f3dd6574a20f58b31ed901d0006bced4bnjn if ((flags & VG_MSG_COMMA) && 10 == base && 109686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0 == (ind-nc) % 3 && 0 != ind) 109786c2349f3dd6574a20f58b31ed901d0006bced4bnjn { 109886c2349f3dd6574a20f58b31ed901d0006bced4bnjn buf[ind++] = ','; 109986c2349f3dd6574a20f58b31ed901d0006bced4bnjn nc++; 110086c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 110186c2349f3dd6574a20f58b31ed901d0006bced4bnjn buf[ind++] = digits[p % base]; 110286c2349f3dd6574a20f58b31ed901d0006bced4bnjn p /= base; 110386c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 110486c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 110586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 110686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (neg) 110786c2349f3dd6574a20f58b31ed901d0006bced4bnjn buf[ind++] = '-'; 110886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 110986c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (width > 0 && !(flags & VG_MSG_LJUSTIFY)) { 111086c2349f3dd6574a20f58b31ed901d0006bced4bnjn for(; ind < width; ind++) { 111186c2349f3dd6574a20f58b31ed901d0006bced4bnjn //vassert(ind < 39); 111286c2349f3dd6574a20f58b31ed901d0006bced4bnjn buf[ind] = ((flags & VG_MSG_ZJUSTIFY) ? '0': ' '); 111386c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 111486c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 111586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 111686c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* Reverse copy to buffer. */ 111786c2349f3dd6574a20f58b31ed901d0006bced4bnjn ret += ind; 111886c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = ind -1; i >= 0; i--) { 111986c2349f3dd6574a20f58b31ed901d0006bced4bnjn send(buf[i]); 112086c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 112186c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (width > 0 && (flags & VG_MSG_LJUSTIFY)) { 112286c2349f3dd6574a20f58b31ed901d0006bced4bnjn for(; ind < width; ind++) { 112386c2349f3dd6574a20f58b31ed901d0006bced4bnjn ret++; 112486c2349f3dd6574a20f58b31ed901d0006bced4bnjn send(' '); // Never pad with zeroes on RHS -- changes the value! 112586c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 112686c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 112786c2349f3dd6574a20f58b31ed901d0006bced4bnjn return ret; 112886c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 112986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 113086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 113186c2349f3dd6574a20f58b31ed901d0006bced4bnjn/* A simple vprintf(). */ 113286c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic 113386c2349f3dd6574a20f58b31ed901d0006bced4bnjnUInt vprintf_wrk ( void(*send)(HChar), const HChar *format, va_list vargs ) 113486c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 113586c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt ret = 0; 113686c2349f3dd6574a20f58b31ed901d0006bced4bnjn int i; 113786c2349f3dd6574a20f58b31ed901d0006bced4bnjn int flags; 113886c2349f3dd6574a20f58b31ed901d0006bced4bnjn int width; 113986c2349f3dd6574a20f58b31ed901d0006bced4bnjn Bool is_long; 114086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 114186c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* We assume that vargs has already been initialised by the 114286c2349f3dd6574a20f58b31ed901d0006bced4bnjn caller, using va_start, and that the caller will similarly 114386c2349f3dd6574a20f58b31ed901d0006bced4bnjn clean up with va_end. 114486c2349f3dd6574a20f58b31ed901d0006bced4bnjn */ 114586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 114686c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; format[i] != 0; i++) { 114786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (format[i] != '%') { 114886c2349f3dd6574a20f58b31ed901d0006bced4bnjn send(format[i]); 114986c2349f3dd6574a20f58b31ed901d0006bced4bnjn ret++; 115086c2349f3dd6574a20f58b31ed901d0006bced4bnjn continue; 115186c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 115286c2349f3dd6574a20f58b31ed901d0006bced4bnjn i++; 115386c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* A '%' has been found. Ignore a trailing %. */ 115486c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (format[i] == 0) 115586c2349f3dd6574a20f58b31ed901d0006bced4bnjn break; 115686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (format[i] == '%') { 115786c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* `%%' is replaced by `%'. */ 115886c2349f3dd6574a20f58b31ed901d0006bced4bnjn send('%'); 115986c2349f3dd6574a20f58b31ed901d0006bced4bnjn ret++; 116086c2349f3dd6574a20f58b31ed901d0006bced4bnjn continue; 116186c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 116286c2349f3dd6574a20f58b31ed901d0006bced4bnjn flags = 0; 116386c2349f3dd6574a20f58b31ed901d0006bced4bnjn is_long = False; 116486c2349f3dd6574a20f58b31ed901d0006bced4bnjn width = 0; /* length of the field. */ 116586c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (format[i] == '(') { 116686c2349f3dd6574a20f58b31ed901d0006bced4bnjn flags |= VG_MSG_PAREN; 116786c2349f3dd6574a20f58b31ed901d0006bced4bnjn i++; 116886c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 116986c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* If ',' follows '%', commas will be inserted. */ 117086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (format[i] == ',') { 117186c2349f3dd6574a20f58b31ed901d0006bced4bnjn flags |= VG_MSG_COMMA; 117286c2349f3dd6574a20f58b31ed901d0006bced4bnjn i++; 117386c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 117486c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* If '-' follows '%', justify on the left. */ 117586c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (format[i] == '-') { 117686c2349f3dd6574a20f58b31ed901d0006bced4bnjn flags |= VG_MSG_LJUSTIFY; 117786c2349f3dd6574a20f58b31ed901d0006bced4bnjn i++; 117886c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 117986c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* If '0' follows '%', pads will be inserted. */ 118086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (format[i] == '0') { 118186c2349f3dd6574a20f58b31ed901d0006bced4bnjn flags |= VG_MSG_ZJUSTIFY; 118286c2349f3dd6574a20f58b31ed901d0006bced4bnjn i++; 118386c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 118486c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* Compute the field length. */ 118586c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (format[i] >= '0' && format[i] <= '9') { 118686c2349f3dd6574a20f58b31ed901d0006bced4bnjn width *= 10; 118786c2349f3dd6574a20f58b31ed901d0006bced4bnjn width += format[i++] - '0'; 118886c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 118986c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (format[i] == 'l') { 119086c2349f3dd6574a20f58b31ed901d0006bced4bnjn i++; 119186c2349f3dd6574a20f58b31ed901d0006bced4bnjn is_long = True; 119286c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 119386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 119486c2349f3dd6574a20f58b31ed901d0006bced4bnjn switch (format[i]) { 119586c2349f3dd6574a20f58b31ed901d0006bced4bnjn case 'd': /* %d */ 119686c2349f3dd6574a20f58b31ed901d0006bced4bnjn flags |= VG_MSG_SIGNED; 119786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (is_long) 119886c2349f3dd6574a20f58b31ed901d0006bced4bnjn ret += myvprintf_int64(send, flags, 10, width, 119986c2349f3dd6574a20f58b31ed901d0006bced4bnjn (ULong)(va_arg (vargs, Long))); 120086c2349f3dd6574a20f58b31ed901d0006bced4bnjn else 120186c2349f3dd6574a20f58b31ed901d0006bced4bnjn ret += myvprintf_int64(send, flags, 10, width, 120286c2349f3dd6574a20f58b31ed901d0006bced4bnjn (ULong)(va_arg (vargs, Int))); 120386c2349f3dd6574a20f58b31ed901d0006bced4bnjn break; 120486c2349f3dd6574a20f58b31ed901d0006bced4bnjn case 'u': /* %u */ 120586c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (is_long) 120686c2349f3dd6574a20f58b31ed901d0006bced4bnjn ret += myvprintf_int64(send, flags, 10, width, 120786c2349f3dd6574a20f58b31ed901d0006bced4bnjn (ULong)(va_arg (vargs, ULong))); 120886c2349f3dd6574a20f58b31ed901d0006bced4bnjn else 120986c2349f3dd6574a20f58b31ed901d0006bced4bnjn ret += myvprintf_int64(send, flags, 10, width, 121086c2349f3dd6574a20f58b31ed901d0006bced4bnjn (ULong)(va_arg (vargs, UInt))); 121186c2349f3dd6574a20f58b31ed901d0006bced4bnjn break; 121286c2349f3dd6574a20f58b31ed901d0006bced4bnjn case 'p': /* %p */ 121386c2349f3dd6574a20f58b31ed901d0006bced4bnjn ret += 2; 121486c2349f3dd6574a20f58b31ed901d0006bced4bnjn send('0'); 121586c2349f3dd6574a20f58b31ed901d0006bced4bnjn send('x'); 121686c2349f3dd6574a20f58b31ed901d0006bced4bnjn ret += myvprintf_int64(send, flags, 16, width, 121786c2349f3dd6574a20f58b31ed901d0006bced4bnjn (ULong)((HWord)va_arg (vargs, void *))); 121886c2349f3dd6574a20f58b31ed901d0006bced4bnjn break; 121986c2349f3dd6574a20f58b31ed901d0006bced4bnjn case 'x': /* %x */ 122086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (is_long) 122186c2349f3dd6574a20f58b31ed901d0006bced4bnjn ret += myvprintf_int64(send, flags, 16, width, 122286c2349f3dd6574a20f58b31ed901d0006bced4bnjn (ULong)(va_arg (vargs, ULong))); 122386c2349f3dd6574a20f58b31ed901d0006bced4bnjn else 122486c2349f3dd6574a20f58b31ed901d0006bced4bnjn ret += myvprintf_int64(send, flags, 16, width, 122586c2349f3dd6574a20f58b31ed901d0006bced4bnjn (ULong)(va_arg (vargs, UInt))); 122686c2349f3dd6574a20f58b31ed901d0006bced4bnjn break; 122786c2349f3dd6574a20f58b31ed901d0006bced4bnjn case 'c': /* %c */ 122886c2349f3dd6574a20f58b31ed901d0006bced4bnjn ret++; 122986c2349f3dd6574a20f58b31ed901d0006bced4bnjn send((va_arg (vargs, int))); 123086c2349f3dd6574a20f58b31ed901d0006bced4bnjn break; 123186c2349f3dd6574a20f58b31ed901d0006bced4bnjn case 's': case 'S': { /* %s */ 123286c2349f3dd6574a20f58b31ed901d0006bced4bnjn char *str = va_arg (vargs, char *); 123386c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (str == (char*) 0) str = "(null)"; 123486c2349f3dd6574a20f58b31ed901d0006bced4bnjn ret += myvprintf_str(send, flags, width, str, 123586c2349f3dd6574a20f58b31ed901d0006bced4bnjn (format[i]=='S')); 123686c2349f3dd6574a20f58b31ed901d0006bced4bnjn break; 123786c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 123886c2349f3dd6574a20f58b31ed901d0006bced4bnjn# if 0 123986c2349f3dd6574a20f58b31ed901d0006bced4bnjn case 'y': { /* %y - print symbol */ 124086c2349f3dd6574a20f58b31ed901d0006bced4bnjn Addr a = va_arg(vargs, Addr); 124186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 124246cc04521acf2827eb33310fadc119bf2dc039e4florian HChar *name; 124346cc04521acf2827eb33310fadc119bf2dc039e4florian if (VG_(get_fnname_w_offset)(a, &name)) { 124446cc04521acf2827eb33310fadc119bf2dc039e4florian HChar buf[1 + VG_strlen(name) + 1 + 1]; 124586c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (flags & VG_MSG_PAREN) { 124646cc04521acf2827eb33310fadc119bf2dc039e4florian VG_(sprintf)(str, "(%s)", name): 124746cc04521acf2827eb33310fadc119bf2dc039e4florian } else { 124846cc04521acf2827eb33310fadc119bf2dc039e4florian VG_(sprintf)(str, "%s", name): 124946cc04521acf2827eb33310fadc119bf2dc039e4florian } 125086c2349f3dd6574a20f58b31ed901d0006bced4bnjn ret += myvprintf_str(send, flags, width, buf, 0); 125186c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 125286c2349f3dd6574a20f58b31ed901d0006bced4bnjn break; 125386c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 125486c2349f3dd6574a20f58b31ed901d0006bced4bnjn# endif 125586c2349f3dd6574a20f58b31ed901d0006bced4bnjn default: 125686c2349f3dd6574a20f58b31ed901d0006bced4bnjn break; 125786c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 125886c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 125986c2349f3dd6574a20f58b31ed901d0006bced4bnjn return ret; 126086c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 126186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 126286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 126386c2349f3dd6574a20f58b31ed901d0006bced4bnjn/* A general replacement for printf(). Note that only low-level 126486c2349f3dd6574a20f58b31ed901d0006bced4bnjn debugging info should be sent via here. The official route is to 126586c2349f3dd6574a20f58b31ed901d0006bced4bnjn to use vg_message(). This interface is deprecated. 126686c2349f3dd6574a20f58b31ed901d0006bced4bnjn*/ 126786c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic HChar myprintf_buf[1000]; 126886c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic Int n_myprintf_buf; 126986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 127086c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic void add_to_myprintf_buf ( HChar c ) 127186c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 127286c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (c == '\n' || n_myprintf_buf >= 1000-10 /*paranoia*/ ) { 127386c2349f3dd6574a20f58b31ed901d0006bced4bnjn (*vex_log_bytes)( myprintf_buf, vex_strlen(myprintf_buf) ); 127486c2349f3dd6574a20f58b31ed901d0006bced4bnjn n_myprintf_buf = 0; 127586c2349f3dd6574a20f58b31ed901d0006bced4bnjn myprintf_buf[n_myprintf_buf] = 0; 127686c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 127786c2349f3dd6574a20f58b31ed901d0006bced4bnjn myprintf_buf[n_myprintf_buf++] = c; 127886c2349f3dd6574a20f58b31ed901d0006bced4bnjn myprintf_buf[n_myprintf_buf] = 0; 127986c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 128086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 128186c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic UInt vex_printf ( const char *format, ... ) 128286c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 128386c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt ret; 128486c2349f3dd6574a20f58b31ed901d0006bced4bnjn va_list vargs; 128586c2349f3dd6574a20f58b31ed901d0006bced4bnjn va_start(vargs,format); 128686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 128786c2349f3dd6574a20f58b31ed901d0006bced4bnjn n_myprintf_buf = 0; 128886c2349f3dd6574a20f58b31ed901d0006bced4bnjn myprintf_buf[n_myprintf_buf] = 0; 128986c2349f3dd6574a20f58b31ed901d0006bced4bnjn ret = vprintf_wrk ( add_to_myprintf_buf, format, vargs ); 129086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 129186c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (n_myprintf_buf > 0) { 129286c2349f3dd6574a20f58b31ed901d0006bced4bnjn (*vex_log_bytes)( myprintf_buf, n_myprintf_buf ); 129386c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 129486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 129586c2349f3dd6574a20f58b31ed901d0006bced4bnjn va_end(vargs); 129686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 129786c2349f3dd6574a20f58b31ed901d0006bced4bnjn return ret; 129886c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 129986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 130086c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------------------*/ 130186c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*--- end vex_util.c ---*/ 130286c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------------------*/ 130386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 130486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 130586c2349f3dd6574a20f58b31ed901d0006bced4bnjn///////////////////////////////////////////////////////////////////// 130686c2349f3dd6574a20f58b31ed901d0006bced4bnjn///////////////////////////////////////////////////////////////////// 130786c2349f3dd6574a20f58b31ed901d0006bced4bnjn///////////////////////////////////////////////////////////////////// 130886c2349f3dd6574a20f58b31ed901d0006bced4bnjn///////////////////////////////////////////////////////////////////// 130986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 131086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 131186c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-------------------------------------------------------------*/ 131286c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*--- Decompression machinery ---*/ 131386c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*--- decompress.c ---*/ 131486c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-------------------------------------------------------------*/ 131586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 131686c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-- 131786c2349f3dd6574a20f58b31ed901d0006bced4bnjn This file is a part of bzip2 and/or libbzip2, a program and 131886c2349f3dd6574a20f58b31ed901d0006bced4bnjn library for lossless, block-sorting data compression. 131986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 132086c2349f3dd6574a20f58b31ed901d0006bced4bnjn Copyright (C) 1996-2004 Julian R Seward. All rights reserved. 132186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 132286c2349f3dd6574a20f58b31ed901d0006bced4bnjn Redistribution and use in source and binary forms, with or without 132386c2349f3dd6574a20f58b31ed901d0006bced4bnjn modification, are permitted provided that the following conditions 132486c2349f3dd6574a20f58b31ed901d0006bced4bnjn are met: 132586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 132686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 1. Redistributions of source code must retain the above copyright 132786c2349f3dd6574a20f58b31ed901d0006bced4bnjn notice, this list of conditions and the following disclaimer. 132886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 132986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 2. The origin of this software must not be misrepresented; you must 133086c2349f3dd6574a20f58b31ed901d0006bced4bnjn not claim that you wrote the original software. If you use this 133186c2349f3dd6574a20f58b31ed901d0006bced4bnjn software in a product, an acknowledgment in the product 133286c2349f3dd6574a20f58b31ed901d0006bced4bnjn documentation would be appreciated but is not required. 133386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 133486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 3. Altered source versions must be plainly marked as such, and must 133586c2349f3dd6574a20f58b31ed901d0006bced4bnjn not be misrepresented as being the original software. 133686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 133786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 4. The name of the author may not be used to endorse or promote 133886c2349f3dd6574a20f58b31ed901d0006bced4bnjn products derived from this software without specific prior written 133986c2349f3dd6574a20f58b31ed901d0006bced4bnjn permission. 134086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 134186c2349f3dd6574a20f58b31ed901d0006bced4bnjn THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 134286c2349f3dd6574a20f58b31ed901d0006bced4bnjn OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 134386c2349f3dd6574a20f58b31ed901d0006bced4bnjn WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 134486c2349f3dd6574a20f58b31ed901d0006bced4bnjn ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 134586c2349f3dd6574a20f58b31ed901d0006bced4bnjn DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 134686c2349f3dd6574a20f58b31ed901d0006bced4bnjn DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 134786c2349f3dd6574a20f58b31ed901d0006bced4bnjn GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 134886c2349f3dd6574a20f58b31ed901d0006bced4bnjn INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 134986c2349f3dd6574a20f58b31ed901d0006bced4bnjn WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 135086c2349f3dd6574a20f58b31ed901d0006bced4bnjn NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 135186c2349f3dd6574a20f58b31ed901d0006bced4bnjn SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 135286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 135386c2349f3dd6574a20f58b31ed901d0006bced4bnjn Julian Seward, Cambridge, UK. 135486c2349f3dd6574a20f58b31ed901d0006bced4bnjn jseward@bzip.org 135586c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzip2/libbzip2 version 1.0 of 21 March 2000 135686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 135786c2349f3dd6574a20f58b31ed901d0006bced4bnjn This program is based on (at least) the work of: 135886c2349f3dd6574a20f58b31ed901d0006bced4bnjn Mike Burrows 135986c2349f3dd6574a20f58b31ed901d0006bced4bnjn David Wheeler 136086c2349f3dd6574a20f58b31ed901d0006bced4bnjn Peter Fenwick 136186c2349f3dd6574a20f58b31ed901d0006bced4bnjn Alistair Moffat 136286c2349f3dd6574a20f58b31ed901d0006bced4bnjn Radford Neal 136386c2349f3dd6574a20f58b31ed901d0006bced4bnjn Ian H. Witten 136486c2349f3dd6574a20f58b31ed901d0006bced4bnjn Robert Sedgewick 136586c2349f3dd6574a20f58b31ed901d0006bced4bnjn Jon L. Bentley 136686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 136786c2349f3dd6574a20f58b31ed901d0006bced4bnjn For more information on these sources, see the manual. 136886c2349f3dd6574a20f58b31ed901d0006bced4bnjn--*/ 136986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 137086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 137186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 137286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 137386c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 137486c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic 137586c2349f3dd6574a20f58b31ed901d0006bced4bnjnvoid makeMaps_d ( DState* s ) 137686c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 137786c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 i; 137886c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->nInUse = 0; 137986c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i < 256; i++) 138086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->inUse[i]) { 138186c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->seqToUnseq[s->nInUse] = i; 138286c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->nInUse++; 138386c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 138486c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 138586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 138686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 138786c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 138886c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define RETURN(rrr) \ 138986c2349f3dd6574a20f58b31ed901d0006bced4bnjn { retVal = rrr; goto save_state_and_return; }; 139086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 139186c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define GET_BITS(lll,vvv,nnn) \ 139286c2349f3dd6574a20f58b31ed901d0006bced4bnjn case lll: s->state = lll; \ 139386c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (True) { \ 139486c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->bsLive >= nnn) { \ 139586c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt32 v; \ 139686c2349f3dd6574a20f58b31ed901d0006bced4bnjn v = (s->bsBuff >> \ 139786c2349f3dd6574a20f58b31ed901d0006bced4bnjn (s->bsLive-nnn)) & ((1 << nnn)-1); \ 139886c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->bsLive -= nnn; \ 139986c2349f3dd6574a20f58b31ed901d0006bced4bnjn vvv = v; \ 140086c2349f3dd6574a20f58b31ed901d0006bced4bnjn break; \ 140186c2349f3dd6574a20f58b31ed901d0006bced4bnjn } \ 140286c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->strm->avail_in == 0) RETURN(BZ_OK); \ 140386c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->bsBuff \ 140486c2349f3dd6574a20f58b31ed901d0006bced4bnjn = (s->bsBuff << 8) | \ 140586c2349f3dd6574a20f58b31ed901d0006bced4bnjn ((UInt32) \ 140686c2349f3dd6574a20f58b31ed901d0006bced4bnjn (*((UChar*)(s->strm->next_in)))); \ 140786c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->bsLive += 8; \ 140886c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->strm->next_in++; \ 140986c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->strm->avail_in--; \ 141086c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->strm->total_in_lo32++; \ 141186c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->strm->total_in_lo32 == 0) \ 141286c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->strm->total_in_hi32++; \ 141386c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 141486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 141586c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define GET_UCHAR(lll,uuu) \ 141686c2349f3dd6574a20f58b31ed901d0006bced4bnjn GET_BITS(lll,uuu,8) 141786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 141886c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define GET_BIT(lll,uuu) \ 141986c2349f3dd6574a20f58b31ed901d0006bced4bnjn GET_BITS(lll,uuu,1) 142086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 142186c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 142286c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define GET_MTF_VAL(label1,label2,lval) \ 142386c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ \ 142486c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (groupPos == 0) { \ 142586c2349f3dd6574a20f58b31ed901d0006bced4bnjn groupNo++; \ 142686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (groupNo >= nSelectors) \ 142786c2349f3dd6574a20f58b31ed901d0006bced4bnjn RETURN(BZ_DATA_ERROR); \ 142886c2349f3dd6574a20f58b31ed901d0006bced4bnjn groupPos = BZ_G_SIZE; \ 142986c2349f3dd6574a20f58b31ed901d0006bced4bnjn gSel = s->selector[groupNo]; \ 143086c2349f3dd6574a20f58b31ed901d0006bced4bnjn gMinlen = s->minLens[gSel]; \ 143186c2349f3dd6574a20f58b31ed901d0006bced4bnjn gLimit = &(s->limit[gSel][0]); \ 143286c2349f3dd6574a20f58b31ed901d0006bced4bnjn gPerm = &(s->perm[gSel][0]); \ 143386c2349f3dd6574a20f58b31ed901d0006bced4bnjn gBase = &(s->base[gSel][0]); \ 143486c2349f3dd6574a20f58b31ed901d0006bced4bnjn } \ 143586c2349f3dd6574a20f58b31ed901d0006bced4bnjn groupPos--; \ 143686c2349f3dd6574a20f58b31ed901d0006bced4bnjn zn = gMinlen; \ 143786c2349f3dd6574a20f58b31ed901d0006bced4bnjn GET_BITS(label1, zvec, zn); \ 143886c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (1) { \ 143986c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (zn > 20 /* the longest code */) \ 144086c2349f3dd6574a20f58b31ed901d0006bced4bnjn RETURN(BZ_DATA_ERROR); \ 144186c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (zvec <= gLimit[zn]) break; \ 144286c2349f3dd6574a20f58b31ed901d0006bced4bnjn zn++; \ 144386c2349f3dd6574a20f58b31ed901d0006bced4bnjn GET_BIT(label2, zj); \ 144486c2349f3dd6574a20f58b31ed901d0006bced4bnjn zvec = (zvec << 1) | zj; \ 144586c2349f3dd6574a20f58b31ed901d0006bced4bnjn }; \ 144686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (zvec - gBase[zn] < 0 \ 144786c2349f3dd6574a20f58b31ed901d0006bced4bnjn || zvec - gBase[zn] >= BZ_MAX_ALPHA_SIZE) \ 144886c2349f3dd6574a20f58b31ed901d0006bced4bnjn RETURN(BZ_DATA_ERROR); \ 144986c2349f3dd6574a20f58b31ed901d0006bced4bnjn lval = gPerm[zvec - gBase[zn]]; \ 145086c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 145186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 145286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 145386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 145486c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 145586c2349f3dd6574a20f58b31ed901d0006bced4bnjn__inline__ Int32 BZ2_indexIntoF ( Int32 indx, Int32 *cftab ) 145686c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 145786c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 nb, na, mid; 145886c2349f3dd6574a20f58b31ed901d0006bced4bnjn nb = 0; 145986c2349f3dd6574a20f58b31ed901d0006bced4bnjn na = 256; 146086c2349f3dd6574a20f58b31ed901d0006bced4bnjn do { 146186c2349f3dd6574a20f58b31ed901d0006bced4bnjn mid = (nb + na) >> 1; 146286c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (indx >= cftab[mid]) nb = mid; else na = mid; 146386c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 146486c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (na - nb != 1); 146586c2349f3dd6574a20f58b31ed901d0006bced4bnjn return nb; 146686c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 146786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 146886c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 146986c2349f3dd6574a20f58b31ed901d0006bced4bnjnInt32 BZ2_decompress ( DState* s ) 147086c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 147186c2349f3dd6574a20f58b31ed901d0006bced4bnjn UChar uc; 147286c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 retVal; 147386c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 minLen, maxLen; 147486c2349f3dd6574a20f58b31ed901d0006bced4bnjn bz_stream* strm = s->strm; 147586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 147686c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* stuff that needs to be saved/restored */ 147786c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 i; 147886c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 j; 147986c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 t; 148086c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 alphaSize; 148186c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 nGroups; 148286c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 nSelectors; 148386c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 EOB; 148486c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 groupNo; 148586c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 groupPos; 148686c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 nextSym; 148786c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 nblockMAX; 148886c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 nblock; 148986c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 es; 149086c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 N; 149186c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 curr; 149286c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 zt; 149386c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 zn; 149486c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 zvec; 149586c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 zj; 149686c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 gSel; 149786c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 gMinlen; 149886c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32* gLimit; 149986c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32* gBase; 150086c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32* gPerm; 150186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 150286c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->state == BZ_X_MAGIC_1) { 150386c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*initialise the save area*/ 150486c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_i = 0; 150586c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_j = 0; 150686c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_t = 0; 150786c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_alphaSize = 0; 150886c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_nGroups = 0; 150986c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_nSelectors = 0; 151086c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_EOB = 0; 151186c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_groupNo = 0; 151286c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_groupPos = 0; 151386c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_nextSym = 0; 151486c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_nblockMAX = 0; 151586c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_nblock = 0; 151686c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_es = 0; 151786c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_N = 0; 151886c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_curr = 0; 151986c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_zt = 0; 152086c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_zn = 0; 152186c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_zvec = 0; 152286c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_zj = 0; 152386c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_gSel = 0; 152486c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_gMinlen = 0; 152586c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_gLimit = NULL; 152686c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_gBase = NULL; 152786c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_gPerm = NULL; 152886c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 152986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 153086c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*restore from the save area*/ 153186c2349f3dd6574a20f58b31ed901d0006bced4bnjn i = s->save_i; 153286c2349f3dd6574a20f58b31ed901d0006bced4bnjn j = s->save_j; 153386c2349f3dd6574a20f58b31ed901d0006bced4bnjn t = s->save_t; 153486c2349f3dd6574a20f58b31ed901d0006bced4bnjn alphaSize = s->save_alphaSize; 153586c2349f3dd6574a20f58b31ed901d0006bced4bnjn nGroups = s->save_nGroups; 153686c2349f3dd6574a20f58b31ed901d0006bced4bnjn nSelectors = s->save_nSelectors; 153786c2349f3dd6574a20f58b31ed901d0006bced4bnjn EOB = s->save_EOB; 153886c2349f3dd6574a20f58b31ed901d0006bced4bnjn groupNo = s->save_groupNo; 153986c2349f3dd6574a20f58b31ed901d0006bced4bnjn groupPos = s->save_groupPos; 154086c2349f3dd6574a20f58b31ed901d0006bced4bnjn nextSym = s->save_nextSym; 154186c2349f3dd6574a20f58b31ed901d0006bced4bnjn nblockMAX = s->save_nblockMAX; 154286c2349f3dd6574a20f58b31ed901d0006bced4bnjn nblock = s->save_nblock; 154386c2349f3dd6574a20f58b31ed901d0006bced4bnjn es = s->save_es; 154486c2349f3dd6574a20f58b31ed901d0006bced4bnjn N = s->save_N; 154586c2349f3dd6574a20f58b31ed901d0006bced4bnjn curr = s->save_curr; 154686c2349f3dd6574a20f58b31ed901d0006bced4bnjn zt = s->save_zt; 154786c2349f3dd6574a20f58b31ed901d0006bced4bnjn zn = s->save_zn; 154886c2349f3dd6574a20f58b31ed901d0006bced4bnjn zvec = s->save_zvec; 154986c2349f3dd6574a20f58b31ed901d0006bced4bnjn zj = s->save_zj; 155086c2349f3dd6574a20f58b31ed901d0006bced4bnjn gSel = s->save_gSel; 155186c2349f3dd6574a20f58b31ed901d0006bced4bnjn gMinlen = s->save_gMinlen; 155286c2349f3dd6574a20f58b31ed901d0006bced4bnjn gLimit = s->save_gLimit; 155386c2349f3dd6574a20f58b31ed901d0006bced4bnjn gBase = s->save_gBase; 155486c2349f3dd6574a20f58b31ed901d0006bced4bnjn gPerm = s->save_gPerm; 155586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 155686c2349f3dd6574a20f58b31ed901d0006bced4bnjn retVal = BZ_OK; 155786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 155886c2349f3dd6574a20f58b31ed901d0006bced4bnjn switch (s->state) { 155986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 156086c2349f3dd6574a20f58b31ed901d0006bced4bnjn GET_UCHAR(BZ_X_MAGIC_1, uc); 156186c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (uc != BZ_HDR_B) RETURN(BZ_DATA_ERROR_MAGIC); 156286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 156386c2349f3dd6574a20f58b31ed901d0006bced4bnjn GET_UCHAR(BZ_X_MAGIC_2, uc); 156486c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (uc != BZ_HDR_Z) RETURN(BZ_DATA_ERROR_MAGIC); 156586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 156686c2349f3dd6574a20f58b31ed901d0006bced4bnjn GET_UCHAR(BZ_X_MAGIC_3, uc) 156786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (uc != BZ_HDR_h) RETURN(BZ_DATA_ERROR_MAGIC); 156886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 156986c2349f3dd6574a20f58b31ed901d0006bced4bnjn GET_BITS(BZ_X_MAGIC_4, s->blockSize100k, 8) 157086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->blockSize100k < (BZ_HDR_0 + 1) || 157186c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->blockSize100k > (BZ_HDR_0 + 9)) RETURN(BZ_DATA_ERROR_MAGIC); 157286c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->blockSize100k -= BZ_HDR_0; 157386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 157486c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->smallDecompress) { 157586c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->ll16 = BZALLOC( s->blockSize100k * 100000 * sizeof(UInt16) ); 157686c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->ll4 = BZALLOC( 157786c2349f3dd6574a20f58b31ed901d0006bced4bnjn ((1 + s->blockSize100k * 100000) >> 1) * sizeof(UChar) 157886c2349f3dd6574a20f58b31ed901d0006bced4bnjn ); 157986c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->ll16 == NULL || s->ll4 == NULL) RETURN(BZ_MEM_ERROR); 158086c2349f3dd6574a20f58b31ed901d0006bced4bnjn } else { 158186c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->tt = BZALLOC( s->blockSize100k * 100000 * sizeof(Int32) ); 158286c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->tt == NULL) RETURN(BZ_MEM_ERROR); 158386c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 158486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 158586c2349f3dd6574a20f58b31ed901d0006bced4bnjn GET_UCHAR(BZ_X_BLKHDR_1, uc); 158686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 158786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (uc == 0x17) goto endhdr_2; 158886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (uc != 0x31) RETURN(BZ_DATA_ERROR); 158986c2349f3dd6574a20f58b31ed901d0006bced4bnjn GET_UCHAR(BZ_X_BLKHDR_2, uc); 159086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (uc != 0x41) RETURN(BZ_DATA_ERROR); 159186c2349f3dd6574a20f58b31ed901d0006bced4bnjn GET_UCHAR(BZ_X_BLKHDR_3, uc); 159286c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (uc != 0x59) RETURN(BZ_DATA_ERROR); 159386c2349f3dd6574a20f58b31ed901d0006bced4bnjn GET_UCHAR(BZ_X_BLKHDR_4, uc); 159486c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (uc != 0x26) RETURN(BZ_DATA_ERROR); 159586c2349f3dd6574a20f58b31ed901d0006bced4bnjn GET_UCHAR(BZ_X_BLKHDR_5, uc); 159686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (uc != 0x53) RETURN(BZ_DATA_ERROR); 159786c2349f3dd6574a20f58b31ed901d0006bced4bnjn GET_UCHAR(BZ_X_BLKHDR_6, uc); 159886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (uc != 0x59) RETURN(BZ_DATA_ERROR); 159986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 160086c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->currBlockNo++; 160186c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->verbosity >= 2) 160286c2349f3dd6574a20f58b31ed901d0006bced4bnjn VPrintf1 ( "\n [%d: huff+mtf ", s->currBlockNo ); 160386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 160486c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->storedBlockCRC = 0; 160586c2349f3dd6574a20f58b31ed901d0006bced4bnjn GET_UCHAR(BZ_X_BCRC_1, uc); 160686c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); 160786c2349f3dd6574a20f58b31ed901d0006bced4bnjn GET_UCHAR(BZ_X_BCRC_2, uc); 160886c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); 160986c2349f3dd6574a20f58b31ed901d0006bced4bnjn GET_UCHAR(BZ_X_BCRC_3, uc); 161086c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); 161186c2349f3dd6574a20f58b31ed901d0006bced4bnjn GET_UCHAR(BZ_X_BCRC_4, uc); 161286c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); 161386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 161486c2349f3dd6574a20f58b31ed901d0006bced4bnjn GET_BITS(BZ_X_RANDBIT, s->blockRandomised, 1); 161586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 161686c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->origPtr = 0; 161786c2349f3dd6574a20f58b31ed901d0006bced4bnjn GET_UCHAR(BZ_X_ORIGPTR_1, uc); 161886c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->origPtr = (s->origPtr << 8) | ((Int32)uc); 161986c2349f3dd6574a20f58b31ed901d0006bced4bnjn GET_UCHAR(BZ_X_ORIGPTR_2, uc); 162086c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->origPtr = (s->origPtr << 8) | ((Int32)uc); 162186c2349f3dd6574a20f58b31ed901d0006bced4bnjn GET_UCHAR(BZ_X_ORIGPTR_3, uc); 162286c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->origPtr = (s->origPtr << 8) | ((Int32)uc); 162386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 162486c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->origPtr < 0) 162586c2349f3dd6574a20f58b31ed901d0006bced4bnjn RETURN(BZ_DATA_ERROR); 162686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->origPtr > 10 + 100000*s->blockSize100k) 162786c2349f3dd6574a20f58b31ed901d0006bced4bnjn RETURN(BZ_DATA_ERROR); 162886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 162986c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*--- Receive the mapping table ---*/ 163086c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i < 16; i++) { 163186c2349f3dd6574a20f58b31ed901d0006bced4bnjn GET_BIT(BZ_X_MAPPING_1, uc); 163286c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (uc == 1) 163386c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->inUse16[i] = True; else 163486c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->inUse16[i] = False; 163586c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 163686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 163786c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i < 256; i++) s->inUse[i] = False; 163886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 163986c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i < 16; i++) 164086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->inUse16[i]) 164186c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (j = 0; j < 16; j++) { 164286c2349f3dd6574a20f58b31ed901d0006bced4bnjn GET_BIT(BZ_X_MAPPING_2, uc); 164386c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (uc == 1) s->inUse[i * 16 + j] = True; 164486c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 164586c2349f3dd6574a20f58b31ed901d0006bced4bnjn makeMaps_d ( s ); 164686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->nInUse == 0) RETURN(BZ_DATA_ERROR); 164786c2349f3dd6574a20f58b31ed901d0006bced4bnjn alphaSize = s->nInUse+2; 164886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 164986c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*--- Now the selectors ---*/ 165086c2349f3dd6574a20f58b31ed901d0006bced4bnjn GET_BITS(BZ_X_SELECTOR_1, nGroups, 3); 165186c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (nGroups < 2 || nGroups > 6) RETURN(BZ_DATA_ERROR); 165286c2349f3dd6574a20f58b31ed901d0006bced4bnjn GET_BITS(BZ_X_SELECTOR_2, nSelectors, 15); 165386c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (nSelectors < 1) RETURN(BZ_DATA_ERROR); 165486c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i < nSelectors; i++) { 165586c2349f3dd6574a20f58b31ed901d0006bced4bnjn j = 0; 165686c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (True) { 165786c2349f3dd6574a20f58b31ed901d0006bced4bnjn GET_BIT(BZ_X_SELECTOR_3, uc); 165886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (uc == 0) break; 165986c2349f3dd6574a20f58b31ed901d0006bced4bnjn j++; 166086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (j >= nGroups) RETURN(BZ_DATA_ERROR); 166186c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 166286c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->selectorMtf[i] = j; 166386c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 166486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 166586c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*--- Undo the MTF values for the selectors. ---*/ 166686c2349f3dd6574a20f58b31ed901d0006bced4bnjn { 166786c2349f3dd6574a20f58b31ed901d0006bced4bnjn UChar pos[BZ_N_GROUPS], tmp, v; 166886c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (v = 0; v < nGroups; v++) pos[v] = v; 166986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 167086c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i < nSelectors; i++) { 167186c2349f3dd6574a20f58b31ed901d0006bced4bnjn v = s->selectorMtf[i]; 167286c2349f3dd6574a20f58b31ed901d0006bced4bnjn tmp = pos[v]; 167386c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (v > 0) { pos[v] = pos[v-1]; v--; } 167486c2349f3dd6574a20f58b31ed901d0006bced4bnjn pos[0] = tmp; 167586c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->selector[i] = tmp; 167686c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 167786c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 167886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 167986c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*--- Now the coding tables ---*/ 168086c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (t = 0; t < nGroups; t++) { 168186c2349f3dd6574a20f58b31ed901d0006bced4bnjn GET_BITS(BZ_X_CODING_1, curr, 5); 168286c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i < alphaSize; i++) { 168386c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (True) { 168486c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (curr < 1 || curr > 20) RETURN(BZ_DATA_ERROR); 168586c2349f3dd6574a20f58b31ed901d0006bced4bnjn GET_BIT(BZ_X_CODING_2, uc); 168686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (uc == 0) break; 168786c2349f3dd6574a20f58b31ed901d0006bced4bnjn GET_BIT(BZ_X_CODING_3, uc); 168886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (uc == 0) curr++; else curr--; 168986c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 169086c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->len[t][i] = curr; 169186c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 169286c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 169386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 169486c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*--- Create the Huffman decoding tables ---*/ 169586c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (t = 0; t < nGroups; t++) { 169686c2349f3dd6574a20f58b31ed901d0006bced4bnjn minLen = 32; 169786c2349f3dd6574a20f58b31ed901d0006bced4bnjn maxLen = 0; 169886c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i < alphaSize; i++) { 169986c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->len[t][i] > maxLen) maxLen = s->len[t][i]; 170086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->len[t][i] < minLen) minLen = s->len[t][i]; 170186c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 170286c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ2_hbCreateDecodeTables ( 170386c2349f3dd6574a20f58b31ed901d0006bced4bnjn &(s->limit[t][0]), 170486c2349f3dd6574a20f58b31ed901d0006bced4bnjn &(s->base[t][0]), 170586c2349f3dd6574a20f58b31ed901d0006bced4bnjn &(s->perm[t][0]), 170686c2349f3dd6574a20f58b31ed901d0006bced4bnjn &(s->len[t][0]), 170786c2349f3dd6574a20f58b31ed901d0006bced4bnjn minLen, maxLen, alphaSize 170886c2349f3dd6574a20f58b31ed901d0006bced4bnjn ); 170986c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->minLens[t] = minLen; 171086c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 171186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 171286c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*--- Now the MTF values ---*/ 171386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 171486c2349f3dd6574a20f58b31ed901d0006bced4bnjn EOB = s->nInUse+1; 171586c2349f3dd6574a20f58b31ed901d0006bced4bnjn nblockMAX = 100000 * s->blockSize100k; 171686c2349f3dd6574a20f58b31ed901d0006bced4bnjn groupNo = -1; 171786c2349f3dd6574a20f58b31ed901d0006bced4bnjn groupPos = 0; 171886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 171986c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i <= 255; i++) s->unzftab[i] = 0; 172086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 172186c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- MTF init --*/ 172286c2349f3dd6574a20f58b31ed901d0006bced4bnjn { 172386c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 ii, jj, kk; 172486c2349f3dd6574a20f58b31ed901d0006bced4bnjn kk = MTFA_SIZE-1; 172586c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (ii = 256 / MTFL_SIZE - 1; ii >= 0; ii--) { 172686c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (jj = MTFL_SIZE-1; jj >= 0; jj--) { 172786c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->mtfa[kk] = (UChar)(ii * MTFL_SIZE + jj); 172886c2349f3dd6574a20f58b31ed901d0006bced4bnjn kk--; 172986c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 173086c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->mtfbase[ii] = kk + 1; 173186c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 173286c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 173386c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- end MTF init --*/ 173486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 173586c2349f3dd6574a20f58b31ed901d0006bced4bnjn nblock = 0; 173686c2349f3dd6574a20f58b31ed901d0006bced4bnjn GET_MTF_VAL(BZ_X_MTF_1, BZ_X_MTF_2, nextSym); 173786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 173886c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (True) { 173986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 174086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (nextSym == EOB) break; 174186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 174286c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (nextSym == BZ_RUNA || nextSym == BZ_RUNB) { 174386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 174486c2349f3dd6574a20f58b31ed901d0006bced4bnjn es = -1; 174586c2349f3dd6574a20f58b31ed901d0006bced4bnjn N = 1; 174686c2349f3dd6574a20f58b31ed901d0006bced4bnjn do { 174786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (nextSym == BZ_RUNA) es = es + (0+1) * N; else 174886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (nextSym == BZ_RUNB) es = es + (1+1) * N; 174986c2349f3dd6574a20f58b31ed901d0006bced4bnjn N = N * 2; 175086c2349f3dd6574a20f58b31ed901d0006bced4bnjn GET_MTF_VAL(BZ_X_MTF_3, BZ_X_MTF_4, nextSym); 175186c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 175286c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (nextSym == BZ_RUNA || nextSym == BZ_RUNB); 175386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 175486c2349f3dd6574a20f58b31ed901d0006bced4bnjn es++; 175586c2349f3dd6574a20f58b31ed901d0006bced4bnjn uc = s->seqToUnseq[ s->mtfa[s->mtfbase[0]] ]; 175686c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->unzftab[uc] += es; 175786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 175886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->smallDecompress) 175986c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (es > 0) { 176086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR); 176186c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->ll16[nblock] = (UInt16)uc; 176286c2349f3dd6574a20f58b31ed901d0006bced4bnjn nblock++; 176386c2349f3dd6574a20f58b31ed901d0006bced4bnjn es--; 176486c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 176586c2349f3dd6574a20f58b31ed901d0006bced4bnjn else 176686c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (es > 0) { 176786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR); 176886c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->tt[nblock] = (UInt32)uc; 176986c2349f3dd6574a20f58b31ed901d0006bced4bnjn nblock++; 177086c2349f3dd6574a20f58b31ed901d0006bced4bnjn es--; 177186c2349f3dd6574a20f58b31ed901d0006bced4bnjn }; 177286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 177386c2349f3dd6574a20f58b31ed901d0006bced4bnjn continue; 177486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 177586c2349f3dd6574a20f58b31ed901d0006bced4bnjn } else { 177686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 177786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR); 177886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 177986c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- uc = MTF ( nextSym-1 ) --*/ 178086c2349f3dd6574a20f58b31ed901d0006bced4bnjn { 178186c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 ii, jj, kk, pp, lno, off; 178286c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt32 nn; 178386c2349f3dd6574a20f58b31ed901d0006bced4bnjn nn = (UInt32)(nextSym - 1); 178486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 178586c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (nn < MTFL_SIZE) { 178686c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* avoid general-case expense */ 178786c2349f3dd6574a20f58b31ed901d0006bced4bnjn pp = s->mtfbase[0]; 178886c2349f3dd6574a20f58b31ed901d0006bced4bnjn uc = s->mtfa[pp+nn]; 178986c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (nn > 3) { 179086c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 z = pp+nn; 179186c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->mtfa[(z) ] = s->mtfa[(z)-1]; 179286c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->mtfa[(z)-1] = s->mtfa[(z)-2]; 179386c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->mtfa[(z)-2] = s->mtfa[(z)-3]; 179486c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->mtfa[(z)-3] = s->mtfa[(z)-4]; 179586c2349f3dd6574a20f58b31ed901d0006bced4bnjn nn -= 4; 179686c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 179786c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (nn > 0) { 179886c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->mtfa[(pp+nn)] = s->mtfa[(pp+nn)-1]; nn--; 179986c2349f3dd6574a20f58b31ed901d0006bced4bnjn }; 180086c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->mtfa[pp] = uc; 180186c2349f3dd6574a20f58b31ed901d0006bced4bnjn } else { 180286c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* general case */ 180386c2349f3dd6574a20f58b31ed901d0006bced4bnjn lno = nn / MTFL_SIZE; 180486c2349f3dd6574a20f58b31ed901d0006bced4bnjn off = nn % MTFL_SIZE; 180586c2349f3dd6574a20f58b31ed901d0006bced4bnjn pp = s->mtfbase[lno] + off; 180686c2349f3dd6574a20f58b31ed901d0006bced4bnjn uc = s->mtfa[pp]; 180786c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (pp > s->mtfbase[lno]) { 180886c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->mtfa[pp] = s->mtfa[pp-1]; pp--; 180986c2349f3dd6574a20f58b31ed901d0006bced4bnjn }; 181086c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->mtfbase[lno]++; 181186c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (lno > 0) { 181286c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->mtfbase[lno]--; 181386c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->mtfa[s->mtfbase[lno]] 181486c2349f3dd6574a20f58b31ed901d0006bced4bnjn = s->mtfa[s->mtfbase[lno-1] + MTFL_SIZE - 1]; 181586c2349f3dd6574a20f58b31ed901d0006bced4bnjn lno--; 181686c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 181786c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->mtfbase[0]--; 181886c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->mtfa[s->mtfbase[0]] = uc; 181986c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->mtfbase[0] == 0) { 182086c2349f3dd6574a20f58b31ed901d0006bced4bnjn kk = MTFA_SIZE-1; 182186c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (ii = 256 / MTFL_SIZE-1; ii >= 0; ii--) { 182286c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (jj = MTFL_SIZE-1; jj >= 0; jj--) { 182386c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->mtfa[kk] = s->mtfa[s->mtfbase[ii] + jj]; 182486c2349f3dd6574a20f58b31ed901d0006bced4bnjn kk--; 182586c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 182686c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->mtfbase[ii] = kk + 1; 182786c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 182886c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 182986c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 183086c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 183186c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- end uc = MTF ( nextSym-1 ) --*/ 183286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 183386c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->unzftab[s->seqToUnseq[uc]]++; 183486c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->smallDecompress) 183586c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->ll16[nblock] = (UInt16)(s->seqToUnseq[uc]); else 183686c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->tt[nblock] = (UInt32)(s->seqToUnseq[uc]); 183786c2349f3dd6574a20f58b31ed901d0006bced4bnjn nblock++; 183886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 183986c2349f3dd6574a20f58b31ed901d0006bced4bnjn GET_MTF_VAL(BZ_X_MTF_5, BZ_X_MTF_6, nextSym); 184086c2349f3dd6574a20f58b31ed901d0006bced4bnjn continue; 184186c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 184286c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 184386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 184486c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* Now we know what nblock is, we can do a better sanity 184586c2349f3dd6574a20f58b31ed901d0006bced4bnjn check on s->origPtr. 184686c2349f3dd6574a20f58b31ed901d0006bced4bnjn */ 184786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->origPtr < 0 || s->origPtr >= nblock) 184886c2349f3dd6574a20f58b31ed901d0006bced4bnjn RETURN(BZ_DATA_ERROR); 184986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 185086c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- Set up cftab to facilitate generation of T^(-1) --*/ 185186c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->cftab[0] = 0; 185286c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 1; i <= 256; i++) s->cftab[i] = s->unzftab[i-1]; 185386c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 1; i <= 256; i++) s->cftab[i] += s->cftab[i-1]; 185486c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i <= 256; i++) { 185586c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->cftab[i] < 0 || s->cftab[i] > nblock) { 185686c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* s->cftab[i] can legitimately be == nblock */ 185786c2349f3dd6574a20f58b31ed901d0006bced4bnjn RETURN(BZ_DATA_ERROR); 185886c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 185986c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 186086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 186186c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->state_out_len = 0; 186286c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->state_out_ch = 0; 186386c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_INITIALISE_CRC ( s->calculatedBlockCRC ); 186486c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->state = BZ_X_OUTPUT; 186586c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->verbosity >= 2) VPrintf0 ( "rt+rld" ); 186686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 186786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->smallDecompress) { 186886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 186986c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- Make a copy of cftab, used in generation of T --*/ 187086c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i <= 256; i++) s->cftabCopy[i] = s->cftab[i]; 187186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 187286c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- compute the T vector --*/ 187386c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i < nblock; i++) { 187486c2349f3dd6574a20f58b31ed901d0006bced4bnjn uc = (UChar)(s->ll16[i]); 187586c2349f3dd6574a20f58b31ed901d0006bced4bnjn SET_LL(i, s->cftabCopy[uc]); 187686c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->cftabCopy[uc]++; 187786c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 187886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 187986c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- Compute T^(-1) by pointer reversal on T --*/ 188086c2349f3dd6574a20f58b31ed901d0006bced4bnjn i = s->origPtr; 188186c2349f3dd6574a20f58b31ed901d0006bced4bnjn j = GET_LL(i); 188286c2349f3dd6574a20f58b31ed901d0006bced4bnjn do { 188386c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 tmp = GET_LL(j); 188486c2349f3dd6574a20f58b31ed901d0006bced4bnjn SET_LL(j, i); 188586c2349f3dd6574a20f58b31ed901d0006bced4bnjn i = j; 188686c2349f3dd6574a20f58b31ed901d0006bced4bnjn j = tmp; 188786c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 188886c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (i != s->origPtr); 188986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 189086c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->tPos = s->origPtr; 189186c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->nblock_used = 0; 189286c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->blockRandomised) { 189386c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_RAND_INIT_MASK; 189486c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_GET_SMALL(s->k0); s->nblock_used++; 189586c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; 189686c2349f3dd6574a20f58b31ed901d0006bced4bnjn } else { 189786c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_GET_SMALL(s->k0); s->nblock_used++; 189886c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 189986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 190086c2349f3dd6574a20f58b31ed901d0006bced4bnjn } else { 190186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 190286c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- compute the T^(-1) vector --*/ 190386c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i < nblock; i++) { 190486c2349f3dd6574a20f58b31ed901d0006bced4bnjn uc = (UChar)(s->tt[i] & 0xff); 190586c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->tt[s->cftab[uc]] |= (i << 8); 190686c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->cftab[uc]++; 190786c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 190886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 190986c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->tPos = s->tt[s->origPtr] >> 8; 191086c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->nblock_used = 0; 191186c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->blockRandomised) { 191286c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_RAND_INIT_MASK; 191386c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_GET_FAST(s->k0); s->nblock_used++; 191486c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; 191586c2349f3dd6574a20f58b31ed901d0006bced4bnjn } else { 191686c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_GET_FAST(s->k0); s->nblock_used++; 191786c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 191886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 191986c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 192086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 192186c2349f3dd6574a20f58b31ed901d0006bced4bnjn RETURN(BZ_OK); 192286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 192386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 192486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 192586c2349f3dd6574a20f58b31ed901d0006bced4bnjn endhdr_2: 192686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 192786c2349f3dd6574a20f58b31ed901d0006bced4bnjn GET_UCHAR(BZ_X_ENDHDR_2, uc); 192886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (uc != 0x72) RETURN(BZ_DATA_ERROR); 192986c2349f3dd6574a20f58b31ed901d0006bced4bnjn GET_UCHAR(BZ_X_ENDHDR_3, uc); 193086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (uc != 0x45) RETURN(BZ_DATA_ERROR); 193186c2349f3dd6574a20f58b31ed901d0006bced4bnjn GET_UCHAR(BZ_X_ENDHDR_4, uc); 193286c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (uc != 0x38) RETURN(BZ_DATA_ERROR); 193386c2349f3dd6574a20f58b31ed901d0006bced4bnjn GET_UCHAR(BZ_X_ENDHDR_5, uc); 193486c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (uc != 0x50) RETURN(BZ_DATA_ERROR); 193586c2349f3dd6574a20f58b31ed901d0006bced4bnjn GET_UCHAR(BZ_X_ENDHDR_6, uc); 193686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (uc != 0x90) RETURN(BZ_DATA_ERROR); 193786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 193886c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->storedCombinedCRC = 0; 193986c2349f3dd6574a20f58b31ed901d0006bced4bnjn GET_UCHAR(BZ_X_CCRC_1, uc); 194086c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); 194186c2349f3dd6574a20f58b31ed901d0006bced4bnjn GET_UCHAR(BZ_X_CCRC_2, uc); 194286c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); 194386c2349f3dd6574a20f58b31ed901d0006bced4bnjn GET_UCHAR(BZ_X_CCRC_3, uc); 194486c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); 194586c2349f3dd6574a20f58b31ed901d0006bced4bnjn GET_UCHAR(BZ_X_CCRC_4, uc); 194686c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); 194786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 194886c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->state = BZ_X_IDLE; 194986c2349f3dd6574a20f58b31ed901d0006bced4bnjn RETURN(BZ_STREAM_END); 195086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 195186c2349f3dd6574a20f58b31ed901d0006bced4bnjn default: AssertH ( False, 4001 ); 195286c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 195386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 195486c2349f3dd6574a20f58b31ed901d0006bced4bnjn AssertH ( False, 4002 ); 195586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 195686c2349f3dd6574a20f58b31ed901d0006bced4bnjn save_state_and_return: 195786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 195886c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_i = i; 195986c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_j = j; 196086c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_t = t; 196186c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_alphaSize = alphaSize; 196286c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_nGroups = nGroups; 196386c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_nSelectors = nSelectors; 196486c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_EOB = EOB; 196586c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_groupNo = groupNo; 196686c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_groupPos = groupPos; 196786c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_nextSym = nextSym; 196886c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_nblockMAX = nblockMAX; 196986c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_nblock = nblock; 197086c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_es = es; 197186c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_N = N; 197286c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_curr = curr; 197386c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_zt = zt; 197486c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_zn = zn; 197586c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_zvec = zvec; 197686c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_zj = zj; 197786c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_gSel = gSel; 197886c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_gMinlen = gMinlen; 197986c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_gLimit = gLimit; 198086c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_gBase = gBase; 198186c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->save_gPerm = gPerm; 198286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 198386c2349f3dd6574a20f58b31ed901d0006bced4bnjn return retVal; 198486c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 198586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 198686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 198786c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-------------------------------------------------------------*/ 198886c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*--- end decompress.c ---*/ 198986c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-------------------------------------------------------------*/ 199086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 199186c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-------------------------------------------------------------*/ 199286c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*--- Block sorting machinery ---*/ 199386c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*--- blocksort.c ---*/ 199486c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-------------------------------------------------------------*/ 199586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 199686c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-- 199786c2349f3dd6574a20f58b31ed901d0006bced4bnjn This file is a part of bzip2 and/or libbzip2, a program and 199886c2349f3dd6574a20f58b31ed901d0006bced4bnjn library for lossless, block-sorting data compression. 199986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 200086c2349f3dd6574a20f58b31ed901d0006bced4bnjn Copyright (C) 1996-2004 Julian R Seward. All rights reserved. 200186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 200286c2349f3dd6574a20f58b31ed901d0006bced4bnjn Redistribution and use in source and binary forms, with or without 200386c2349f3dd6574a20f58b31ed901d0006bced4bnjn modification, are permitted provided that the following conditions 200486c2349f3dd6574a20f58b31ed901d0006bced4bnjn are met: 200586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 200686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 1. Redistributions of source code must retain the above copyright 200786c2349f3dd6574a20f58b31ed901d0006bced4bnjn notice, this list of conditions and the following disclaimer. 200886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 200986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 2. The origin of this software must not be misrepresented; you must 201086c2349f3dd6574a20f58b31ed901d0006bced4bnjn not claim that you wrote the original software. If you use this 201186c2349f3dd6574a20f58b31ed901d0006bced4bnjn software in a product, an acknowledgment in the product 201286c2349f3dd6574a20f58b31ed901d0006bced4bnjn documentation would be appreciated but is not required. 201386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 201486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 3. Altered source versions must be plainly marked as such, and must 201586c2349f3dd6574a20f58b31ed901d0006bced4bnjn not be misrepresented as being the original software. 201686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 201786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 4. The name of the author may not be used to endorse or promote 201886c2349f3dd6574a20f58b31ed901d0006bced4bnjn products derived from this software without specific prior written 201986c2349f3dd6574a20f58b31ed901d0006bced4bnjn permission. 202086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 202186c2349f3dd6574a20f58b31ed901d0006bced4bnjn THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 202286c2349f3dd6574a20f58b31ed901d0006bced4bnjn OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 202386c2349f3dd6574a20f58b31ed901d0006bced4bnjn WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 202486c2349f3dd6574a20f58b31ed901d0006bced4bnjn ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 202586c2349f3dd6574a20f58b31ed901d0006bced4bnjn DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 202686c2349f3dd6574a20f58b31ed901d0006bced4bnjn DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 202786c2349f3dd6574a20f58b31ed901d0006bced4bnjn GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 202886c2349f3dd6574a20f58b31ed901d0006bced4bnjn INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 202986c2349f3dd6574a20f58b31ed901d0006bced4bnjn WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 203086c2349f3dd6574a20f58b31ed901d0006bced4bnjn NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 203186c2349f3dd6574a20f58b31ed901d0006bced4bnjn SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 203286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 203386c2349f3dd6574a20f58b31ed901d0006bced4bnjn Julian Seward, Cambridge, UK. 203486c2349f3dd6574a20f58b31ed901d0006bced4bnjn jseward@bzip.org 203586c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzip2/libbzip2 version 1.0 of 21 March 2000 203686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 203786c2349f3dd6574a20f58b31ed901d0006bced4bnjn This program is based on (at least) the work of: 203886c2349f3dd6574a20f58b31ed901d0006bced4bnjn Mike Burrows 203986c2349f3dd6574a20f58b31ed901d0006bced4bnjn David Wheeler 204086c2349f3dd6574a20f58b31ed901d0006bced4bnjn Peter Fenwick 204186c2349f3dd6574a20f58b31ed901d0006bced4bnjn Alistair Moffat 204286c2349f3dd6574a20f58b31ed901d0006bced4bnjn Radford Neal 204386c2349f3dd6574a20f58b31ed901d0006bced4bnjn Ian H. Witten 204486c2349f3dd6574a20f58b31ed901d0006bced4bnjn Robert Sedgewick 204586c2349f3dd6574a20f58b31ed901d0006bced4bnjn Jon L. Bentley 204686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 204786c2349f3dd6574a20f58b31ed901d0006bced4bnjn For more information on these sources, see the manual. 204886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 204986c2349f3dd6574a20f58b31ed901d0006bced4bnjn To get some idea how the block sorting algorithms in this file 205086c2349f3dd6574a20f58b31ed901d0006bced4bnjn work, read my paper 205186c2349f3dd6574a20f58b31ed901d0006bced4bnjn On the Performance of BWT Sorting Algorithms 205286c2349f3dd6574a20f58b31ed901d0006bced4bnjn in Proceedings of the IEEE Data Compression Conference 2000, 205386c2349f3dd6574a20f58b31ed901d0006bced4bnjn Snowbird, Utah, USA, 27-30 March 2000. The main sort in this 205486c2349f3dd6574a20f58b31ed901d0006bced4bnjn file implements the algorithm called cache in the paper. 205586c2349f3dd6574a20f58b31ed901d0006bced4bnjn--*/ 205686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 205786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 205886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 205986c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------*/ 206086c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*--- Fallback O(N log(N)^2) sorting ---*/ 206186c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*--- algorithm, for repetitive blocks ---*/ 206286c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------*/ 206386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 206486c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------*/ 206586c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic 206686c2349f3dd6574a20f58b31ed901d0006bced4bnjn__inline__ 206786c2349f3dd6574a20f58b31ed901d0006bced4bnjnvoid fallbackSimpleSort ( UInt32* fmap, 206886c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt32* eclass, 206986c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 lo, 207086c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 hi ) 207186c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 207286c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 i, j, tmp; 207386c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt32 ec_tmp; 207486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 207586c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (lo == hi) return; 207686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 207786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (hi - lo > 3) { 207886c2349f3dd6574a20f58b31ed901d0006bced4bnjn for ( i = hi-4; i >= lo; i-- ) { 207986c2349f3dd6574a20f58b31ed901d0006bced4bnjn tmp = fmap[i]; 208086c2349f3dd6574a20f58b31ed901d0006bced4bnjn ec_tmp = eclass[tmp]; 208186c2349f3dd6574a20f58b31ed901d0006bced4bnjn for ( j = i+4; j <= hi && ec_tmp > eclass[fmap[j]]; j += 4 ) 208286c2349f3dd6574a20f58b31ed901d0006bced4bnjn fmap[j-4] = fmap[j]; 208386c2349f3dd6574a20f58b31ed901d0006bced4bnjn fmap[j-4] = tmp; 208486c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 208586c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 208686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 208786c2349f3dd6574a20f58b31ed901d0006bced4bnjn for ( i = hi-1; i >= lo; i-- ) { 208886c2349f3dd6574a20f58b31ed901d0006bced4bnjn tmp = fmap[i]; 208986c2349f3dd6574a20f58b31ed901d0006bced4bnjn ec_tmp = eclass[tmp]; 209086c2349f3dd6574a20f58b31ed901d0006bced4bnjn for ( j = i+1; j <= hi && ec_tmp > eclass[fmap[j]]; j++ ) 209186c2349f3dd6574a20f58b31ed901d0006bced4bnjn fmap[j-1] = fmap[j]; 209286c2349f3dd6574a20f58b31ed901d0006bced4bnjn fmap[j-1] = tmp; 209386c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 209486c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 209586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 209686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 209786c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------*/ 209886c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define fswap(zz1, zz2) \ 209986c2349f3dd6574a20f58b31ed901d0006bced4bnjn { Int32 zztmp = zz1; zz1 = zz2; zz2 = zztmp; } 210086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 210186c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define fvswap(zzp1, zzp2, zzn) \ 210286c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ \ 210386c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 yyp1 = (zzp1); \ 210486c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 yyp2 = (zzp2); \ 210586c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 yyn = (zzn); \ 210686c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (yyn > 0) { \ 210786c2349f3dd6574a20f58b31ed901d0006bced4bnjn fswap(fmap[yyp1], fmap[yyp2]); \ 210886c2349f3dd6574a20f58b31ed901d0006bced4bnjn yyp1++; yyp2++; yyn--; \ 210986c2349f3dd6574a20f58b31ed901d0006bced4bnjn } \ 211086c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 211186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 211286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 211386c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define fmin(a,b) ((a) < (b)) ? (a) : (b) 211486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 211586c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define fpush(lz,hz) { stackLo[sp] = lz; \ 211686c2349f3dd6574a20f58b31ed901d0006bced4bnjn stackHi[sp] = hz; \ 211786c2349f3dd6574a20f58b31ed901d0006bced4bnjn sp++; } 211886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 211986c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define fpop(lz,hz) { sp--; \ 212086c2349f3dd6574a20f58b31ed901d0006bced4bnjn lz = stackLo[sp]; \ 212186c2349f3dd6574a20f58b31ed901d0006bced4bnjn hz = stackHi[sp]; } 212286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 212386c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define FALLBACK_QSORT_SMALL_THRESH 10 212486c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define FALLBACK_QSORT_STACK_SIZE 100 212586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 212686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 212786c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic 212886c2349f3dd6574a20f58b31ed901d0006bced4bnjnvoid fallbackQSort3 ( UInt32* fmap, 212986c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt32* eclass, 213086c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 loSt, 213186c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 hiSt ) 213286c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 213386c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 unLo, unHi, ltLo, gtHi, n, m; 213486c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 sp, lo, hi; 213586c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt32 med, r, r3; 213686c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 stackLo[FALLBACK_QSORT_STACK_SIZE]; 213786c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 stackHi[FALLBACK_QSORT_STACK_SIZE]; 213886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 213986c2349f3dd6574a20f58b31ed901d0006bced4bnjn r = 0; 214086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 214186c2349f3dd6574a20f58b31ed901d0006bced4bnjn sp = 0; 214286c2349f3dd6574a20f58b31ed901d0006bced4bnjn fpush ( loSt, hiSt ); 214386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 214486c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (sp > 0) { 214586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 214686c2349f3dd6574a20f58b31ed901d0006bced4bnjn AssertH ( sp < FALLBACK_QSORT_STACK_SIZE, 1004 ); 214786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 214886c2349f3dd6574a20f58b31ed901d0006bced4bnjn fpop ( lo, hi ); 214986c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (hi - lo < FALLBACK_QSORT_SMALL_THRESH) { 215086c2349f3dd6574a20f58b31ed901d0006bced4bnjn fallbackSimpleSort ( fmap, eclass, lo, hi ); 215186c2349f3dd6574a20f58b31ed901d0006bced4bnjn continue; 215286c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 215386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 215486c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* Random partitioning. Median of 3 sometimes fails to 215586c2349f3dd6574a20f58b31ed901d0006bced4bnjn avoid bad cases. Median of 9 seems to help but 215686c2349f3dd6574a20f58b31ed901d0006bced4bnjn looks rather expensive. This too seems to work but 215786c2349f3dd6574a20f58b31ed901d0006bced4bnjn is cheaper. Guidance for the magic constants 215886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 7621 and 32768 is taken from Sedgewick's algorithms 215986c2349f3dd6574a20f58b31ed901d0006bced4bnjn book, chapter 35. 216086c2349f3dd6574a20f58b31ed901d0006bced4bnjn */ 216186c2349f3dd6574a20f58b31ed901d0006bced4bnjn r = ((r * 7621) + 1) % 32768; 216286c2349f3dd6574a20f58b31ed901d0006bced4bnjn r3 = r % 3; 216386c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (r3 == 0) med = eclass[fmap[lo]]; else 216486c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (r3 == 1) med = eclass[fmap[(lo+hi)>>1]]; else 216586c2349f3dd6574a20f58b31ed901d0006bced4bnjn med = eclass[fmap[hi]]; 216686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 216786c2349f3dd6574a20f58b31ed901d0006bced4bnjn unLo = ltLo = lo; 216886c2349f3dd6574a20f58b31ed901d0006bced4bnjn unHi = gtHi = hi; 216986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 217086c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (1) { 217186c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (1) { 217286c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (unLo > unHi) break; 217386c2349f3dd6574a20f58b31ed901d0006bced4bnjn n = (Int32)eclass[fmap[unLo]] - (Int32)med; 217486c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (n == 0) { 217586c2349f3dd6574a20f58b31ed901d0006bced4bnjn fswap(fmap[unLo], fmap[ltLo]); 217686c2349f3dd6574a20f58b31ed901d0006bced4bnjn ltLo++; unLo++; 217786c2349f3dd6574a20f58b31ed901d0006bced4bnjn continue; 217886c2349f3dd6574a20f58b31ed901d0006bced4bnjn }; 217986c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (n > 0) break; 218086c2349f3dd6574a20f58b31ed901d0006bced4bnjn unLo++; 218186c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 218286c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (1) { 218386c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (unLo > unHi) break; 218486c2349f3dd6574a20f58b31ed901d0006bced4bnjn n = (Int32)eclass[fmap[unHi]] - (Int32)med; 218586c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (n == 0) { 218686c2349f3dd6574a20f58b31ed901d0006bced4bnjn fswap(fmap[unHi], fmap[gtHi]); 218786c2349f3dd6574a20f58b31ed901d0006bced4bnjn gtHi--; unHi--; 218886c2349f3dd6574a20f58b31ed901d0006bced4bnjn continue; 218986c2349f3dd6574a20f58b31ed901d0006bced4bnjn }; 219086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (n < 0) break; 219186c2349f3dd6574a20f58b31ed901d0006bced4bnjn unHi--; 219286c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 219386c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (unLo > unHi) break; 219486c2349f3dd6574a20f58b31ed901d0006bced4bnjn fswap(fmap[unLo], fmap[unHi]); unLo++; unHi--; 219586c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 219686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 219786c2349f3dd6574a20f58b31ed901d0006bced4bnjn AssertD ( unHi == unLo-1, "fallbackQSort3(2)" ); 219886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 219986c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (gtHi < ltLo) continue; 220086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 220186c2349f3dd6574a20f58b31ed901d0006bced4bnjn n = fmin(ltLo-lo, unLo-ltLo); fvswap(lo, unLo-n, n); 220286c2349f3dd6574a20f58b31ed901d0006bced4bnjn m = fmin(hi-gtHi, gtHi-unHi); fvswap(unLo, hi-m+1, m); 220386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 220486c2349f3dd6574a20f58b31ed901d0006bced4bnjn n = lo + unLo - ltLo - 1; 220586c2349f3dd6574a20f58b31ed901d0006bced4bnjn m = hi - (gtHi - unHi) + 1; 220686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 220786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (n - lo > hi - m) { 220886c2349f3dd6574a20f58b31ed901d0006bced4bnjn fpush ( lo, n ); 220986c2349f3dd6574a20f58b31ed901d0006bced4bnjn fpush ( m, hi ); 221086c2349f3dd6574a20f58b31ed901d0006bced4bnjn } else { 221186c2349f3dd6574a20f58b31ed901d0006bced4bnjn fpush ( m, hi ); 221286c2349f3dd6574a20f58b31ed901d0006bced4bnjn fpush ( lo, n ); 221386c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 221486c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 221586c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 221686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 221786c2349f3dd6574a20f58b31ed901d0006bced4bnjn#undef fmin 221886c2349f3dd6574a20f58b31ed901d0006bced4bnjn#undef fpush 221986c2349f3dd6574a20f58b31ed901d0006bced4bnjn#undef fpop 222086c2349f3dd6574a20f58b31ed901d0006bced4bnjn#undef fswap 222186c2349f3dd6574a20f58b31ed901d0006bced4bnjn#undef fvswap 222286c2349f3dd6574a20f58b31ed901d0006bced4bnjn#undef FALLBACK_QSORT_SMALL_THRESH 222386c2349f3dd6574a20f58b31ed901d0006bced4bnjn#undef FALLBACK_QSORT_STACK_SIZE 222486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 222586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 222686c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------*/ 222786c2349f3dd6574a20f58b31ed901d0006bced4bnjn/* Pre: 222886c2349f3dd6574a20f58b31ed901d0006bced4bnjn nblock > 0 222986c2349f3dd6574a20f58b31ed901d0006bced4bnjn eclass exists for [0 .. nblock-1] 223086c2349f3dd6574a20f58b31ed901d0006bced4bnjn ((UChar*)eclass) [0 .. nblock-1] holds block 223186c2349f3dd6574a20f58b31ed901d0006bced4bnjn ptr exists for [0 .. nblock-1] 223286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 223386c2349f3dd6574a20f58b31ed901d0006bced4bnjn Post: 223486c2349f3dd6574a20f58b31ed901d0006bced4bnjn ((UChar*)eclass) [0 .. nblock-1] holds block 223586c2349f3dd6574a20f58b31ed901d0006bced4bnjn All other areas of eclass destroyed 223686c2349f3dd6574a20f58b31ed901d0006bced4bnjn fmap [0 .. nblock-1] holds sorted order 223786c2349f3dd6574a20f58b31ed901d0006bced4bnjn bhtab [ 0 .. 2+(nblock/32) ] destroyed 223886c2349f3dd6574a20f58b31ed901d0006bced4bnjn*/ 223986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 224086c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define SET_BH(zz) bhtab[(zz) >> 5] |= (1 << ((zz) & 31)) 224186c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define CLEAR_BH(zz) bhtab[(zz) >> 5] &= ~(1 << ((zz) & 31)) 224286c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define ISSET_BH(zz) (bhtab[(zz) >> 5] & (1 << ((zz) & 31))) 224386c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define WORD_BH(zz) bhtab[(zz) >> 5] 224486c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define UNALIGNED_BH(zz) ((zz) & 0x01f) 224586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 224686c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic 224786c2349f3dd6574a20f58b31ed901d0006bced4bnjnvoid fallbackSort ( UInt32* fmap, 224886c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt32* eclass, 224986c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt32* bhtab, 225086c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 nblock, 225186c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 verb ) 225286c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 225386c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 ftab[257]; 225486c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 ftabCopy[256]; 225586c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 H, i, j, k, l, r, cc, cc1; 225686c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 nNotDone; 225786c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 nBhtab; 225886c2349f3dd6574a20f58b31ed901d0006bced4bnjn UChar* eclass8 = (UChar*)eclass; 225986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 226086c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- 226186c2349f3dd6574a20f58b31ed901d0006bced4bnjn Initial 1-char radix sort to generate 226286c2349f3dd6574a20f58b31ed901d0006bced4bnjn initial fmap and initial BH bits. 226386c2349f3dd6574a20f58b31ed901d0006bced4bnjn --*/ 226486c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (verb >= 4) 226586c2349f3dd6574a20f58b31ed901d0006bced4bnjn VPrintf0 ( " bucket sorting ...\n" ); 226686c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i < 257; i++) ftab[i] = 0; 226786c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i < nblock; i++) ftab[eclass8[i]]++; 226886c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i < 256; i++) ftabCopy[i] = ftab[i]; 226986c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 1; i < 257; i++) ftab[i] += ftab[i-1]; 227086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 227186c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i < nblock; i++) { 227286c2349f3dd6574a20f58b31ed901d0006bced4bnjn j = eclass8[i]; 227386c2349f3dd6574a20f58b31ed901d0006bced4bnjn k = ftab[j] - 1; 227486c2349f3dd6574a20f58b31ed901d0006bced4bnjn ftab[j] = k; 227586c2349f3dd6574a20f58b31ed901d0006bced4bnjn fmap[k] = i; 227686c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 227786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 227886c2349f3dd6574a20f58b31ed901d0006bced4bnjn nBhtab = 2 + (nblock / 32); 227986c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i < nBhtab; i++) bhtab[i] = 0; 228086c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i < 256; i++) SET_BH(ftab[i]); 228186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 228286c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- 228386c2349f3dd6574a20f58b31ed901d0006bced4bnjn Inductively refine the buckets. Kind-of an 228486c2349f3dd6574a20f58b31ed901d0006bced4bnjn "exponential radix sort" (!), inspired by the 228586c2349f3dd6574a20f58b31ed901d0006bced4bnjn Manber-Myers suffix array construction algorithm. 228686c2349f3dd6574a20f58b31ed901d0006bced4bnjn --*/ 228786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 228886c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- set sentinel bits for block-end detection --*/ 228986c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i < 32; i++) { 229086c2349f3dd6574a20f58b31ed901d0006bced4bnjn SET_BH(nblock + 2*i); 229186c2349f3dd6574a20f58b31ed901d0006bced4bnjn CLEAR_BH(nblock + 2*i + 1); 229286c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 229386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 229486c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- the log(N) loop --*/ 229586c2349f3dd6574a20f58b31ed901d0006bced4bnjn H = 1; 229686c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (1) { 229786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 229886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (verb >= 4) 229986c2349f3dd6574a20f58b31ed901d0006bced4bnjn VPrintf1 ( " depth %6d has ", H ); 230086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 230186c2349f3dd6574a20f58b31ed901d0006bced4bnjn j = 0; 230286c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i < nblock; i++) { 230386c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (ISSET_BH(i)) j = i; 230486c2349f3dd6574a20f58b31ed901d0006bced4bnjn k = fmap[i] - H; if (k < 0) k += nblock; 230586c2349f3dd6574a20f58b31ed901d0006bced4bnjn eclass[k] = j; 230686c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 230786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 230886c2349f3dd6574a20f58b31ed901d0006bced4bnjn nNotDone = 0; 230986c2349f3dd6574a20f58b31ed901d0006bced4bnjn r = -1; 231086c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (1) { 231186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 231286c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- find the next non-singleton bucket --*/ 231386c2349f3dd6574a20f58b31ed901d0006bced4bnjn k = r + 1; 231486c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (ISSET_BH(k) && UNALIGNED_BH(k)) k++; 231586c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (ISSET_BH(k)) { 231686c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (WORD_BH(k) == 0xffffffff) k += 32; 231786c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (ISSET_BH(k)) k++; 231886c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 231986c2349f3dd6574a20f58b31ed901d0006bced4bnjn l = k - 1; 232086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (l >= nblock) break; 232186c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (!ISSET_BH(k) && UNALIGNED_BH(k)) k++; 232286c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (!ISSET_BH(k)) { 232386c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (WORD_BH(k) == 0x00000000) k += 32; 232486c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (!ISSET_BH(k)) k++; 232586c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 232686c2349f3dd6574a20f58b31ed901d0006bced4bnjn r = k - 1; 232786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (r >= nblock) break; 232886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 232986c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- now [l, r] bracket current bucket --*/ 233086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (r > l) { 233186c2349f3dd6574a20f58b31ed901d0006bced4bnjn nNotDone += (r - l + 1); 233286c2349f3dd6574a20f58b31ed901d0006bced4bnjn fallbackQSort3 ( fmap, eclass, l, r ); 233386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 233486c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- scan bucket and generate header bits-- */ 233586c2349f3dd6574a20f58b31ed901d0006bced4bnjn cc = -1; 233686c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = l; i <= r; i++) { 233786c2349f3dd6574a20f58b31ed901d0006bced4bnjn cc1 = eclass[fmap[i]]; 233886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (cc != cc1) { SET_BH(i); cc = cc1; }; 233986c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 234086c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 234186c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 234286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 234386c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (verb >= 4) 234486c2349f3dd6574a20f58b31ed901d0006bced4bnjn VPrintf1 ( "%6d unresolved strings\n", nNotDone ); 234586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 234686c2349f3dd6574a20f58b31ed901d0006bced4bnjn H *= 2; 234786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (H > nblock || nNotDone == 0) break; 234886c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 234986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 235086c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- 235186c2349f3dd6574a20f58b31ed901d0006bced4bnjn Reconstruct the original block in 235286c2349f3dd6574a20f58b31ed901d0006bced4bnjn eclass8 [0 .. nblock-1], since the 235386c2349f3dd6574a20f58b31ed901d0006bced4bnjn previous phase destroyed it. 235486c2349f3dd6574a20f58b31ed901d0006bced4bnjn --*/ 235586c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (verb >= 4) 235686c2349f3dd6574a20f58b31ed901d0006bced4bnjn VPrintf0 ( " reconstructing block ...\n" ); 235786c2349f3dd6574a20f58b31ed901d0006bced4bnjn j = 0; 235886c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i < nblock; i++) { 235986c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (ftabCopy[j] == 0) j++; 236086c2349f3dd6574a20f58b31ed901d0006bced4bnjn ftabCopy[j]--; 236186c2349f3dd6574a20f58b31ed901d0006bced4bnjn eclass8[fmap[i]] = (UChar)j; 236286c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 236386c2349f3dd6574a20f58b31ed901d0006bced4bnjn AssertH ( j < 256, 1005 ); 236486c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 236586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 236686c2349f3dd6574a20f58b31ed901d0006bced4bnjn#undef SET_BH 236786c2349f3dd6574a20f58b31ed901d0006bced4bnjn#undef CLEAR_BH 236886c2349f3dd6574a20f58b31ed901d0006bced4bnjn#undef ISSET_BH 236986c2349f3dd6574a20f58b31ed901d0006bced4bnjn#undef WORD_BH 237086c2349f3dd6574a20f58b31ed901d0006bced4bnjn#undef UNALIGNED_BH 237186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 237286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 237386c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------*/ 237486c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*--- The main, O(N^2 log(N)) sorting ---*/ 237586c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*--- algorithm. Faster for "normal" ---*/ 237686c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*--- non-repetitive blocks. ---*/ 237786c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------*/ 237886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 237986c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------*/ 238086c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic 238186c2349f3dd6574a20f58b31ed901d0006bced4bnjn__inline__ 238286c2349f3dd6574a20f58b31ed901d0006bced4bnjnBool mainGtU ( UInt32 i1, 238386c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt32 i2, 238486c2349f3dd6574a20f58b31ed901d0006bced4bnjn UChar* block, 238586c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt16* quadrant, 238686c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt32 nblock, 238786c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32* budget ) 238886c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 238986c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 k; 239086c2349f3dd6574a20f58b31ed901d0006bced4bnjn UChar c1, c2; 239186c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt16 s1, s2; 239286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 239386c2349f3dd6574a20f58b31ed901d0006bced4bnjn AssertD ( i1 != i2, "mainGtU" ); 239486c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* 1 */ 239586c2349f3dd6574a20f58b31ed901d0006bced4bnjn c1 = block[i1]; c2 = block[i2]; 239686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (c1 != c2) return (c1 > c2); 239786c2349f3dd6574a20f58b31ed901d0006bced4bnjn i1++; i2++; 239886c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* 2 */ 239986c2349f3dd6574a20f58b31ed901d0006bced4bnjn c1 = block[i1]; c2 = block[i2]; 240086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (c1 != c2) return (c1 > c2); 240186c2349f3dd6574a20f58b31ed901d0006bced4bnjn i1++; i2++; 240286c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* 3 */ 240386c2349f3dd6574a20f58b31ed901d0006bced4bnjn c1 = block[i1]; c2 = block[i2]; 240486c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (c1 != c2) return (c1 > c2); 240586c2349f3dd6574a20f58b31ed901d0006bced4bnjn i1++; i2++; 240686c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* 4 */ 240786c2349f3dd6574a20f58b31ed901d0006bced4bnjn c1 = block[i1]; c2 = block[i2]; 240886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (c1 != c2) return (c1 > c2); 240986c2349f3dd6574a20f58b31ed901d0006bced4bnjn i1++; i2++; 241086c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* 5 */ 241186c2349f3dd6574a20f58b31ed901d0006bced4bnjn c1 = block[i1]; c2 = block[i2]; 241286c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (c1 != c2) return (c1 > c2); 241386c2349f3dd6574a20f58b31ed901d0006bced4bnjn i1++; i2++; 241486c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* 6 */ 241586c2349f3dd6574a20f58b31ed901d0006bced4bnjn c1 = block[i1]; c2 = block[i2]; 241686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (c1 != c2) return (c1 > c2); 241786c2349f3dd6574a20f58b31ed901d0006bced4bnjn i1++; i2++; 241886c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* 7 */ 241986c2349f3dd6574a20f58b31ed901d0006bced4bnjn c1 = block[i1]; c2 = block[i2]; 242086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (c1 != c2) return (c1 > c2); 242186c2349f3dd6574a20f58b31ed901d0006bced4bnjn i1++; i2++; 242286c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* 8 */ 242386c2349f3dd6574a20f58b31ed901d0006bced4bnjn c1 = block[i1]; c2 = block[i2]; 242486c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (c1 != c2) return (c1 > c2); 242586c2349f3dd6574a20f58b31ed901d0006bced4bnjn i1++; i2++; 242686c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* 9 */ 242786c2349f3dd6574a20f58b31ed901d0006bced4bnjn c1 = block[i1]; c2 = block[i2]; 242886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (c1 != c2) return (c1 > c2); 242986c2349f3dd6574a20f58b31ed901d0006bced4bnjn i1++; i2++; 243086c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* 10 */ 243186c2349f3dd6574a20f58b31ed901d0006bced4bnjn c1 = block[i1]; c2 = block[i2]; 243286c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (c1 != c2) return (c1 > c2); 243386c2349f3dd6574a20f58b31ed901d0006bced4bnjn i1++; i2++; 243486c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* 11 */ 243586c2349f3dd6574a20f58b31ed901d0006bced4bnjn c1 = block[i1]; c2 = block[i2]; 243686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (c1 != c2) return (c1 > c2); 243786c2349f3dd6574a20f58b31ed901d0006bced4bnjn i1++; i2++; 243886c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* 12 */ 243986c2349f3dd6574a20f58b31ed901d0006bced4bnjn c1 = block[i1]; c2 = block[i2]; 244086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (c1 != c2) return (c1 > c2); 244186c2349f3dd6574a20f58b31ed901d0006bced4bnjn i1++; i2++; 244286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 244386c2349f3dd6574a20f58b31ed901d0006bced4bnjn k = nblock + 8; 244486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 244586c2349f3dd6574a20f58b31ed901d0006bced4bnjn do { 244686c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* 1 */ 244786c2349f3dd6574a20f58b31ed901d0006bced4bnjn c1 = block[i1]; c2 = block[i2]; 244886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (c1 != c2) return (c1 > c2); 244986c2349f3dd6574a20f58b31ed901d0006bced4bnjn s1 = quadrant[i1]; s2 = quadrant[i2]; 245086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s1 != s2) return (s1 > s2); 245186c2349f3dd6574a20f58b31ed901d0006bced4bnjn i1++; i2++; 245286c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* 2 */ 245386c2349f3dd6574a20f58b31ed901d0006bced4bnjn c1 = block[i1]; c2 = block[i2]; 245486c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (c1 != c2) return (c1 > c2); 245586c2349f3dd6574a20f58b31ed901d0006bced4bnjn s1 = quadrant[i1]; s2 = quadrant[i2]; 245686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s1 != s2) return (s1 > s2); 245786c2349f3dd6574a20f58b31ed901d0006bced4bnjn i1++; i2++; 245886c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* 3 */ 245986c2349f3dd6574a20f58b31ed901d0006bced4bnjn c1 = block[i1]; c2 = block[i2]; 246086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (c1 != c2) return (c1 > c2); 246186c2349f3dd6574a20f58b31ed901d0006bced4bnjn s1 = quadrant[i1]; s2 = quadrant[i2]; 246286c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s1 != s2) return (s1 > s2); 246386c2349f3dd6574a20f58b31ed901d0006bced4bnjn i1++; i2++; 246486c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* 4 */ 246586c2349f3dd6574a20f58b31ed901d0006bced4bnjn c1 = block[i1]; c2 = block[i2]; 246686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (c1 != c2) return (c1 > c2); 246786c2349f3dd6574a20f58b31ed901d0006bced4bnjn s1 = quadrant[i1]; s2 = quadrant[i2]; 246886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s1 != s2) return (s1 > s2); 246986c2349f3dd6574a20f58b31ed901d0006bced4bnjn i1++; i2++; 247086c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* 5 */ 247186c2349f3dd6574a20f58b31ed901d0006bced4bnjn c1 = block[i1]; c2 = block[i2]; 247286c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (c1 != c2) return (c1 > c2); 247386c2349f3dd6574a20f58b31ed901d0006bced4bnjn s1 = quadrant[i1]; s2 = quadrant[i2]; 247486c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s1 != s2) return (s1 > s2); 247586c2349f3dd6574a20f58b31ed901d0006bced4bnjn i1++; i2++; 247686c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* 6 */ 247786c2349f3dd6574a20f58b31ed901d0006bced4bnjn c1 = block[i1]; c2 = block[i2]; 247886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (c1 != c2) return (c1 > c2); 247986c2349f3dd6574a20f58b31ed901d0006bced4bnjn s1 = quadrant[i1]; s2 = quadrant[i2]; 248086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s1 != s2) return (s1 > s2); 248186c2349f3dd6574a20f58b31ed901d0006bced4bnjn i1++; i2++; 248286c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* 7 */ 248386c2349f3dd6574a20f58b31ed901d0006bced4bnjn c1 = block[i1]; c2 = block[i2]; 248486c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (c1 != c2) return (c1 > c2); 248586c2349f3dd6574a20f58b31ed901d0006bced4bnjn s1 = quadrant[i1]; s2 = quadrant[i2]; 248686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s1 != s2) return (s1 > s2); 248786c2349f3dd6574a20f58b31ed901d0006bced4bnjn i1++; i2++; 248886c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* 8 */ 248986c2349f3dd6574a20f58b31ed901d0006bced4bnjn c1 = block[i1]; c2 = block[i2]; 249086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (c1 != c2) return (c1 > c2); 249186c2349f3dd6574a20f58b31ed901d0006bced4bnjn s1 = quadrant[i1]; s2 = quadrant[i2]; 249286c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s1 != s2) return (s1 > s2); 249386c2349f3dd6574a20f58b31ed901d0006bced4bnjn i1++; i2++; 249486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 249586c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (i1 >= nblock) i1 -= nblock; 249686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (i2 >= nblock) i2 -= nblock; 249786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 249886c2349f3dd6574a20f58b31ed901d0006bced4bnjn k -= 8; 249986c2349f3dd6574a20f58b31ed901d0006bced4bnjn (*budget)--; 250086c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 250186c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (k >= 0); 250286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 250386c2349f3dd6574a20f58b31ed901d0006bced4bnjn return False; 250486c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 250586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 250686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 250786c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------*/ 250886c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-- 250986c2349f3dd6574a20f58b31ed901d0006bced4bnjn Knuth's increments seem to work better 251086c2349f3dd6574a20f58b31ed901d0006bced4bnjn than Incerpi-Sedgewick here. Possibly 251186c2349f3dd6574a20f58b31ed901d0006bced4bnjn because the number of elems to sort is 251286c2349f3dd6574a20f58b31ed901d0006bced4bnjn usually small, typically <= 20. 251386c2349f3dd6574a20f58b31ed901d0006bced4bnjn--*/ 251486c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic 251586c2349f3dd6574a20f58b31ed901d0006bced4bnjnInt32 incs[14] = { 1, 4, 13, 40, 121, 364, 1093, 3280, 251686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 9841, 29524, 88573, 265720, 251786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 797161, 2391484 }; 251886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 251986c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic 252086c2349f3dd6574a20f58b31ed901d0006bced4bnjnvoid mainSimpleSort ( UInt32* ptr, 252186c2349f3dd6574a20f58b31ed901d0006bced4bnjn UChar* block, 252286c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt16* quadrant, 252386c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 nblock, 252486c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 lo, 252586c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 hi, 252686c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 d, 252786c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32* budget ) 252886c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 252986c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 i, j, h, bigN, hp; 253086c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt32 v; 253186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 253286c2349f3dd6574a20f58b31ed901d0006bced4bnjn bigN = hi - lo + 1; 253386c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (bigN < 2) return; 253486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 253586c2349f3dd6574a20f58b31ed901d0006bced4bnjn hp = 0; 253686c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (incs[hp] < bigN) hp++; 253786c2349f3dd6574a20f58b31ed901d0006bced4bnjn hp--; 253886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 253986c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (; hp >= 0; hp--) { 254086c2349f3dd6574a20f58b31ed901d0006bced4bnjn h = incs[hp]; 254186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 254286c2349f3dd6574a20f58b31ed901d0006bced4bnjn i = lo + h; 254386c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (True) { 254486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 254586c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- copy 1 --*/ 254686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (i > hi) break; 254786c2349f3dd6574a20f58b31ed901d0006bced4bnjn v = ptr[i]; 254886c2349f3dd6574a20f58b31ed901d0006bced4bnjn j = i; 254986c2349f3dd6574a20f58b31ed901d0006bced4bnjn while ( mainGtU ( 255086c2349f3dd6574a20f58b31ed901d0006bced4bnjn ptr[j-h]+d, v+d, block, quadrant, nblock, budget 255186c2349f3dd6574a20f58b31ed901d0006bced4bnjn ) ) { 255286c2349f3dd6574a20f58b31ed901d0006bced4bnjn ptr[j] = ptr[j-h]; 255386c2349f3dd6574a20f58b31ed901d0006bced4bnjn j = j - h; 255486c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (j <= (lo + h - 1)) break; 255586c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 255686c2349f3dd6574a20f58b31ed901d0006bced4bnjn ptr[j] = v; 255786c2349f3dd6574a20f58b31ed901d0006bced4bnjn i++; 255886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 255986c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- copy 2 --*/ 256086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (i > hi) break; 256186c2349f3dd6574a20f58b31ed901d0006bced4bnjn v = ptr[i]; 256286c2349f3dd6574a20f58b31ed901d0006bced4bnjn j = i; 256386c2349f3dd6574a20f58b31ed901d0006bced4bnjn while ( mainGtU ( 256486c2349f3dd6574a20f58b31ed901d0006bced4bnjn ptr[j-h]+d, v+d, block, quadrant, nblock, budget 256586c2349f3dd6574a20f58b31ed901d0006bced4bnjn ) ) { 256686c2349f3dd6574a20f58b31ed901d0006bced4bnjn ptr[j] = ptr[j-h]; 256786c2349f3dd6574a20f58b31ed901d0006bced4bnjn j = j - h; 256886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (j <= (lo + h - 1)) break; 256986c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 257086c2349f3dd6574a20f58b31ed901d0006bced4bnjn ptr[j] = v; 257186c2349f3dd6574a20f58b31ed901d0006bced4bnjn i++; 257286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 257386c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- copy 3 --*/ 257486c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (i > hi) break; 257586c2349f3dd6574a20f58b31ed901d0006bced4bnjn v = ptr[i]; 257686c2349f3dd6574a20f58b31ed901d0006bced4bnjn j = i; 257786c2349f3dd6574a20f58b31ed901d0006bced4bnjn while ( mainGtU ( 257886c2349f3dd6574a20f58b31ed901d0006bced4bnjn ptr[j-h]+d, v+d, block, quadrant, nblock, budget 257986c2349f3dd6574a20f58b31ed901d0006bced4bnjn ) ) { 258086c2349f3dd6574a20f58b31ed901d0006bced4bnjn ptr[j] = ptr[j-h]; 258186c2349f3dd6574a20f58b31ed901d0006bced4bnjn j = j - h; 258286c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (j <= (lo + h - 1)) break; 258386c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 258486c2349f3dd6574a20f58b31ed901d0006bced4bnjn ptr[j] = v; 258586c2349f3dd6574a20f58b31ed901d0006bced4bnjn i++; 258686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 258786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (*budget < 0) return; 258886c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 258986c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 259086c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 259186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 259286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 259386c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------*/ 259486c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-- 259586c2349f3dd6574a20f58b31ed901d0006bced4bnjn The following is an implementation of 259686c2349f3dd6574a20f58b31ed901d0006bced4bnjn an elegant 3-way quicksort for strings, 259786c2349f3dd6574a20f58b31ed901d0006bced4bnjn described in a paper "Fast Algorithms for 259886c2349f3dd6574a20f58b31ed901d0006bced4bnjn Sorting and Searching Strings", by Robert 259986c2349f3dd6574a20f58b31ed901d0006bced4bnjn Sedgewick and Jon L. Bentley. 260086c2349f3dd6574a20f58b31ed901d0006bced4bnjn--*/ 260186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 260286c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define mswap(zz1, zz2) \ 260386c2349f3dd6574a20f58b31ed901d0006bced4bnjn { Int32 zztmp = zz1; zz1 = zz2; zz2 = zztmp; } 260486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 260586c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define mvswap(zzp1, zzp2, zzn) \ 260686c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ \ 260786c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 yyp1 = (zzp1); \ 260886c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 yyp2 = (zzp2); \ 260986c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 yyn = (zzn); \ 261086c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (yyn > 0) { \ 261186c2349f3dd6574a20f58b31ed901d0006bced4bnjn mswap(ptr[yyp1], ptr[yyp2]); \ 261286c2349f3dd6574a20f58b31ed901d0006bced4bnjn yyp1++; yyp2++; yyn--; \ 261386c2349f3dd6574a20f58b31ed901d0006bced4bnjn } \ 261486c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 261586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 261686c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic 261786c2349f3dd6574a20f58b31ed901d0006bced4bnjn__inline__ 261886c2349f3dd6574a20f58b31ed901d0006bced4bnjnUChar mmed3 ( UChar a, UChar b, UChar c ) 261986c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 262086c2349f3dd6574a20f58b31ed901d0006bced4bnjn UChar t; 262186c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (a > b) { t = a; a = b; b = t; }; 262286c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (b > c) { 262386c2349f3dd6574a20f58b31ed901d0006bced4bnjn b = c; 262486c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (a > b) b = a; 262586c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 262686c2349f3dd6574a20f58b31ed901d0006bced4bnjn return b; 262786c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 262886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 262986c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define mmin(a,b) ((a) < (b)) ? (a) : (b) 263086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 263186c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define mpush(lz,hz,dz) { stackLo[sp] = lz; \ 263286c2349f3dd6574a20f58b31ed901d0006bced4bnjn stackHi[sp] = hz; \ 263386c2349f3dd6574a20f58b31ed901d0006bced4bnjn stackD [sp] = dz; \ 263486c2349f3dd6574a20f58b31ed901d0006bced4bnjn sp++; } 263586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 263686c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define mpop(lz,hz,dz) { sp--; \ 263786c2349f3dd6574a20f58b31ed901d0006bced4bnjn lz = stackLo[sp]; \ 263886c2349f3dd6574a20f58b31ed901d0006bced4bnjn hz = stackHi[sp]; \ 263986c2349f3dd6574a20f58b31ed901d0006bced4bnjn dz = stackD [sp]; } 264086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 264186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 264286c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define mnextsize(az) (nextHi[az]-nextLo[az]) 264386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 264486c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define mnextswap(az,bz) \ 264586c2349f3dd6574a20f58b31ed901d0006bced4bnjn { Int32 tz; \ 264686c2349f3dd6574a20f58b31ed901d0006bced4bnjn tz = nextLo[az]; nextLo[az] = nextLo[bz]; nextLo[bz] = tz; \ 264786c2349f3dd6574a20f58b31ed901d0006bced4bnjn tz = nextHi[az]; nextHi[az] = nextHi[bz]; nextHi[bz] = tz; \ 264886c2349f3dd6574a20f58b31ed901d0006bced4bnjn tz = nextD [az]; nextD [az] = nextD [bz]; nextD [bz] = tz; } 264986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 265086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 265186c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define MAIN_QSORT_SMALL_THRESH 20 265286c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define MAIN_QSORT_DEPTH_THRESH (BZ_N_RADIX + BZ_N_QSORT) 265386c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define MAIN_QSORT_STACK_SIZE 100 265486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 265586c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic 265686c2349f3dd6574a20f58b31ed901d0006bced4bnjnvoid mainQSort3 ( UInt32* ptr, 265786c2349f3dd6574a20f58b31ed901d0006bced4bnjn UChar* block, 265886c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt16* quadrant, 265986c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 nblock, 266086c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 loSt, 266186c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 hiSt, 266286c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 dSt, 266386c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32* budget ) 266486c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 266586c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 unLo, unHi, ltLo, gtHi, n, m, med; 266686c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 sp, lo, hi, d; 266786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 266886c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 stackLo[MAIN_QSORT_STACK_SIZE]; 266986c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 stackHi[MAIN_QSORT_STACK_SIZE]; 267086c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 stackD [MAIN_QSORT_STACK_SIZE]; 267186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 267286c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 nextLo[3]; 267386c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 nextHi[3]; 267486c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 nextD [3]; 267586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 267686c2349f3dd6574a20f58b31ed901d0006bced4bnjn sp = 0; 267786c2349f3dd6574a20f58b31ed901d0006bced4bnjn mpush ( loSt, hiSt, dSt ); 267886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 267986c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (sp > 0) { 268086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 268186c2349f3dd6574a20f58b31ed901d0006bced4bnjn AssertH ( sp < MAIN_QSORT_STACK_SIZE, 1001 ); 268286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 268386c2349f3dd6574a20f58b31ed901d0006bced4bnjn mpop ( lo, hi, d ); 268486c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (hi - lo < MAIN_QSORT_SMALL_THRESH || 268586c2349f3dd6574a20f58b31ed901d0006bced4bnjn d > MAIN_QSORT_DEPTH_THRESH) { 268686c2349f3dd6574a20f58b31ed901d0006bced4bnjn mainSimpleSort ( ptr, block, quadrant, nblock, lo, hi, d, budget ); 268786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (*budget < 0) return; 268886c2349f3dd6574a20f58b31ed901d0006bced4bnjn continue; 268986c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 269086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 269186c2349f3dd6574a20f58b31ed901d0006bced4bnjn med = (Int32) 269286c2349f3dd6574a20f58b31ed901d0006bced4bnjn mmed3 ( block[ptr[ lo ]+d], 269386c2349f3dd6574a20f58b31ed901d0006bced4bnjn block[ptr[ hi ]+d], 269486c2349f3dd6574a20f58b31ed901d0006bced4bnjn block[ptr[ (lo+hi)>>1 ]+d] ); 269586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 269686c2349f3dd6574a20f58b31ed901d0006bced4bnjn unLo = ltLo = lo; 269786c2349f3dd6574a20f58b31ed901d0006bced4bnjn unHi = gtHi = hi; 269886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 269986c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (True) { 270086c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (True) { 270186c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (unLo > unHi) break; 270286c2349f3dd6574a20f58b31ed901d0006bced4bnjn n = ((Int32)block[ptr[unLo]+d]) - med; 270386c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (n == 0) { 270486c2349f3dd6574a20f58b31ed901d0006bced4bnjn mswap(ptr[unLo], ptr[ltLo]); 270586c2349f3dd6574a20f58b31ed901d0006bced4bnjn ltLo++; unLo++; continue; 270686c2349f3dd6574a20f58b31ed901d0006bced4bnjn }; 270786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (n > 0) break; 270886c2349f3dd6574a20f58b31ed901d0006bced4bnjn unLo++; 270986c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 271086c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (True) { 271186c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (unLo > unHi) break; 271286c2349f3dd6574a20f58b31ed901d0006bced4bnjn n = ((Int32)block[ptr[unHi]+d]) - med; 271386c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (n == 0) { 271486c2349f3dd6574a20f58b31ed901d0006bced4bnjn mswap(ptr[unHi], ptr[gtHi]); 271586c2349f3dd6574a20f58b31ed901d0006bced4bnjn gtHi--; unHi--; continue; 271686c2349f3dd6574a20f58b31ed901d0006bced4bnjn }; 271786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (n < 0) break; 271886c2349f3dd6574a20f58b31ed901d0006bced4bnjn unHi--; 271986c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 272086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (unLo > unHi) break; 272186c2349f3dd6574a20f58b31ed901d0006bced4bnjn mswap(ptr[unLo], ptr[unHi]); unLo++; unHi--; 272286c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 272386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 272486c2349f3dd6574a20f58b31ed901d0006bced4bnjn AssertD ( unHi == unLo-1, "mainQSort3(2)" ); 272586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 272686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (gtHi < ltLo) { 272786c2349f3dd6574a20f58b31ed901d0006bced4bnjn mpush(lo, hi, d+1 ); 272886c2349f3dd6574a20f58b31ed901d0006bced4bnjn continue; 272986c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 273086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 273186c2349f3dd6574a20f58b31ed901d0006bced4bnjn n = mmin(ltLo-lo, unLo-ltLo); mvswap(lo, unLo-n, n); 273286c2349f3dd6574a20f58b31ed901d0006bced4bnjn m = mmin(hi-gtHi, gtHi-unHi); mvswap(unLo, hi-m+1, m); 273386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 273486c2349f3dd6574a20f58b31ed901d0006bced4bnjn n = lo + unLo - ltLo - 1; 273586c2349f3dd6574a20f58b31ed901d0006bced4bnjn m = hi - (gtHi - unHi) + 1; 273686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 273786c2349f3dd6574a20f58b31ed901d0006bced4bnjn nextLo[0] = lo; nextHi[0] = n; nextD[0] = d; 273886c2349f3dd6574a20f58b31ed901d0006bced4bnjn nextLo[1] = m; nextHi[1] = hi; nextD[1] = d; 273986c2349f3dd6574a20f58b31ed901d0006bced4bnjn nextLo[2] = n+1; nextHi[2] = m-1; nextD[2] = d+1; 274086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 274186c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (mnextsize(0) < mnextsize(1)) mnextswap(0,1); 274286c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (mnextsize(1) < mnextsize(2)) mnextswap(1,2); 274386c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (mnextsize(0) < mnextsize(1)) mnextswap(0,1); 274486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 274586c2349f3dd6574a20f58b31ed901d0006bced4bnjn AssertD (mnextsize(0) >= mnextsize(1), "mainQSort3(8)" ); 274686c2349f3dd6574a20f58b31ed901d0006bced4bnjn AssertD (mnextsize(1) >= mnextsize(2), "mainQSort3(9)" ); 274786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 274886c2349f3dd6574a20f58b31ed901d0006bced4bnjn mpush (nextLo[0], nextHi[0], nextD[0]); 274986c2349f3dd6574a20f58b31ed901d0006bced4bnjn mpush (nextLo[1], nextHi[1], nextD[1]); 275086c2349f3dd6574a20f58b31ed901d0006bced4bnjn mpush (nextLo[2], nextHi[2], nextD[2]); 275186c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 275286c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 275386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 275486c2349f3dd6574a20f58b31ed901d0006bced4bnjn#undef mswap 275586c2349f3dd6574a20f58b31ed901d0006bced4bnjn#undef mvswap 275686c2349f3dd6574a20f58b31ed901d0006bced4bnjn#undef mpush 275786c2349f3dd6574a20f58b31ed901d0006bced4bnjn#undef mpop 275886c2349f3dd6574a20f58b31ed901d0006bced4bnjn#undef mmin 275986c2349f3dd6574a20f58b31ed901d0006bced4bnjn#undef mnextsize 276086c2349f3dd6574a20f58b31ed901d0006bced4bnjn#undef mnextswap 276186c2349f3dd6574a20f58b31ed901d0006bced4bnjn#undef MAIN_QSORT_SMALL_THRESH 276286c2349f3dd6574a20f58b31ed901d0006bced4bnjn#undef MAIN_QSORT_DEPTH_THRESH 276386c2349f3dd6574a20f58b31ed901d0006bced4bnjn#undef MAIN_QSORT_STACK_SIZE 276486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 276586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 276686c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------*/ 276786c2349f3dd6574a20f58b31ed901d0006bced4bnjn/* Pre: 276886c2349f3dd6574a20f58b31ed901d0006bced4bnjn nblock > N_OVERSHOOT 276986c2349f3dd6574a20f58b31ed901d0006bced4bnjn block32 exists for [0 .. nblock-1 +N_OVERSHOOT] 277086c2349f3dd6574a20f58b31ed901d0006bced4bnjn ((UChar*)block32) [0 .. nblock-1] holds block 277186c2349f3dd6574a20f58b31ed901d0006bced4bnjn ptr exists for [0 .. nblock-1] 277286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 277386c2349f3dd6574a20f58b31ed901d0006bced4bnjn Post: 277486c2349f3dd6574a20f58b31ed901d0006bced4bnjn ((UChar*)block32) [0 .. nblock-1] holds block 277586c2349f3dd6574a20f58b31ed901d0006bced4bnjn All other areas of block32 destroyed 277686c2349f3dd6574a20f58b31ed901d0006bced4bnjn ftab [0 .. 65536 ] destroyed 277786c2349f3dd6574a20f58b31ed901d0006bced4bnjn ptr [0 .. nblock-1] holds sorted order 277886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (*budget < 0), sorting was abandoned 277986c2349f3dd6574a20f58b31ed901d0006bced4bnjn*/ 278086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 278186c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BIGFREQ(b) (ftab[((b)+1) << 8] - ftab[(b) << 8]) 278286c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define SETMASK (1 << 21) 278386c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define CLEARMASK (~(SETMASK)) 278486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 278586c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic 278686c2349f3dd6574a20f58b31ed901d0006bced4bnjnvoid mainSort ( UInt32* ptr, 278786c2349f3dd6574a20f58b31ed901d0006bced4bnjn UChar* block, 278886c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt16* quadrant, 278986c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt32* ftab, 279086c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 nblock, 279186c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 verb, 279286c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32* budget ) 279386c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 279486c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 i, j, k, ss, sb; 279586c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 runningOrder[256]; 279686c2349f3dd6574a20f58b31ed901d0006bced4bnjn Bool bigDone[256]; 279786c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 copyStart[256]; 279886c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 copyEnd [256]; 279986c2349f3dd6574a20f58b31ed901d0006bced4bnjn UChar c1; 280086c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 numQSorted; 280186c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt16 s; 280286c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (verb >= 4) VPrintf0 ( " main sort initialise ...\n" ); 280386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 280486c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- set up the 2-byte frequency table --*/ 280586c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 65536; i >= 0; i--) ftab[i] = 0; 280686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 280786c2349f3dd6574a20f58b31ed901d0006bced4bnjn j = block[0] << 8; 280886c2349f3dd6574a20f58b31ed901d0006bced4bnjn i = nblock-1; 280986c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (; i >= 3; i -= 4) { 281086c2349f3dd6574a20f58b31ed901d0006bced4bnjn quadrant[i] = 0; 281186c2349f3dd6574a20f58b31ed901d0006bced4bnjn j = (j >> 8) | ( ((UInt16)block[i]) << 8); 281286c2349f3dd6574a20f58b31ed901d0006bced4bnjn ftab[j]++; 281386c2349f3dd6574a20f58b31ed901d0006bced4bnjn quadrant[i-1] = 0; 281486c2349f3dd6574a20f58b31ed901d0006bced4bnjn j = (j >> 8) | ( ((UInt16)block[i-1]) << 8); 281586c2349f3dd6574a20f58b31ed901d0006bced4bnjn ftab[j]++; 281686c2349f3dd6574a20f58b31ed901d0006bced4bnjn quadrant[i-2] = 0; 281786c2349f3dd6574a20f58b31ed901d0006bced4bnjn j = (j >> 8) | ( ((UInt16)block[i-2]) << 8); 281886c2349f3dd6574a20f58b31ed901d0006bced4bnjn ftab[j]++; 281986c2349f3dd6574a20f58b31ed901d0006bced4bnjn quadrant[i-3] = 0; 282086c2349f3dd6574a20f58b31ed901d0006bced4bnjn j = (j >> 8) | ( ((UInt16)block[i-3]) << 8); 282186c2349f3dd6574a20f58b31ed901d0006bced4bnjn ftab[j]++; 282286c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 282386c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (; i >= 0; i--) { 282486c2349f3dd6574a20f58b31ed901d0006bced4bnjn quadrant[i] = 0; 282586c2349f3dd6574a20f58b31ed901d0006bced4bnjn j = (j >> 8) | ( ((UInt16)block[i]) << 8); 282686c2349f3dd6574a20f58b31ed901d0006bced4bnjn ftab[j]++; 282786c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 282886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 282986c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- (emphasises close relationship of block & quadrant) --*/ 283086c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i < BZ_N_OVERSHOOT; i++) { 283186c2349f3dd6574a20f58b31ed901d0006bced4bnjn block [nblock+i] = block[i]; 283286c2349f3dd6574a20f58b31ed901d0006bced4bnjn quadrant[nblock+i] = 0; 283386c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 283486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 283586c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (verb >= 4) VPrintf0 ( " bucket sorting ...\n" ); 283686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 283786c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- Complete the initial radix sort --*/ 283886c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 1; i <= 65536; i++) ftab[i] += ftab[i-1]; 283986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 284086c2349f3dd6574a20f58b31ed901d0006bced4bnjn s = block[0] << 8; 284186c2349f3dd6574a20f58b31ed901d0006bced4bnjn i = nblock-1; 284286c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (; i >= 3; i -= 4) { 284386c2349f3dd6574a20f58b31ed901d0006bced4bnjn s = (s >> 8) | (block[i] << 8); 284486c2349f3dd6574a20f58b31ed901d0006bced4bnjn j = ftab[s] -1; 284586c2349f3dd6574a20f58b31ed901d0006bced4bnjn ftab[s] = j; 284686c2349f3dd6574a20f58b31ed901d0006bced4bnjn ptr[j] = i; 284786c2349f3dd6574a20f58b31ed901d0006bced4bnjn s = (s >> 8) | (block[i-1] << 8); 284886c2349f3dd6574a20f58b31ed901d0006bced4bnjn j = ftab[s] -1; 284986c2349f3dd6574a20f58b31ed901d0006bced4bnjn ftab[s] = j; 285086c2349f3dd6574a20f58b31ed901d0006bced4bnjn ptr[j] = i-1; 285186c2349f3dd6574a20f58b31ed901d0006bced4bnjn s = (s >> 8) | (block[i-2] << 8); 285286c2349f3dd6574a20f58b31ed901d0006bced4bnjn j = ftab[s] -1; 285386c2349f3dd6574a20f58b31ed901d0006bced4bnjn ftab[s] = j; 285486c2349f3dd6574a20f58b31ed901d0006bced4bnjn ptr[j] = i-2; 285586c2349f3dd6574a20f58b31ed901d0006bced4bnjn s = (s >> 8) | (block[i-3] << 8); 285686c2349f3dd6574a20f58b31ed901d0006bced4bnjn j = ftab[s] -1; 285786c2349f3dd6574a20f58b31ed901d0006bced4bnjn ftab[s] = j; 285886c2349f3dd6574a20f58b31ed901d0006bced4bnjn ptr[j] = i-3; 285986c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 286086c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (; i >= 0; i--) { 286186c2349f3dd6574a20f58b31ed901d0006bced4bnjn s = (s >> 8) | (block[i] << 8); 286286c2349f3dd6574a20f58b31ed901d0006bced4bnjn j = ftab[s] -1; 286386c2349f3dd6574a20f58b31ed901d0006bced4bnjn ftab[s] = j; 286486c2349f3dd6574a20f58b31ed901d0006bced4bnjn ptr[j] = i; 286586c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 286686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 286786c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- 286886c2349f3dd6574a20f58b31ed901d0006bced4bnjn Now ftab contains the first loc of every small bucket. 286986c2349f3dd6574a20f58b31ed901d0006bced4bnjn Calculate the running order, from smallest to largest 287086c2349f3dd6574a20f58b31ed901d0006bced4bnjn big bucket. 287186c2349f3dd6574a20f58b31ed901d0006bced4bnjn --*/ 287286c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i <= 255; i++) { 287386c2349f3dd6574a20f58b31ed901d0006bced4bnjn bigDone [i] = False; 287486c2349f3dd6574a20f58b31ed901d0006bced4bnjn runningOrder[i] = i; 287586c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 287686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 287786c2349f3dd6574a20f58b31ed901d0006bced4bnjn { 287886c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 vv; 287986c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 h = 1; 288086c2349f3dd6574a20f58b31ed901d0006bced4bnjn do h = 3 * h + 1; while (h <= 256); 288186c2349f3dd6574a20f58b31ed901d0006bced4bnjn do { 288286c2349f3dd6574a20f58b31ed901d0006bced4bnjn h = h / 3; 288386c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = h; i <= 255; i++) { 288486c2349f3dd6574a20f58b31ed901d0006bced4bnjn vv = runningOrder[i]; 288586c2349f3dd6574a20f58b31ed901d0006bced4bnjn j = i; 288686c2349f3dd6574a20f58b31ed901d0006bced4bnjn while ( BIGFREQ(runningOrder[j-h]) > BIGFREQ(vv) ) { 288786c2349f3dd6574a20f58b31ed901d0006bced4bnjn runningOrder[j] = runningOrder[j-h]; 288886c2349f3dd6574a20f58b31ed901d0006bced4bnjn j = j - h; 288986c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (j <= (h - 1)) goto zero; 289086c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 289186c2349f3dd6574a20f58b31ed901d0006bced4bnjn zero: 289286c2349f3dd6574a20f58b31ed901d0006bced4bnjn runningOrder[j] = vv; 289386c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 289486c2349f3dd6574a20f58b31ed901d0006bced4bnjn } while (h != 1); 289586c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 289686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 289786c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- 289886c2349f3dd6574a20f58b31ed901d0006bced4bnjn The main sorting loop. 289986c2349f3dd6574a20f58b31ed901d0006bced4bnjn --*/ 290086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 290186c2349f3dd6574a20f58b31ed901d0006bced4bnjn numQSorted = 0; 290286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 290386c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i <= 255; i++) { 290486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 290586c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- 290686c2349f3dd6574a20f58b31ed901d0006bced4bnjn Process big buckets, starting with the least full. 290786c2349f3dd6574a20f58b31ed901d0006bced4bnjn Basically this is a 3-step process in which we call 290886c2349f3dd6574a20f58b31ed901d0006bced4bnjn mainQSort3 to sort the small buckets [ss, j], but 290986c2349f3dd6574a20f58b31ed901d0006bced4bnjn also make a big effort to avoid the calls if we can. 291086c2349f3dd6574a20f58b31ed901d0006bced4bnjn --*/ 291186c2349f3dd6574a20f58b31ed901d0006bced4bnjn ss = runningOrder[i]; 291286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 291386c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- 291486c2349f3dd6574a20f58b31ed901d0006bced4bnjn Step 1: 291586c2349f3dd6574a20f58b31ed901d0006bced4bnjn Complete the big bucket [ss] by quicksorting 291686c2349f3dd6574a20f58b31ed901d0006bced4bnjn any unsorted small buckets [ss, j], for j != ss. 291786c2349f3dd6574a20f58b31ed901d0006bced4bnjn Hopefully previous pointer-scanning phases have already 291886c2349f3dd6574a20f58b31ed901d0006bced4bnjn completed many of the small buckets [ss, j], so 291986c2349f3dd6574a20f58b31ed901d0006bced4bnjn we don't have to sort them at all. 292086c2349f3dd6574a20f58b31ed901d0006bced4bnjn --*/ 292186c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (j = 0; j <= 255; j++) { 292286c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (j != ss) { 292386c2349f3dd6574a20f58b31ed901d0006bced4bnjn sb = (ss << 8) + j; 292486c2349f3dd6574a20f58b31ed901d0006bced4bnjn if ( ! (ftab[sb] & SETMASK) ) { 292586c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 lo = ftab[sb] & CLEARMASK; 292686c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 hi = (ftab[sb+1] & CLEARMASK) - 1; 292786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (hi > lo) { 292886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (verb >= 4) 292986c2349f3dd6574a20f58b31ed901d0006bced4bnjn VPrintf4 ( " qsort [0x%x, 0x%x] " 293086c2349f3dd6574a20f58b31ed901d0006bced4bnjn "done %d this %d\n", 293186c2349f3dd6574a20f58b31ed901d0006bced4bnjn ss, j, numQSorted, hi - lo + 1 ); 293286c2349f3dd6574a20f58b31ed901d0006bced4bnjn mainQSort3 ( 293386c2349f3dd6574a20f58b31ed901d0006bced4bnjn ptr, block, quadrant, nblock, 293486c2349f3dd6574a20f58b31ed901d0006bced4bnjn lo, hi, BZ_N_RADIX, budget 293586c2349f3dd6574a20f58b31ed901d0006bced4bnjn ); 293686c2349f3dd6574a20f58b31ed901d0006bced4bnjn numQSorted += (hi - lo + 1); 293786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (*budget < 0) return; 293886c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 293986c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 294086c2349f3dd6574a20f58b31ed901d0006bced4bnjn ftab[sb] |= SETMASK; 294186c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 294286c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 294386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 294486c2349f3dd6574a20f58b31ed901d0006bced4bnjn AssertH ( !bigDone[ss], 1006 ); 294586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 294686c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- 294786c2349f3dd6574a20f58b31ed901d0006bced4bnjn Step 2: 294886c2349f3dd6574a20f58b31ed901d0006bced4bnjn Now scan this big bucket [ss] so as to synthesise the 294986c2349f3dd6574a20f58b31ed901d0006bced4bnjn sorted order for small buckets [t, ss] for all t, 295086c2349f3dd6574a20f58b31ed901d0006bced4bnjn including, magically, the bucket [ss,ss] too. 295186c2349f3dd6574a20f58b31ed901d0006bced4bnjn This will avoid doing Real Work in subsequent Step 1's. 295286c2349f3dd6574a20f58b31ed901d0006bced4bnjn --*/ 295386c2349f3dd6574a20f58b31ed901d0006bced4bnjn { 295486c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (j = 0; j <= 255; j++) { 295586c2349f3dd6574a20f58b31ed901d0006bced4bnjn copyStart[j] = ftab[(j << 8) + ss] & CLEARMASK; 295686c2349f3dd6574a20f58b31ed901d0006bced4bnjn copyEnd [j] = (ftab[(j << 8) + ss + 1] & CLEARMASK) - 1; 295786c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 295886c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (j = ftab[ss << 8] & CLEARMASK; j < copyStart[ss]; j++) { 295986c2349f3dd6574a20f58b31ed901d0006bced4bnjn k = ptr[j]-1; if (k < 0) k += nblock; 296086c2349f3dd6574a20f58b31ed901d0006bced4bnjn c1 = block[k]; 296186c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (!bigDone[c1]) 296286c2349f3dd6574a20f58b31ed901d0006bced4bnjn ptr[ copyStart[c1]++ ] = k; 296386c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 296486c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (j = (ftab[(ss+1) << 8] & CLEARMASK) - 1; j > copyEnd[ss]; j--) { 296586c2349f3dd6574a20f58b31ed901d0006bced4bnjn k = ptr[j]-1; if (k < 0) k += nblock; 296686c2349f3dd6574a20f58b31ed901d0006bced4bnjn c1 = block[k]; 296786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (!bigDone[c1]) 296886c2349f3dd6574a20f58b31ed901d0006bced4bnjn ptr[ copyEnd[c1]-- ] = k; 296986c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 297086c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 297186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 297286c2349f3dd6574a20f58b31ed901d0006bced4bnjn AssertH ( (copyStart[ss]-1 == copyEnd[ss]) 297386c2349f3dd6574a20f58b31ed901d0006bced4bnjn || 297486c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* Extremely rare case missing in bzip2-1.0.0 and 1.0.1. 297586c2349f3dd6574a20f58b31ed901d0006bced4bnjn Necessity for this case is demonstrated by compressing 297686c2349f3dd6574a20f58b31ed901d0006bced4bnjn a sequence of approximately 48.5 million of character 297786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 251; 1.0.0/1.0.1 will then die here. */ 297886c2349f3dd6574a20f58b31ed901d0006bced4bnjn (copyStart[ss] == 0 && copyEnd[ss] == nblock-1), 297986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 1007 ) 298086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 298186c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (j = 0; j <= 255; j++) ftab[(j << 8) + ss] |= SETMASK; 298286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 298386c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- 298486c2349f3dd6574a20f58b31ed901d0006bced4bnjn Step 3: 298586c2349f3dd6574a20f58b31ed901d0006bced4bnjn The [ss] big bucket is now done. Record this fact, 298686c2349f3dd6574a20f58b31ed901d0006bced4bnjn and update the quadrant descriptors. Remember to 298786c2349f3dd6574a20f58b31ed901d0006bced4bnjn update quadrants in the overshoot area too, if 298886c2349f3dd6574a20f58b31ed901d0006bced4bnjn necessary. The "if (i < 255)" test merely skips 298986c2349f3dd6574a20f58b31ed901d0006bced4bnjn this updating for the last bucket processed, since 299086c2349f3dd6574a20f58b31ed901d0006bced4bnjn updating for the last bucket is pointless. 299186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 299286c2349f3dd6574a20f58b31ed901d0006bced4bnjn The quadrant array provides a way to incrementally 299386c2349f3dd6574a20f58b31ed901d0006bced4bnjn cache sort orderings, as they appear, so as to 299486c2349f3dd6574a20f58b31ed901d0006bced4bnjn make subsequent comparisons in fullGtU() complete 299586c2349f3dd6574a20f58b31ed901d0006bced4bnjn faster. For repetitive blocks this makes a big 299686c2349f3dd6574a20f58b31ed901d0006bced4bnjn difference (but not big enough to be able to avoid 299786c2349f3dd6574a20f58b31ed901d0006bced4bnjn the fallback sorting mechanism, exponential radix sort). 299886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 299986c2349f3dd6574a20f58b31ed901d0006bced4bnjn The precise meaning is: at all times: 300086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 300186c2349f3dd6574a20f58b31ed901d0006bced4bnjn for 0 <= i < nblock and 0 <= j <= nblock 300286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 300386c2349f3dd6574a20f58b31ed901d0006bced4bnjn if block[i] != block[j], 300486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 300586c2349f3dd6574a20f58b31ed901d0006bced4bnjn then the relative values of quadrant[i] and 300686c2349f3dd6574a20f58b31ed901d0006bced4bnjn quadrant[j] are meaningless. 300786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 300886c2349f3dd6574a20f58b31ed901d0006bced4bnjn else { 300986c2349f3dd6574a20f58b31ed901d0006bced4bnjn if quadrant[i] < quadrant[j] 301086c2349f3dd6574a20f58b31ed901d0006bced4bnjn then the string starting at i lexicographically 301186c2349f3dd6574a20f58b31ed901d0006bced4bnjn precedes the string starting at j 301286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 301386c2349f3dd6574a20f58b31ed901d0006bced4bnjn else if quadrant[i] > quadrant[j] 301486c2349f3dd6574a20f58b31ed901d0006bced4bnjn then the string starting at j lexicographically 301586c2349f3dd6574a20f58b31ed901d0006bced4bnjn precedes the string starting at i 301686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 301786c2349f3dd6574a20f58b31ed901d0006bced4bnjn else 301886c2349f3dd6574a20f58b31ed901d0006bced4bnjn the relative ordering of the strings starting 301986c2349f3dd6574a20f58b31ed901d0006bced4bnjn at i and j has not yet been determined. 302086c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 302186c2349f3dd6574a20f58b31ed901d0006bced4bnjn --*/ 302286c2349f3dd6574a20f58b31ed901d0006bced4bnjn bigDone[ss] = True; 302386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 302486c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (i < 255) { 302586c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 bbStart = ftab[ss << 8] & CLEARMASK; 302686c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 bbSize = (ftab[(ss+1) << 8] & CLEARMASK) - bbStart; 302786c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 shifts = 0; 302886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 302986c2349f3dd6574a20f58b31ed901d0006bced4bnjn while ((bbSize >> shifts) > 65534) shifts++; 303086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 303186c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (j = bbSize-1; j >= 0; j--) { 303286c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 a2update = ptr[bbStart + j]; 303386c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt16 qVal = (UInt16)(j >> shifts); 303486c2349f3dd6574a20f58b31ed901d0006bced4bnjn quadrant[a2update] = qVal; 303586c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (a2update < BZ_N_OVERSHOOT) 303686c2349f3dd6574a20f58b31ed901d0006bced4bnjn quadrant[a2update + nblock] = qVal; 303786c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 303886c2349f3dd6574a20f58b31ed901d0006bced4bnjn AssertH ( ((bbSize-1) >> shifts) <= 65535, 1002 ); 303986c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 304086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 304186c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 304286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 304386c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (verb >= 4) 304486c2349f3dd6574a20f58b31ed901d0006bced4bnjn VPrintf3 ( " %d pointers, %d sorted, %d scanned\n", 304586c2349f3dd6574a20f58b31ed901d0006bced4bnjn nblock, numQSorted, nblock - numQSorted ); 304686c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 304786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 304886c2349f3dd6574a20f58b31ed901d0006bced4bnjn#undef BIGFREQ 304986c2349f3dd6574a20f58b31ed901d0006bced4bnjn#undef SETMASK 305086c2349f3dd6574a20f58b31ed901d0006bced4bnjn#undef CLEARMASK 305186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 305286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 305386c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------*/ 305486c2349f3dd6574a20f58b31ed901d0006bced4bnjn/* Pre: 305586c2349f3dd6574a20f58b31ed901d0006bced4bnjn nblock > 0 305686c2349f3dd6574a20f58b31ed901d0006bced4bnjn arr2 exists for [0 .. nblock-1 +N_OVERSHOOT] 305786c2349f3dd6574a20f58b31ed901d0006bced4bnjn ((UChar*)arr2) [0 .. nblock-1] holds block 305886c2349f3dd6574a20f58b31ed901d0006bced4bnjn arr1 exists for [0 .. nblock-1] 305986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 306086c2349f3dd6574a20f58b31ed901d0006bced4bnjn Post: 306186c2349f3dd6574a20f58b31ed901d0006bced4bnjn ((UChar*)arr2) [0 .. nblock-1] holds block 306286c2349f3dd6574a20f58b31ed901d0006bced4bnjn All other areas of block destroyed 306386c2349f3dd6574a20f58b31ed901d0006bced4bnjn ftab [ 0 .. 65536 ] destroyed 306486c2349f3dd6574a20f58b31ed901d0006bced4bnjn arr1 [0 .. nblock-1] holds sorted order 306586c2349f3dd6574a20f58b31ed901d0006bced4bnjn*/ 306686c2349f3dd6574a20f58b31ed901d0006bced4bnjnvoid BZ2_blockSort ( EState* s ) 306786c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 306886c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt32* ptr = s->ptr; 306986c2349f3dd6574a20f58b31ed901d0006bced4bnjn UChar* block = s->block; 307086c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt32* ftab = s->ftab; 307186c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 nblock = s->nblock; 307286c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 verb = s->verbosity; 307386c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 wfact = s->workFactor; 307486c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt16* quadrant; 307586c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 budget; 307686c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 budgetInit; 307786c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 i; 307886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 307986c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (nblock < /* 10000 */1000 ) { 308086c2349f3dd6574a20f58b31ed901d0006bced4bnjn fallbackSort ( s->arr1, s->arr2, ftab, nblock, verb ); 308186c2349f3dd6574a20f58b31ed901d0006bced4bnjn } else { 308286c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* Calculate the location for quadrant, remembering to get 308386c2349f3dd6574a20f58b31ed901d0006bced4bnjn the alignment right. Assumes that &(block[0]) is at least 308486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 2-byte aligned -- this should be ok since block is really 308586c2349f3dd6574a20f58b31ed901d0006bced4bnjn the first section of arr2. 308686c2349f3dd6574a20f58b31ed901d0006bced4bnjn */ 308786c2349f3dd6574a20f58b31ed901d0006bced4bnjn i = nblock+BZ_N_OVERSHOOT; 308886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (i & 1) i++; 308986c2349f3dd6574a20f58b31ed901d0006bced4bnjn quadrant = (UInt16*)(&(block[i])); 309086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 309186c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* (wfact-1) / 3 puts the default-factor-30 309286c2349f3dd6574a20f58b31ed901d0006bced4bnjn transition point at very roughly the same place as 309386c2349f3dd6574a20f58b31ed901d0006bced4bnjn with v0.1 and v0.9.0. 309486c2349f3dd6574a20f58b31ed901d0006bced4bnjn Not that it particularly matters any more, since the 309586c2349f3dd6574a20f58b31ed901d0006bced4bnjn resulting compressed stream is now the same regardless 309686c2349f3dd6574a20f58b31ed901d0006bced4bnjn of whether or not we use the main sort or fallback sort. 309786c2349f3dd6574a20f58b31ed901d0006bced4bnjn */ 309886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (wfact < 1 ) wfact = 1; 309986c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (wfact > 100) wfact = 100; 310086c2349f3dd6574a20f58b31ed901d0006bced4bnjn budgetInit = nblock * ((wfact-1) / 3); 310186c2349f3dd6574a20f58b31ed901d0006bced4bnjn budget = budgetInit; 310286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 310386c2349f3dd6574a20f58b31ed901d0006bced4bnjn mainSort ( ptr, block, quadrant, ftab, nblock, verb, &budget ); 310486c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (0 && verb >= 3) 310586c2349f3dd6574a20f58b31ed901d0006bced4bnjn VPrintf3 ( " %d work, %d block, ratio %5.2f\n", 310686c2349f3dd6574a20f58b31ed901d0006bced4bnjn budgetInit - budget, 310786c2349f3dd6574a20f58b31ed901d0006bced4bnjn nblock, 310886c2349f3dd6574a20f58b31ed901d0006bced4bnjn (float)(budgetInit - budget) / 310986c2349f3dd6574a20f58b31ed901d0006bced4bnjn (float)(nblock==0 ? 1 : nblock) ); 311086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (budget < 0) { 311186c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (verb >= 2) 311286c2349f3dd6574a20f58b31ed901d0006bced4bnjn VPrintf0 ( " too repetitive; using fallback" 311386c2349f3dd6574a20f58b31ed901d0006bced4bnjn " sorting algorithm\n" ); 311486c2349f3dd6574a20f58b31ed901d0006bced4bnjn fallbackSort ( s->arr1, s->arr2, ftab, nblock, verb ); 311586c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 311686c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 311786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 311886c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->origPtr = -1; 311986c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i < s->nblock; i++) 312086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (ptr[i] == 0) 312186c2349f3dd6574a20f58b31ed901d0006bced4bnjn { s->origPtr = i; break; }; 312286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 312386c2349f3dd6574a20f58b31ed901d0006bced4bnjn AssertH( s->origPtr != -1, 1003 ); 312486c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 312586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 312686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 312786c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-------------------------------------------------------------*/ 312886c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*--- end blocksort.c ---*/ 312986c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-------------------------------------------------------------*/ 313086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 313186c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-------------------------------------------------------------*/ 313286c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*--- Huffman coding low-level stuff ---*/ 313386c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*--- huffman.c ---*/ 313486c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-------------------------------------------------------------*/ 313586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 313686c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-- 313786c2349f3dd6574a20f58b31ed901d0006bced4bnjn This file is a part of bzip2 and/or libbzip2, a program and 313886c2349f3dd6574a20f58b31ed901d0006bced4bnjn library for lossless, block-sorting data compression. 313986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 314086c2349f3dd6574a20f58b31ed901d0006bced4bnjn Copyright (C) 1996-2004 Julian R Seward. All rights reserved. 314186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 314286c2349f3dd6574a20f58b31ed901d0006bced4bnjn Redistribution and use in source and binary forms, with or without 314386c2349f3dd6574a20f58b31ed901d0006bced4bnjn modification, are permitted provided that the following conditions 314486c2349f3dd6574a20f58b31ed901d0006bced4bnjn are met: 314586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 314686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 1. Redistributions of source code must retain the above copyright 314786c2349f3dd6574a20f58b31ed901d0006bced4bnjn notice, this list of conditions and the following disclaimer. 314886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 314986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 2. The origin of this software must not be misrepresented; you must 315086c2349f3dd6574a20f58b31ed901d0006bced4bnjn not claim that you wrote the original software. If you use this 315186c2349f3dd6574a20f58b31ed901d0006bced4bnjn software in a product, an acknowledgment in the product 315286c2349f3dd6574a20f58b31ed901d0006bced4bnjn documentation would be appreciated but is not required. 315386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 315486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 3. Altered source versions must be plainly marked as such, and must 315586c2349f3dd6574a20f58b31ed901d0006bced4bnjn not be misrepresented as being the original software. 315686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 315786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 4. The name of the author may not be used to endorse or promote 315886c2349f3dd6574a20f58b31ed901d0006bced4bnjn products derived from this software without specific prior written 315986c2349f3dd6574a20f58b31ed901d0006bced4bnjn permission. 316086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 316186c2349f3dd6574a20f58b31ed901d0006bced4bnjn THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 316286c2349f3dd6574a20f58b31ed901d0006bced4bnjn OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 316386c2349f3dd6574a20f58b31ed901d0006bced4bnjn WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 316486c2349f3dd6574a20f58b31ed901d0006bced4bnjn ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 316586c2349f3dd6574a20f58b31ed901d0006bced4bnjn DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 316686c2349f3dd6574a20f58b31ed901d0006bced4bnjn DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 316786c2349f3dd6574a20f58b31ed901d0006bced4bnjn GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 316886c2349f3dd6574a20f58b31ed901d0006bced4bnjn INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 316986c2349f3dd6574a20f58b31ed901d0006bced4bnjn WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 317086c2349f3dd6574a20f58b31ed901d0006bced4bnjn NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 317186c2349f3dd6574a20f58b31ed901d0006bced4bnjn SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 317286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 317386c2349f3dd6574a20f58b31ed901d0006bced4bnjn Julian Seward, Cambridge, UK. 317486c2349f3dd6574a20f58b31ed901d0006bced4bnjn jseward@bzip.org 317586c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzip2/libbzip2 version 1.0 of 21 March 2000 317686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 317786c2349f3dd6574a20f58b31ed901d0006bced4bnjn This program is based on (at least) the work of: 317886c2349f3dd6574a20f58b31ed901d0006bced4bnjn Mike Burrows 317986c2349f3dd6574a20f58b31ed901d0006bced4bnjn David Wheeler 318086c2349f3dd6574a20f58b31ed901d0006bced4bnjn Peter Fenwick 318186c2349f3dd6574a20f58b31ed901d0006bced4bnjn Alistair Moffat 318286c2349f3dd6574a20f58b31ed901d0006bced4bnjn Radford Neal 318386c2349f3dd6574a20f58b31ed901d0006bced4bnjn Ian H. Witten 318486c2349f3dd6574a20f58b31ed901d0006bced4bnjn Robert Sedgewick 318586c2349f3dd6574a20f58b31ed901d0006bced4bnjn Jon L. Bentley 318686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 318786c2349f3dd6574a20f58b31ed901d0006bced4bnjn For more information on these sources, see the manual. 318886c2349f3dd6574a20f58b31ed901d0006bced4bnjn--*/ 318986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 319086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 319186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 319286c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 319386c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define WEIGHTOF(zz0) ((zz0) & 0xffffff00) 319486c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define DEPTHOF(zz1) ((zz1) & 0x000000ff) 319586c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define MYMAX(zz2,zz3) ((zz2) > (zz3) ? (zz2) : (zz3)) 319686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 319786c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define ADDWEIGHTS(zw1,zw2) \ 319886c2349f3dd6574a20f58b31ed901d0006bced4bnjn (WEIGHTOF(zw1)+WEIGHTOF(zw2)) | \ 319986c2349f3dd6574a20f58b31ed901d0006bced4bnjn (1 + MYMAX(DEPTHOF(zw1),DEPTHOF(zw2))) 320086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 320186c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define UPHEAP(z) \ 320286c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ \ 320386c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 zz, tmp; \ 320486c2349f3dd6574a20f58b31ed901d0006bced4bnjn zz = z; tmp = heap[zz]; \ 320586c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (weight[tmp] < weight[heap[zz >> 1]]) { \ 320686c2349f3dd6574a20f58b31ed901d0006bced4bnjn heap[zz] = heap[zz >> 1]; \ 320786c2349f3dd6574a20f58b31ed901d0006bced4bnjn zz >>= 1; \ 320886c2349f3dd6574a20f58b31ed901d0006bced4bnjn } \ 320986c2349f3dd6574a20f58b31ed901d0006bced4bnjn heap[zz] = tmp; \ 321086c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 321186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 321286c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define DOWNHEAP(z) \ 321386c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ \ 321486c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 zz, yy, tmp; \ 321586c2349f3dd6574a20f58b31ed901d0006bced4bnjn zz = z; tmp = heap[zz]; \ 321686c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (True) { \ 321786c2349f3dd6574a20f58b31ed901d0006bced4bnjn yy = zz << 1; \ 321886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (yy > nHeap) break; \ 321986c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (yy < nHeap && \ 322086c2349f3dd6574a20f58b31ed901d0006bced4bnjn weight[heap[yy+1]] < weight[heap[yy]]) \ 322186c2349f3dd6574a20f58b31ed901d0006bced4bnjn yy++; \ 322286c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (weight[tmp] < weight[heap[yy]]) break; \ 322386c2349f3dd6574a20f58b31ed901d0006bced4bnjn heap[zz] = heap[yy]; \ 322486c2349f3dd6574a20f58b31ed901d0006bced4bnjn zz = yy; \ 322586c2349f3dd6574a20f58b31ed901d0006bced4bnjn } \ 322686c2349f3dd6574a20f58b31ed901d0006bced4bnjn heap[zz] = tmp; \ 322786c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 322886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 322986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 323086c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 323186c2349f3dd6574a20f58b31ed901d0006bced4bnjnvoid BZ2_hbMakeCodeLengths ( UChar *len, 323286c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 *freq, 323386c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 alphaSize, 323486c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 maxLen ) 323586c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 323686c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- 323786c2349f3dd6574a20f58b31ed901d0006bced4bnjn Nodes and heap entries run from 1. Entry 0 323886c2349f3dd6574a20f58b31ed901d0006bced4bnjn for both the heap and nodes is a sentinel. 323986c2349f3dd6574a20f58b31ed901d0006bced4bnjn --*/ 324086c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 nNodes, nHeap, n1, n2, i, j, k; 324186c2349f3dd6574a20f58b31ed901d0006bced4bnjn Bool tooLong; 324286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 324386c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 heap [ BZ_MAX_ALPHA_SIZE + 2 ]; 324486c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 weight [ BZ_MAX_ALPHA_SIZE * 2 ]; 324586c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 parent [ BZ_MAX_ALPHA_SIZE * 2 ]; 324686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 324786c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i < alphaSize; i++) 324886c2349f3dd6574a20f58b31ed901d0006bced4bnjn weight[i+1] = (freq[i] == 0 ? 1 : freq[i]) << 8; 324986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 325086c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (True) { 325186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 325286c2349f3dd6574a20f58b31ed901d0006bced4bnjn nNodes = alphaSize; 325386c2349f3dd6574a20f58b31ed901d0006bced4bnjn nHeap = 0; 325486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 325586c2349f3dd6574a20f58b31ed901d0006bced4bnjn heap[0] = 0; 325686c2349f3dd6574a20f58b31ed901d0006bced4bnjn weight[0] = 0; 325786c2349f3dd6574a20f58b31ed901d0006bced4bnjn parent[0] = -2; 325886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 325986c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 1; i <= alphaSize; i++) { 326086c2349f3dd6574a20f58b31ed901d0006bced4bnjn parent[i] = -1; 326186c2349f3dd6574a20f58b31ed901d0006bced4bnjn nHeap++; 326286c2349f3dd6574a20f58b31ed901d0006bced4bnjn heap[nHeap] = i; 326386c2349f3dd6574a20f58b31ed901d0006bced4bnjn UPHEAP(nHeap); 326486c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 326586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 326686c2349f3dd6574a20f58b31ed901d0006bced4bnjn AssertH( nHeap < (BZ_MAX_ALPHA_SIZE+2), 2001 ); 326786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 326886c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (nHeap > 1) { 326986c2349f3dd6574a20f58b31ed901d0006bced4bnjn n1 = heap[1]; heap[1] = heap[nHeap]; nHeap--; DOWNHEAP(1); 327086c2349f3dd6574a20f58b31ed901d0006bced4bnjn n2 = heap[1]; heap[1] = heap[nHeap]; nHeap--; DOWNHEAP(1); 327186c2349f3dd6574a20f58b31ed901d0006bced4bnjn nNodes++; 327286c2349f3dd6574a20f58b31ed901d0006bced4bnjn parent[n1] = parent[n2] = nNodes; 327386c2349f3dd6574a20f58b31ed901d0006bced4bnjn weight[nNodes] = ADDWEIGHTS(weight[n1], weight[n2]); 327486c2349f3dd6574a20f58b31ed901d0006bced4bnjn parent[nNodes] = -1; 327586c2349f3dd6574a20f58b31ed901d0006bced4bnjn nHeap++; 327686c2349f3dd6574a20f58b31ed901d0006bced4bnjn heap[nHeap] = nNodes; 327786c2349f3dd6574a20f58b31ed901d0006bced4bnjn UPHEAP(nHeap); 327886c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 327986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 328086c2349f3dd6574a20f58b31ed901d0006bced4bnjn AssertH( nNodes < (BZ_MAX_ALPHA_SIZE * 2), 2002 ); 328186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 328286c2349f3dd6574a20f58b31ed901d0006bced4bnjn tooLong = False; 328386c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 1; i <= alphaSize; i++) { 328486c2349f3dd6574a20f58b31ed901d0006bced4bnjn j = 0; 328586c2349f3dd6574a20f58b31ed901d0006bced4bnjn k = i; 328686c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (parent[k] >= 0) { k = parent[k]; j++; } 328786c2349f3dd6574a20f58b31ed901d0006bced4bnjn len[i-1] = j; 328886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (j > maxLen) tooLong = True; 328986c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 329086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 329186c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (! tooLong) break; 329286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 329386c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* 17 Oct 04: keep-going condition for the following loop used 329486c2349f3dd6574a20f58b31ed901d0006bced4bnjn to be 'i < alphaSize', which missed the last element, 329586c2349f3dd6574a20f58b31ed901d0006bced4bnjn theoretically leading to the possibility of the compressor 329686c2349f3dd6574a20f58b31ed901d0006bced4bnjn looping. However, this count-scaling step is only needed if 329786c2349f3dd6574a20f58b31ed901d0006bced4bnjn one of the generated Huffman code words is longer than 329886c2349f3dd6574a20f58b31ed901d0006bced4bnjn maxLen, which up to and including version 1.0.2 was 20 bits, 329986c2349f3dd6574a20f58b31ed901d0006bced4bnjn which is extremely unlikely. In version 1.0.3 maxLen was 330086c2349f3dd6574a20f58b31ed901d0006bced4bnjn changed to 17 bits, which has minimal effect on compression 330186c2349f3dd6574a20f58b31ed901d0006bced4bnjn ratio, but does mean this scaling step is used from time to 330286c2349f3dd6574a20f58b31ed901d0006bced4bnjn time, enough to verify that it works. 330386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 330486c2349f3dd6574a20f58b31ed901d0006bced4bnjn This means that bzip2-1.0.3 and later will only produce 330586c2349f3dd6574a20f58b31ed901d0006bced4bnjn Huffman codes with a maximum length of 17 bits. However, in 330686c2349f3dd6574a20f58b31ed901d0006bced4bnjn order to preserve backwards compatibility with bitstreams 330786c2349f3dd6574a20f58b31ed901d0006bced4bnjn produced by versions pre-1.0.3, the decompressor must still 330886c2349f3dd6574a20f58b31ed901d0006bced4bnjn handle lengths of up to 20. */ 330986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 331086c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 1; i <= alphaSize; i++) { 331186c2349f3dd6574a20f58b31ed901d0006bced4bnjn j = weight[i] >> 8; 331286c2349f3dd6574a20f58b31ed901d0006bced4bnjn j = 1 + (j / 2); 331386c2349f3dd6574a20f58b31ed901d0006bced4bnjn weight[i] = j << 8; 331486c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 331586c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 331686c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 331786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 331886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 331986c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 332086c2349f3dd6574a20f58b31ed901d0006bced4bnjnvoid BZ2_hbAssignCodes ( Int32 *code, 332186c2349f3dd6574a20f58b31ed901d0006bced4bnjn UChar *length, 332286c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 minLen, 332386c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 maxLen, 332486c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 alphaSize ) 332586c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 332686c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 n, vec, i; 332786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 332886c2349f3dd6574a20f58b31ed901d0006bced4bnjn vec = 0; 332986c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (n = minLen; n <= maxLen; n++) { 333086c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i < alphaSize; i++) 333186c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (length[i] == n) { code[i] = vec; vec++; }; 333286c2349f3dd6574a20f58b31ed901d0006bced4bnjn vec <<= 1; 333386c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 333486c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 333586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 333686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 333786c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 333886c2349f3dd6574a20f58b31ed901d0006bced4bnjnvoid BZ2_hbCreateDecodeTables ( Int32 *limit, 333986c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 *base, 334086c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 *perm, 334186c2349f3dd6574a20f58b31ed901d0006bced4bnjn UChar *length, 334286c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 minLen, 334386c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 maxLen, 334486c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 alphaSize ) 334586c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 334686c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 pp, i, j, vec; 334786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 334886c2349f3dd6574a20f58b31ed901d0006bced4bnjn pp = 0; 334986c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = minLen; i <= maxLen; i++) 335086c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (j = 0; j < alphaSize; j++) 335186c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (length[j] == i) { perm[pp] = j; pp++; }; 335286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 335386c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i < BZ_MAX_CODE_LEN; i++) base[i] = 0; 335486c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i < alphaSize; i++) base[length[i]+1]++; 335586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 335686c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 1; i < BZ_MAX_CODE_LEN; i++) base[i] += base[i-1]; 335786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 335886c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i < BZ_MAX_CODE_LEN; i++) limit[i] = 0; 335986c2349f3dd6574a20f58b31ed901d0006bced4bnjn vec = 0; 336086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 336186c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = minLen; i <= maxLen; i++) { 336286c2349f3dd6574a20f58b31ed901d0006bced4bnjn vec += (base[i+1] - base[i]); 336386c2349f3dd6574a20f58b31ed901d0006bced4bnjn limit[i] = vec-1; 336486c2349f3dd6574a20f58b31ed901d0006bced4bnjn vec <<= 1; 336586c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 336686c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = minLen + 1; i <= maxLen; i++) 336786c2349f3dd6574a20f58b31ed901d0006bced4bnjn base[i] = ((limit[i-1] + 1) << 1) - base[i]; 336886c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 336986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 337086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 337186c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-------------------------------------------------------------*/ 337286c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*--- end huffman.c ---*/ 337386c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-------------------------------------------------------------*/ 337486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 337586c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-------------------------------------------------------------*/ 337686c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*--- Compression machinery (not incl block sorting) ---*/ 337786c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*--- compress.c ---*/ 337886c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-------------------------------------------------------------*/ 337986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 338086c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-- 338186c2349f3dd6574a20f58b31ed901d0006bced4bnjn This file is a part of bzip2 and/or libbzip2, a program and 338286c2349f3dd6574a20f58b31ed901d0006bced4bnjn library for lossless, block-sorting data compression. 338386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 338486c2349f3dd6574a20f58b31ed901d0006bced4bnjn Copyright (C) 1996-2004 Julian R Seward. All rights reserved. 338586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 338686c2349f3dd6574a20f58b31ed901d0006bced4bnjn Redistribution and use in source and binary forms, with or without 338786c2349f3dd6574a20f58b31ed901d0006bced4bnjn modification, are permitted provided that the following conditions 338886c2349f3dd6574a20f58b31ed901d0006bced4bnjn are met: 338986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 339086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 1. Redistributions of source code must retain the above copyright 339186c2349f3dd6574a20f58b31ed901d0006bced4bnjn notice, this list of conditions and the following disclaimer. 339286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 339386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 2. The origin of this software must not be misrepresented; you must 339486c2349f3dd6574a20f58b31ed901d0006bced4bnjn not claim that you wrote the original software. If you use this 339586c2349f3dd6574a20f58b31ed901d0006bced4bnjn software in a product, an acknowledgment in the product 339686c2349f3dd6574a20f58b31ed901d0006bced4bnjn documentation would be appreciated but is not required. 339786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 339886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 3. Altered source versions must be plainly marked as such, and must 339986c2349f3dd6574a20f58b31ed901d0006bced4bnjn not be misrepresented as being the original software. 340086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 340186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 4. The name of the author may not be used to endorse or promote 340286c2349f3dd6574a20f58b31ed901d0006bced4bnjn products derived from this software without specific prior written 340386c2349f3dd6574a20f58b31ed901d0006bced4bnjn permission. 340486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 340586c2349f3dd6574a20f58b31ed901d0006bced4bnjn THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 340686c2349f3dd6574a20f58b31ed901d0006bced4bnjn OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 340786c2349f3dd6574a20f58b31ed901d0006bced4bnjn WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 340886c2349f3dd6574a20f58b31ed901d0006bced4bnjn ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 340986c2349f3dd6574a20f58b31ed901d0006bced4bnjn DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 341086c2349f3dd6574a20f58b31ed901d0006bced4bnjn DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 341186c2349f3dd6574a20f58b31ed901d0006bced4bnjn GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 341286c2349f3dd6574a20f58b31ed901d0006bced4bnjn INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 341386c2349f3dd6574a20f58b31ed901d0006bced4bnjn WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 341486c2349f3dd6574a20f58b31ed901d0006bced4bnjn NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 341586c2349f3dd6574a20f58b31ed901d0006bced4bnjn SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 341686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 341786c2349f3dd6574a20f58b31ed901d0006bced4bnjn Julian Seward, Cambridge, UK. 341886c2349f3dd6574a20f58b31ed901d0006bced4bnjn jseward@bzip.org 341986c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzip2/libbzip2 version 1.0 of 21 March 2000 342086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 342186c2349f3dd6574a20f58b31ed901d0006bced4bnjn This program is based on (at least) the work of: 342286c2349f3dd6574a20f58b31ed901d0006bced4bnjn Mike Burrows 342386c2349f3dd6574a20f58b31ed901d0006bced4bnjn David Wheeler 342486c2349f3dd6574a20f58b31ed901d0006bced4bnjn Peter Fenwick 342586c2349f3dd6574a20f58b31ed901d0006bced4bnjn Alistair Moffat 342686c2349f3dd6574a20f58b31ed901d0006bced4bnjn Radford Neal 342786c2349f3dd6574a20f58b31ed901d0006bced4bnjn Ian H. Witten 342886c2349f3dd6574a20f58b31ed901d0006bced4bnjn Robert Sedgewick 342986c2349f3dd6574a20f58b31ed901d0006bced4bnjn Jon L. Bentley 343086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 343186c2349f3dd6574a20f58b31ed901d0006bced4bnjn For more information on these sources, see the manual. 343286c2349f3dd6574a20f58b31ed901d0006bced4bnjn--*/ 343386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 343486c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-- 343586c2349f3dd6574a20f58b31ed901d0006bced4bnjn CHANGES 343686c2349f3dd6574a20f58b31ed901d0006bced4bnjn ~~~~~~~ 343786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0.9.0 -- original version. 343886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 343986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0.9.0a/b -- no changes in this file. 344086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 344186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0.9.0c 344286c2349f3dd6574a20f58b31ed901d0006bced4bnjn * changed setting of nGroups in sendMTFValues() so as to 344386c2349f3dd6574a20f58b31ed901d0006bced4bnjn do a bit better on small files 344486c2349f3dd6574a20f58b31ed901d0006bced4bnjn--*/ 344586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 344686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 344786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 344886c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 344986c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*--- Bit stream I/O ---*/ 345086c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 345186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 345286c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 345386c2349f3dd6574a20f58b31ed901d0006bced4bnjnvoid BZ2_bsInitWrite ( EState* s ) 345486c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 345586c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->bsLive = 0; 345686c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->bsBuff = 0; 345786c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 345886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 345986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 346086c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 346186c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic 346286c2349f3dd6574a20f58b31ed901d0006bced4bnjnvoid bsFinishWrite ( EState* s ) 346386c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 346486c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (s->bsLive > 0) { 346586c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->zbits[s->numZ] = (UChar)(s->bsBuff >> 24); 346686c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->numZ++; 346786c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->bsBuff <<= 8; 346886c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->bsLive -= 8; 346986c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 347086c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 347186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 347286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 347386c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 347486c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define bsNEEDW(nz) \ 347586c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ \ 347686c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (s->bsLive >= 8) { \ 347786c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->zbits[s->numZ] \ 347886c2349f3dd6574a20f58b31ed901d0006bced4bnjn = (UChar)(s->bsBuff >> 24); \ 347986c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->numZ++; \ 348086c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->bsBuff <<= 8; \ 348186c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->bsLive -= 8; \ 348286c2349f3dd6574a20f58b31ed901d0006bced4bnjn } \ 348386c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 348486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 348586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 348686c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 348786c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic 348886c2349f3dd6574a20f58b31ed901d0006bced4bnjn__inline__ 348986c2349f3dd6574a20f58b31ed901d0006bced4bnjnvoid bsW ( EState* s, Int32 n, UInt32 v ) 349086c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 349186c2349f3dd6574a20f58b31ed901d0006bced4bnjn bsNEEDW ( n ); 349286c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->bsBuff |= (v << (32 - s->bsLive - n)); 349386c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->bsLive += n; 349486c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 349586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 349686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 349786c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 349886c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic 349986c2349f3dd6574a20f58b31ed901d0006bced4bnjnvoid bsPutUInt32 ( EState* s, UInt32 u ) 350086c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 350186c2349f3dd6574a20f58b31ed901d0006bced4bnjn bsW ( s, 8, (u >> 24) & 0xffL ); 350286c2349f3dd6574a20f58b31ed901d0006bced4bnjn bsW ( s, 8, (u >> 16) & 0xffL ); 350386c2349f3dd6574a20f58b31ed901d0006bced4bnjn bsW ( s, 8, (u >> 8) & 0xffL ); 350486c2349f3dd6574a20f58b31ed901d0006bced4bnjn bsW ( s, 8, u & 0xffL ); 350586c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 350686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 350786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 350886c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 350986c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic 351086c2349f3dd6574a20f58b31ed901d0006bced4bnjnvoid bsPutUChar ( EState* s, UChar c ) 351186c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 351286c2349f3dd6574a20f58b31ed901d0006bced4bnjn bsW( s, 8, (UInt32)c ); 351386c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 351486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 351586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 351686c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 351786c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*--- The back end proper ---*/ 351886c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 351986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 352086c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 352186c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic 352286c2349f3dd6574a20f58b31ed901d0006bced4bnjnvoid makeMaps_e ( EState* s ) 352386c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 352486c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 i; 352586c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->nInUse = 0; 352686c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i < 256; i++) 352786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->inUse[i]) { 352886c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->unseqToSeq[i] = s->nInUse; 352986c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->nInUse++; 353086c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 353186c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 353286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 353386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 353486c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 353586c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic 353686c2349f3dd6574a20f58b31ed901d0006bced4bnjnvoid generateMTFValues ( EState* s ) 353786c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 353886c2349f3dd6574a20f58b31ed901d0006bced4bnjn UChar yy[256]; 353986c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 i, j; 354086c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 zPend; 354186c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 wr; 354286c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 EOB; 354386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 354486c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* 354586c2349f3dd6574a20f58b31ed901d0006bced4bnjn After sorting (eg, here), 354686c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->arr1 [ 0 .. s->nblock-1 ] holds sorted order, 354786c2349f3dd6574a20f58b31ed901d0006bced4bnjn and 354886c2349f3dd6574a20f58b31ed901d0006bced4bnjn ((UChar*)s->arr2) [ 0 .. s->nblock-1 ] 354986c2349f3dd6574a20f58b31ed901d0006bced4bnjn holds the original block data. 355086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 355186c2349f3dd6574a20f58b31ed901d0006bced4bnjn The first thing to do is generate the MTF values, 355286c2349f3dd6574a20f58b31ed901d0006bced4bnjn and put them in 355386c2349f3dd6574a20f58b31ed901d0006bced4bnjn ((UInt16*)s->arr1) [ 0 .. s->nblock-1 ]. 355486c2349f3dd6574a20f58b31ed901d0006bced4bnjn Because there are strictly fewer or equal MTF values 355586c2349f3dd6574a20f58b31ed901d0006bced4bnjn than block values, ptr values in this area are overwritten 355686c2349f3dd6574a20f58b31ed901d0006bced4bnjn with MTF values only when they are no longer needed. 355786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 355886c2349f3dd6574a20f58b31ed901d0006bced4bnjn The final compressed bitstream is generated into the 355986c2349f3dd6574a20f58b31ed901d0006bced4bnjn area starting at 356086c2349f3dd6574a20f58b31ed901d0006bced4bnjn (UChar*) (&((UChar*)s->arr2)[s->nblock]) 356186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 356286c2349f3dd6574a20f58b31ed901d0006bced4bnjn These storage aliases are set up in bzCompressInit(), 356386c2349f3dd6574a20f58b31ed901d0006bced4bnjn except for the last one, which is arranged in 356486c2349f3dd6574a20f58b31ed901d0006bced4bnjn compressBlock(). 356586c2349f3dd6574a20f58b31ed901d0006bced4bnjn */ 356686c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt32* ptr = s->ptr; 356786c2349f3dd6574a20f58b31ed901d0006bced4bnjn UChar* block = s->block; 356886c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt16* mtfv = s->mtfv; 356986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 357086c2349f3dd6574a20f58b31ed901d0006bced4bnjn makeMaps_e ( s ); 357186c2349f3dd6574a20f58b31ed901d0006bced4bnjn EOB = s->nInUse+1; 357286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 357386c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i <= EOB; i++) s->mtfFreq[i] = 0; 357486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 357586c2349f3dd6574a20f58b31ed901d0006bced4bnjn wr = 0; 357686c2349f3dd6574a20f58b31ed901d0006bced4bnjn zPend = 0; 357786c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i < s->nInUse; i++) yy[i] = (UChar) i; 357886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 357986c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i < s->nblock; i++) { 358086c2349f3dd6574a20f58b31ed901d0006bced4bnjn UChar ll_i; 358186c2349f3dd6574a20f58b31ed901d0006bced4bnjn AssertD ( wr <= i, "generateMTFValues(1)" ); 358286c2349f3dd6574a20f58b31ed901d0006bced4bnjn j = ptr[i]-1; if (j < 0) j += s->nblock; 358386c2349f3dd6574a20f58b31ed901d0006bced4bnjn ll_i = s->unseqToSeq[block[j]]; 358486c2349f3dd6574a20f58b31ed901d0006bced4bnjn AssertD ( ll_i < s->nInUse, "generateMTFValues(2a)" ); 358586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 358686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (yy[0] == ll_i) { 358786c2349f3dd6574a20f58b31ed901d0006bced4bnjn zPend++; 358886c2349f3dd6574a20f58b31ed901d0006bced4bnjn } else { 358986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 359086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (zPend > 0) { 359186c2349f3dd6574a20f58b31ed901d0006bced4bnjn zPend--; 359286c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (True) { 359386c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (zPend & 1) { 359486c2349f3dd6574a20f58b31ed901d0006bced4bnjn mtfv[wr] = BZ_RUNB; wr++; 359586c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->mtfFreq[BZ_RUNB]++; 359686c2349f3dd6574a20f58b31ed901d0006bced4bnjn } else { 359786c2349f3dd6574a20f58b31ed901d0006bced4bnjn mtfv[wr] = BZ_RUNA; wr++; 359886c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->mtfFreq[BZ_RUNA]++; 359986c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 360086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (zPend < 2) break; 360186c2349f3dd6574a20f58b31ed901d0006bced4bnjn zPend = (zPend - 2) / 2; 360286c2349f3dd6574a20f58b31ed901d0006bced4bnjn }; 360386c2349f3dd6574a20f58b31ed901d0006bced4bnjn zPend = 0; 360486c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 360586c2349f3dd6574a20f58b31ed901d0006bced4bnjn { 360686c2349f3dd6574a20f58b31ed901d0006bced4bnjn register UChar rtmp; 360786c2349f3dd6574a20f58b31ed901d0006bced4bnjn register UChar* ryy_j; 360886c2349f3dd6574a20f58b31ed901d0006bced4bnjn register UChar rll_i; 360986c2349f3dd6574a20f58b31ed901d0006bced4bnjn rtmp = yy[1]; 361086c2349f3dd6574a20f58b31ed901d0006bced4bnjn yy[1] = yy[0]; 361186c2349f3dd6574a20f58b31ed901d0006bced4bnjn ryy_j = &(yy[1]); 361286c2349f3dd6574a20f58b31ed901d0006bced4bnjn rll_i = ll_i; 361386c2349f3dd6574a20f58b31ed901d0006bced4bnjn while ( rll_i != rtmp ) { 361486c2349f3dd6574a20f58b31ed901d0006bced4bnjn register UChar rtmp2; 361586c2349f3dd6574a20f58b31ed901d0006bced4bnjn ryy_j++; 361686c2349f3dd6574a20f58b31ed901d0006bced4bnjn rtmp2 = rtmp; 361786c2349f3dd6574a20f58b31ed901d0006bced4bnjn rtmp = *ryy_j; 361886c2349f3dd6574a20f58b31ed901d0006bced4bnjn *ryy_j = rtmp2; 361986c2349f3dd6574a20f58b31ed901d0006bced4bnjn }; 362086c2349f3dd6574a20f58b31ed901d0006bced4bnjn yy[0] = rtmp; 362186c2349f3dd6574a20f58b31ed901d0006bced4bnjn j = ryy_j - &(yy[0]); 362286c2349f3dd6574a20f58b31ed901d0006bced4bnjn mtfv[wr] = j+1; wr++; s->mtfFreq[j+1]++; 362386c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 362486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 362586c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 362686c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 362786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 362886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (zPend > 0) { 362986c2349f3dd6574a20f58b31ed901d0006bced4bnjn zPend--; 363086c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (True) { 363186c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (zPend & 1) { 363286c2349f3dd6574a20f58b31ed901d0006bced4bnjn mtfv[wr] = BZ_RUNB; wr++; 363386c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->mtfFreq[BZ_RUNB]++; 363486c2349f3dd6574a20f58b31ed901d0006bced4bnjn } else { 363586c2349f3dd6574a20f58b31ed901d0006bced4bnjn mtfv[wr] = BZ_RUNA; wr++; 363686c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->mtfFreq[BZ_RUNA]++; 363786c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 363886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (zPend < 2) break; 363986c2349f3dd6574a20f58b31ed901d0006bced4bnjn zPend = (zPend - 2) / 2; 364086c2349f3dd6574a20f58b31ed901d0006bced4bnjn }; 364186c2349f3dd6574a20f58b31ed901d0006bced4bnjn zPend = 0; 364286c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 364386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 364486c2349f3dd6574a20f58b31ed901d0006bced4bnjn mtfv[wr] = EOB; wr++; s->mtfFreq[EOB]++; 364586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 364686c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->nMTF = wr; 364786c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 364886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 364986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 365086c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 365186c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_LESSER_ICOST 0 365286c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_GREATER_ICOST 15 365386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 365486c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic 365586c2349f3dd6574a20f58b31ed901d0006bced4bnjnvoid sendMTFValues ( EState* s ) 365686c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 365786c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 v, t, i, j, gs, ge, totc, bt, bc, iter; 365886c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 nSelectors, alphaSize, minLen, maxLen, selCtr; 365986c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 nGroups, nBytes; 366086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 366186c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- 366286c2349f3dd6574a20f58b31ed901d0006bced4bnjn UChar len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; 366386c2349f3dd6574a20f58b31ed901d0006bced4bnjn is a global since the decoder also needs it. 366486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 366586c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 code[BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; 366686c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 rfreq[BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; 366786c2349f3dd6574a20f58b31ed901d0006bced4bnjn are also globals only used in this proc. 366886c2349f3dd6574a20f58b31ed901d0006bced4bnjn Made global to keep stack frame size small. 366986c2349f3dd6574a20f58b31ed901d0006bced4bnjn --*/ 367086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 367186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 367286c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt16 cost[BZ_N_GROUPS]; 367386c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 fave[BZ_N_GROUPS]; 367486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 367586c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt16* mtfv = s->mtfv; 367686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 367786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->verbosity >= 3) 367886c2349f3dd6574a20f58b31ed901d0006bced4bnjn VPrintf3( " %d in block, %d after MTF & 1-2 coding, " 367986c2349f3dd6574a20f58b31ed901d0006bced4bnjn "%d+2 syms in use\n", 368086c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->nblock, s->nMTF, s->nInUse ); 368186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 368286c2349f3dd6574a20f58b31ed901d0006bced4bnjn alphaSize = s->nInUse+2; 368386c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (t = 0; t < BZ_N_GROUPS; t++) 368486c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (v = 0; v < alphaSize; v++) 368586c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->len[t][v] = BZ_GREATER_ICOST; 368686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 368786c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*--- Decide how many coding tables to use ---*/ 368886c2349f3dd6574a20f58b31ed901d0006bced4bnjn AssertH ( s->nMTF > 0, 3001 ); 368986c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->nMTF < 200) nGroups = 2; else 369086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->nMTF < 600) nGroups = 3; else 369186c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->nMTF < 1200) nGroups = 4; else 369286c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->nMTF < 2400) nGroups = 5; else 369386c2349f3dd6574a20f58b31ed901d0006bced4bnjn nGroups = 6; 369486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 369586c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*--- Generate an initial set of coding tables ---*/ 369686c2349f3dd6574a20f58b31ed901d0006bced4bnjn { 369786c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 nPart, remF, tFreq, aFreq; 369886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 369986c2349f3dd6574a20f58b31ed901d0006bced4bnjn nPart = nGroups; 370086c2349f3dd6574a20f58b31ed901d0006bced4bnjn remF = s->nMTF; 370186c2349f3dd6574a20f58b31ed901d0006bced4bnjn gs = 0; 370286c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (nPart > 0) { 370386c2349f3dd6574a20f58b31ed901d0006bced4bnjn tFreq = remF / nPart; 370486c2349f3dd6574a20f58b31ed901d0006bced4bnjn ge = gs-1; 370586c2349f3dd6574a20f58b31ed901d0006bced4bnjn aFreq = 0; 370686c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (aFreq < tFreq && ge < alphaSize-1) { 370786c2349f3dd6574a20f58b31ed901d0006bced4bnjn ge++; 370886c2349f3dd6574a20f58b31ed901d0006bced4bnjn aFreq += s->mtfFreq[ge]; 370986c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 371086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 371186c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (ge > gs 371286c2349f3dd6574a20f58b31ed901d0006bced4bnjn && nPart != nGroups && nPart != 1 371386c2349f3dd6574a20f58b31ed901d0006bced4bnjn && ((nGroups-nPart) % 2 == 1)) { 371486c2349f3dd6574a20f58b31ed901d0006bced4bnjn aFreq -= s->mtfFreq[ge]; 371586c2349f3dd6574a20f58b31ed901d0006bced4bnjn ge--; 371686c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 371786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 371886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (0 && s->verbosity >= 3) 371986c2349f3dd6574a20f58b31ed901d0006bced4bnjn VPrintf5( " initial group %d, [%d .. %d], " 372086c2349f3dd6574a20f58b31ed901d0006bced4bnjn "has %d syms (%4.1f%%)\n", 372186c2349f3dd6574a20f58b31ed901d0006bced4bnjn nPart, gs, ge, aFreq, 372286c2349f3dd6574a20f58b31ed901d0006bced4bnjn (100.0 * (float)aFreq) / (float)(s->nMTF) ); 372386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 372486c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (v = 0; v < alphaSize; v++) 372586c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (v >= gs && v <= ge) 372686c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->len[nPart-1][v] = BZ_LESSER_ICOST; else 372786c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->len[nPart-1][v] = BZ_GREATER_ICOST; 372886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 372986c2349f3dd6574a20f58b31ed901d0006bced4bnjn nPart--; 373086c2349f3dd6574a20f58b31ed901d0006bced4bnjn gs = ge+1; 373186c2349f3dd6574a20f58b31ed901d0006bced4bnjn remF -= aFreq; 373286c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 373386c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 373486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 373586c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*--- 373686c2349f3dd6574a20f58b31ed901d0006bced4bnjn Iterate up to BZ_N_ITERS times to improve the tables. 373786c2349f3dd6574a20f58b31ed901d0006bced4bnjn ---*/ 373886c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (iter = 0; iter < BZ_N_ITERS; iter++) { 373986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 374086c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (t = 0; t < nGroups; t++) fave[t] = 0; 374186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 374286c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (t = 0; t < nGroups; t++) 374386c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (v = 0; v < alphaSize; v++) 374486c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->rfreq[t][v] = 0; 374586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 374686c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*--- 374786c2349f3dd6574a20f58b31ed901d0006bced4bnjn Set up an auxiliary length table which is used to fast-track 374886c2349f3dd6574a20f58b31ed901d0006bced4bnjn the common case (nGroups == 6). 374986c2349f3dd6574a20f58b31ed901d0006bced4bnjn ---*/ 375086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (nGroups == 6) { 375186c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (v = 0; v < alphaSize; v++) { 375286c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->len_pack[v][0] = (s->len[1][v] << 16) | s->len[0][v]; 375386c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->len_pack[v][1] = (s->len[3][v] << 16) | s->len[2][v]; 375486c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->len_pack[v][2] = (s->len[5][v] << 16) | s->len[4][v]; 375586c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 375686c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 375786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 375886c2349f3dd6574a20f58b31ed901d0006bced4bnjn nSelectors = 0; 375986c2349f3dd6574a20f58b31ed901d0006bced4bnjn totc = 0; 376086c2349f3dd6574a20f58b31ed901d0006bced4bnjn gs = 0; 376186c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (True) { 376286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 376386c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*--- Set group start & end marks. --*/ 376486c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (gs >= s->nMTF) break; 376586c2349f3dd6574a20f58b31ed901d0006bced4bnjn ge = gs + BZ_G_SIZE - 1; 376686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (ge >= s->nMTF) ge = s->nMTF-1; 376786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 376886c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- 376986c2349f3dd6574a20f58b31ed901d0006bced4bnjn Calculate the cost of this group as coded 377086c2349f3dd6574a20f58b31ed901d0006bced4bnjn by each of the coding tables. 377186c2349f3dd6574a20f58b31ed901d0006bced4bnjn --*/ 377286c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (t = 0; t < nGroups; t++) cost[t] = 0; 377386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 377486c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (nGroups == 6 && 50 == ge-gs+1) { 377586c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*--- fast track the common case ---*/ 377686c2349f3dd6574a20f58b31ed901d0006bced4bnjn register UInt32 cost01, cost23, cost45; 377786c2349f3dd6574a20f58b31ed901d0006bced4bnjn register UInt16 icv; 377886c2349f3dd6574a20f58b31ed901d0006bced4bnjn cost01 = cost23 = cost45 = 0; 377986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 378086c2349f3dd6574a20f58b31ed901d0006bced4bnjn# define BZ_ITER(nn) \ 378186c2349f3dd6574a20f58b31ed901d0006bced4bnjn icv = mtfv[gs+(nn)]; \ 378286c2349f3dd6574a20f58b31ed901d0006bced4bnjn cost01 += s->len_pack[icv][0]; \ 378386c2349f3dd6574a20f58b31ed901d0006bced4bnjn cost23 += s->len_pack[icv][1]; \ 378486c2349f3dd6574a20f58b31ed901d0006bced4bnjn cost45 += s->len_pack[icv][2]; \ 378586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 378686c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_ITER(0); BZ_ITER(1); BZ_ITER(2); BZ_ITER(3); BZ_ITER(4); 378786c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_ITER(5); BZ_ITER(6); BZ_ITER(7); BZ_ITER(8); BZ_ITER(9); 378886c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_ITER(10); BZ_ITER(11); BZ_ITER(12); BZ_ITER(13); BZ_ITER(14); 378986c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_ITER(15); BZ_ITER(16); BZ_ITER(17); BZ_ITER(18); BZ_ITER(19); 379086c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_ITER(20); BZ_ITER(21); BZ_ITER(22); BZ_ITER(23); BZ_ITER(24); 379186c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_ITER(25); BZ_ITER(26); BZ_ITER(27); BZ_ITER(28); BZ_ITER(29); 379286c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_ITER(30); BZ_ITER(31); BZ_ITER(32); BZ_ITER(33); BZ_ITER(34); 379386c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_ITER(35); BZ_ITER(36); BZ_ITER(37); BZ_ITER(38); BZ_ITER(39); 379486c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_ITER(40); BZ_ITER(41); BZ_ITER(42); BZ_ITER(43); BZ_ITER(44); 379586c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_ITER(45); BZ_ITER(46); BZ_ITER(47); BZ_ITER(48); BZ_ITER(49); 379686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 379786c2349f3dd6574a20f58b31ed901d0006bced4bnjn# undef BZ_ITER 379886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 379986c2349f3dd6574a20f58b31ed901d0006bced4bnjn cost[0] = cost01 & 0xffff; cost[1] = cost01 >> 16; 380086c2349f3dd6574a20f58b31ed901d0006bced4bnjn cost[2] = cost23 & 0xffff; cost[3] = cost23 >> 16; 380186c2349f3dd6574a20f58b31ed901d0006bced4bnjn cost[4] = cost45 & 0xffff; cost[5] = cost45 >> 16; 380286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 380386c2349f3dd6574a20f58b31ed901d0006bced4bnjn } else { 380486c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*--- slow version which correctly handles all situations ---*/ 380586c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = gs; i <= ge; i++) { 380686c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt16 icv = mtfv[i]; 380786c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (t = 0; t < nGroups; t++) cost[t] += s->len[t][icv]; 380886c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 380986c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 381086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 381186c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- 381286c2349f3dd6574a20f58b31ed901d0006bced4bnjn Find the coding table which is best for this group, 381386c2349f3dd6574a20f58b31ed901d0006bced4bnjn and record its identity in the selector table. 381486c2349f3dd6574a20f58b31ed901d0006bced4bnjn --*/ 381586c2349f3dd6574a20f58b31ed901d0006bced4bnjn bc = 999999999; bt = -1; 381686c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (t = 0; t < nGroups; t++) 381786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (cost[t] < bc) { bc = cost[t]; bt = t; }; 381886c2349f3dd6574a20f58b31ed901d0006bced4bnjn totc += bc; 381986c2349f3dd6574a20f58b31ed901d0006bced4bnjn fave[bt]++; 382086c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->selector[nSelectors] = bt; 382186c2349f3dd6574a20f58b31ed901d0006bced4bnjn nSelectors++; 382286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 382386c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- 382486c2349f3dd6574a20f58b31ed901d0006bced4bnjn Increment the symbol frequencies for the selected table. 382586c2349f3dd6574a20f58b31ed901d0006bced4bnjn --*/ 382686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (nGroups == 6 && 50 == ge-gs+1) { 382786c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*--- fast track the common case ---*/ 382886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 382986c2349f3dd6574a20f58b31ed901d0006bced4bnjn# define BZ_ITUR(nn) s->rfreq[bt][ mtfv[gs+(nn)] ]++ 383086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 383186c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_ITUR(0); BZ_ITUR(1); BZ_ITUR(2); BZ_ITUR(3); BZ_ITUR(4); 383286c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_ITUR(5); BZ_ITUR(6); BZ_ITUR(7); BZ_ITUR(8); BZ_ITUR(9); 383386c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_ITUR(10); BZ_ITUR(11); BZ_ITUR(12); BZ_ITUR(13); BZ_ITUR(14); 383486c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_ITUR(15); BZ_ITUR(16); BZ_ITUR(17); BZ_ITUR(18); BZ_ITUR(19); 383586c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_ITUR(20); BZ_ITUR(21); BZ_ITUR(22); BZ_ITUR(23); BZ_ITUR(24); 383686c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_ITUR(25); BZ_ITUR(26); BZ_ITUR(27); BZ_ITUR(28); BZ_ITUR(29); 383786c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_ITUR(30); BZ_ITUR(31); BZ_ITUR(32); BZ_ITUR(33); BZ_ITUR(34); 383886c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_ITUR(35); BZ_ITUR(36); BZ_ITUR(37); BZ_ITUR(38); BZ_ITUR(39); 383986c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_ITUR(40); BZ_ITUR(41); BZ_ITUR(42); BZ_ITUR(43); BZ_ITUR(44); 384086c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_ITUR(45); BZ_ITUR(46); BZ_ITUR(47); BZ_ITUR(48); BZ_ITUR(49); 384186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 384286c2349f3dd6574a20f58b31ed901d0006bced4bnjn# undef BZ_ITUR 384386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 384486c2349f3dd6574a20f58b31ed901d0006bced4bnjn } else { 384586c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*--- slow version which correctly handles all situations ---*/ 384686c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = gs; i <= ge; i++) 384786c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->rfreq[bt][ mtfv[i] ]++; 384886c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 384986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 385086c2349f3dd6574a20f58b31ed901d0006bced4bnjn gs = ge+1; 385186c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 385286c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->verbosity >= 3) { 385386c2349f3dd6574a20f58b31ed901d0006bced4bnjn VPrintf2 ( " pass %d: size is %d, grp uses are ", 385486c2349f3dd6574a20f58b31ed901d0006bced4bnjn iter+1, totc/8 ); 385586c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (t = 0; t < nGroups; t++) 385686c2349f3dd6574a20f58b31ed901d0006bced4bnjn VPrintf1 ( "%d ", fave[t] ); 385786c2349f3dd6574a20f58b31ed901d0006bced4bnjn VPrintf0 ( "\n" ); 385886c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 385986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 386086c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- 386186c2349f3dd6574a20f58b31ed901d0006bced4bnjn Recompute the tables based on the accumulated frequencies. 386286c2349f3dd6574a20f58b31ed901d0006bced4bnjn --*/ 386386c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* maxLen was changed from 20 to 17 in bzip2-1.0.3. See 386486c2349f3dd6574a20f58b31ed901d0006bced4bnjn comment in huffman.c for details. */ 386586c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (t = 0; t < nGroups; t++) 386686c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ2_hbMakeCodeLengths ( &(s->len[t][0]), &(s->rfreq[t][0]), 386786c2349f3dd6574a20f58b31ed901d0006bced4bnjn alphaSize, 17 /*20*/ ); 386886c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 386986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 387086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 387186c2349f3dd6574a20f58b31ed901d0006bced4bnjn AssertH( nGroups < 8, 3002 ); 387286c2349f3dd6574a20f58b31ed901d0006bced4bnjn AssertH( nSelectors < 32768 && 387386c2349f3dd6574a20f58b31ed901d0006bced4bnjn nSelectors <= (2 + (900000 / BZ_G_SIZE)), 387486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 3003 ); 387586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 387686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 387786c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*--- Compute MTF values for the selectors. ---*/ 387886c2349f3dd6574a20f58b31ed901d0006bced4bnjn { 387986c2349f3dd6574a20f58b31ed901d0006bced4bnjn UChar pos[BZ_N_GROUPS], ll_i, tmp2, tmp; 388086c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i < nGroups; i++) pos[i] = i; 388186c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i < nSelectors; i++) { 388286c2349f3dd6574a20f58b31ed901d0006bced4bnjn ll_i = s->selector[i]; 388386c2349f3dd6574a20f58b31ed901d0006bced4bnjn j = 0; 388486c2349f3dd6574a20f58b31ed901d0006bced4bnjn tmp = pos[j]; 388586c2349f3dd6574a20f58b31ed901d0006bced4bnjn while ( ll_i != tmp ) { 388686c2349f3dd6574a20f58b31ed901d0006bced4bnjn j++; 388786c2349f3dd6574a20f58b31ed901d0006bced4bnjn tmp2 = tmp; 388886c2349f3dd6574a20f58b31ed901d0006bced4bnjn tmp = pos[j]; 388986c2349f3dd6574a20f58b31ed901d0006bced4bnjn pos[j] = tmp2; 389086c2349f3dd6574a20f58b31ed901d0006bced4bnjn }; 389186c2349f3dd6574a20f58b31ed901d0006bced4bnjn pos[0] = tmp; 389286c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->selectorMtf[i] = j; 389386c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 389486c2349f3dd6574a20f58b31ed901d0006bced4bnjn }; 389586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 389686c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*--- Assign actual codes for the tables. --*/ 389786c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (t = 0; t < nGroups; t++) { 389886c2349f3dd6574a20f58b31ed901d0006bced4bnjn minLen = 32; 389986c2349f3dd6574a20f58b31ed901d0006bced4bnjn maxLen = 0; 390086c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i < alphaSize; i++) { 390186c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->len[t][i] > maxLen) maxLen = s->len[t][i]; 390286c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->len[t][i] < minLen) minLen = s->len[t][i]; 390386c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 390486c2349f3dd6574a20f58b31ed901d0006bced4bnjn AssertH ( !(maxLen > 17 /*20*/ ), 3004 ); 390586c2349f3dd6574a20f58b31ed901d0006bced4bnjn AssertH ( !(minLen < 1), 3005 ); 390686c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ2_hbAssignCodes ( &(s->code[t][0]), &(s->len[t][0]), 390786c2349f3dd6574a20f58b31ed901d0006bced4bnjn minLen, maxLen, alphaSize ); 390886c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 390986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 391086c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*--- Transmit the mapping table. ---*/ 391186c2349f3dd6574a20f58b31ed901d0006bced4bnjn { 391286c2349f3dd6574a20f58b31ed901d0006bced4bnjn Bool inUse16[16]; 391386c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i < 16; i++) { 391486c2349f3dd6574a20f58b31ed901d0006bced4bnjn inUse16[i] = False; 391586c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (j = 0; j < 16; j++) 391686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->inUse[i * 16 + j]) inUse16[i] = True; 391786c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 391886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 391986c2349f3dd6574a20f58b31ed901d0006bced4bnjn nBytes = s->numZ; 392086c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i < 16; i++) 392186c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (inUse16[i]) bsW(s,1,1); else bsW(s,1,0); 392286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 392386c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i < 16; i++) 392486c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (inUse16[i]) 392586c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (j = 0; j < 16; j++) { 392686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->inUse[i * 16 + j]) bsW(s,1,1); else bsW(s,1,0); 392786c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 392886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 392986c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->verbosity >= 3) 393086c2349f3dd6574a20f58b31ed901d0006bced4bnjn VPrintf1( " bytes: mapping %d, ", s->numZ-nBytes ); 393186c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 393286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 393386c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*--- Now the selectors. ---*/ 393486c2349f3dd6574a20f58b31ed901d0006bced4bnjn nBytes = s->numZ; 393586c2349f3dd6574a20f58b31ed901d0006bced4bnjn bsW ( s, 3, nGroups ); 393686c2349f3dd6574a20f58b31ed901d0006bced4bnjn bsW ( s, 15, nSelectors ); 393786c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i < nSelectors; i++) { 393886c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (j = 0; j < s->selectorMtf[i]; j++) bsW(s,1,1); 393986c2349f3dd6574a20f58b31ed901d0006bced4bnjn bsW(s,1,0); 394086c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 394186c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->verbosity >= 3) 394286c2349f3dd6574a20f58b31ed901d0006bced4bnjn VPrintf1( "selectors %d, ", s->numZ-nBytes ); 394386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 394486c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*--- Now the coding tables. ---*/ 394586c2349f3dd6574a20f58b31ed901d0006bced4bnjn nBytes = s->numZ; 394686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 394786c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (t = 0; t < nGroups; t++) { 394886c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 curr = s->len[t][0]; 394986c2349f3dd6574a20f58b31ed901d0006bced4bnjn bsW ( s, 5, curr ); 395086c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i < alphaSize; i++) { 395186c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (curr < s->len[t][i]) { bsW(s,2,2); curr++; /* 10 */ }; 395286c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (curr > s->len[t][i]) { bsW(s,2,3); curr--; /* 11 */ }; 395386c2349f3dd6574a20f58b31ed901d0006bced4bnjn bsW ( s, 1, 0 ); 395486c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 395586c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 395686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 395786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->verbosity >= 3) 395886c2349f3dd6574a20f58b31ed901d0006bced4bnjn VPrintf1 ( "code lengths %d, ", s->numZ-nBytes ); 395986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 396086c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*--- And finally, the block data proper ---*/ 396186c2349f3dd6574a20f58b31ed901d0006bced4bnjn nBytes = s->numZ; 396286c2349f3dd6574a20f58b31ed901d0006bced4bnjn selCtr = 0; 396386c2349f3dd6574a20f58b31ed901d0006bced4bnjn gs = 0; 396486c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (True) { 396586c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (gs >= s->nMTF) break; 396686c2349f3dd6574a20f58b31ed901d0006bced4bnjn ge = gs + BZ_G_SIZE - 1; 396786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (ge >= s->nMTF) ge = s->nMTF-1; 396886c2349f3dd6574a20f58b31ed901d0006bced4bnjn AssertH ( s->selector[selCtr] < nGroups, 3006 ); 396986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 397086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (nGroups == 6 && 50 == ge-gs+1) { 397186c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*--- fast track the common case ---*/ 397286c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt16 mtfv_i; 397386c2349f3dd6574a20f58b31ed901d0006bced4bnjn UChar* s_len_sel_selCtr 397486c2349f3dd6574a20f58b31ed901d0006bced4bnjn = &(s->len[s->selector[selCtr]][0]); 397586c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32* s_code_sel_selCtr 397686c2349f3dd6574a20f58b31ed901d0006bced4bnjn = &(s->code[s->selector[selCtr]][0]); 397786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 397886c2349f3dd6574a20f58b31ed901d0006bced4bnjn# define BZ_ITAH(nn) \ 397986c2349f3dd6574a20f58b31ed901d0006bced4bnjn mtfv_i = mtfv[gs+(nn)]; \ 398086c2349f3dd6574a20f58b31ed901d0006bced4bnjn bsW ( s, \ 398186c2349f3dd6574a20f58b31ed901d0006bced4bnjn s_len_sel_selCtr[mtfv_i], \ 398286c2349f3dd6574a20f58b31ed901d0006bced4bnjn s_code_sel_selCtr[mtfv_i] ) 398386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 398486c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_ITAH(0); BZ_ITAH(1); BZ_ITAH(2); BZ_ITAH(3); BZ_ITAH(4); 398586c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_ITAH(5); BZ_ITAH(6); BZ_ITAH(7); BZ_ITAH(8); BZ_ITAH(9); 398686c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_ITAH(10); BZ_ITAH(11); BZ_ITAH(12); BZ_ITAH(13); BZ_ITAH(14); 398786c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_ITAH(15); BZ_ITAH(16); BZ_ITAH(17); BZ_ITAH(18); BZ_ITAH(19); 398886c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_ITAH(20); BZ_ITAH(21); BZ_ITAH(22); BZ_ITAH(23); BZ_ITAH(24); 398986c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_ITAH(25); BZ_ITAH(26); BZ_ITAH(27); BZ_ITAH(28); BZ_ITAH(29); 399086c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_ITAH(30); BZ_ITAH(31); BZ_ITAH(32); BZ_ITAH(33); BZ_ITAH(34); 399186c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_ITAH(35); BZ_ITAH(36); BZ_ITAH(37); BZ_ITAH(38); BZ_ITAH(39); 399286c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_ITAH(40); BZ_ITAH(41); BZ_ITAH(42); BZ_ITAH(43); BZ_ITAH(44); 399386c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_ITAH(45); BZ_ITAH(46); BZ_ITAH(47); BZ_ITAH(48); BZ_ITAH(49); 399486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 399586c2349f3dd6574a20f58b31ed901d0006bced4bnjn# undef BZ_ITAH 399686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 399786c2349f3dd6574a20f58b31ed901d0006bced4bnjn } else { 399886c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*--- slow version which correctly handles all situations ---*/ 399986c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = gs; i <= ge; i++) { 400086c2349f3dd6574a20f58b31ed901d0006bced4bnjn bsW ( s, 400186c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->len [s->selector[selCtr]] [mtfv[i]], 400286c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->code [s->selector[selCtr]] [mtfv[i]] ); 400386c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 400486c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 400586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 400686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 400786c2349f3dd6574a20f58b31ed901d0006bced4bnjn gs = ge+1; 400886c2349f3dd6574a20f58b31ed901d0006bced4bnjn selCtr++; 400986c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 401086c2349f3dd6574a20f58b31ed901d0006bced4bnjn AssertH( selCtr == nSelectors, 3007 ); 401186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 401286c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->verbosity >= 3) 401386c2349f3dd6574a20f58b31ed901d0006bced4bnjn VPrintf1( "codes %d\n", s->numZ-nBytes ); 401486c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 401586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 401686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 401786c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 401886c2349f3dd6574a20f58b31ed901d0006bced4bnjnvoid BZ2_compressBlock ( EState* s, Bool is_last_block ) 401986c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 402086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->nblock > 0) { 402186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 402286c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_FINALISE_CRC ( s->blockCRC ); 402386c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->combinedCRC = (s->combinedCRC << 1) | (s->combinedCRC >> 31); 402486c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->combinedCRC ^= s->blockCRC; 402586c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->blockNo > 1) s->numZ = 0; 402686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 402786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->verbosity >= 2) 402886c2349f3dd6574a20f58b31ed901d0006bced4bnjn VPrintf4( " block %d: crc = 0x%08x, " 402986c2349f3dd6574a20f58b31ed901d0006bced4bnjn "combined CRC = 0x%08x, size = %d\n", 403086c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->blockNo, s->blockCRC, s->combinedCRC, s->nblock ); 403186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 403286c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ2_blockSort ( s ); 403386c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 403486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 403586c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->zbits = (UChar*) (&((UChar*)s->arr2)[s->nblock]); 403686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 403786c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- If this is the first block, create the stream header. --*/ 403886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->blockNo == 1) { 403986c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ2_bsInitWrite ( s ); 404086c2349f3dd6574a20f58b31ed901d0006bced4bnjn bsPutUChar ( s, BZ_HDR_B ); 404186c2349f3dd6574a20f58b31ed901d0006bced4bnjn bsPutUChar ( s, BZ_HDR_Z ); 404286c2349f3dd6574a20f58b31ed901d0006bced4bnjn bsPutUChar ( s, BZ_HDR_h ); 404386c2349f3dd6574a20f58b31ed901d0006bced4bnjn bsPutUChar ( s, (UChar)(BZ_HDR_0 + s->blockSize100k) ); 404486c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 404586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 404686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->nblock > 0) { 404786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 404886c2349f3dd6574a20f58b31ed901d0006bced4bnjn bsPutUChar ( s, 0x31 ); bsPutUChar ( s, 0x41 ); 404986c2349f3dd6574a20f58b31ed901d0006bced4bnjn bsPutUChar ( s, 0x59 ); bsPutUChar ( s, 0x26 ); 405086c2349f3dd6574a20f58b31ed901d0006bced4bnjn bsPutUChar ( s, 0x53 ); bsPutUChar ( s, 0x59 ); 405186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 405286c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- Now the block's CRC, so it is in a known place. --*/ 405386c2349f3dd6574a20f58b31ed901d0006bced4bnjn bsPutUInt32 ( s, s->blockCRC ); 405486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 405586c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- 405686c2349f3dd6574a20f58b31ed901d0006bced4bnjn Now a single bit indicating (non-)randomisation. 405786c2349f3dd6574a20f58b31ed901d0006bced4bnjn As of version 0.9.5, we use a better sorting algorithm 405886c2349f3dd6574a20f58b31ed901d0006bced4bnjn which makes randomisation unnecessary. So always set 405986c2349f3dd6574a20f58b31ed901d0006bced4bnjn the randomised bit to 'no'. Of course, the decoder 406086c2349f3dd6574a20f58b31ed901d0006bced4bnjn still needs to be able to handle randomised blocks 406186c2349f3dd6574a20f58b31ed901d0006bced4bnjn so as to maintain backwards compatibility with 406286c2349f3dd6574a20f58b31ed901d0006bced4bnjn older versions of bzip2. 406386c2349f3dd6574a20f58b31ed901d0006bced4bnjn --*/ 406486c2349f3dd6574a20f58b31ed901d0006bced4bnjn bsW(s,1,0); 406586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 406686c2349f3dd6574a20f58b31ed901d0006bced4bnjn bsW ( s, 24, s->origPtr ); 406786c2349f3dd6574a20f58b31ed901d0006bced4bnjn generateMTFValues ( s ); 406886c2349f3dd6574a20f58b31ed901d0006bced4bnjn sendMTFValues ( s ); 406986c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 407086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 407186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 407286c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- If this is the last block, add the stream trailer. --*/ 407386c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (is_last_block) { 407486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 407586c2349f3dd6574a20f58b31ed901d0006bced4bnjn bsPutUChar ( s, 0x17 ); bsPutUChar ( s, 0x72 ); 407686c2349f3dd6574a20f58b31ed901d0006bced4bnjn bsPutUChar ( s, 0x45 ); bsPutUChar ( s, 0x38 ); 407786c2349f3dd6574a20f58b31ed901d0006bced4bnjn bsPutUChar ( s, 0x50 ); bsPutUChar ( s, 0x90 ); 407886c2349f3dd6574a20f58b31ed901d0006bced4bnjn bsPutUInt32 ( s, s->combinedCRC ); 407986c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->verbosity >= 2) 408086c2349f3dd6574a20f58b31ed901d0006bced4bnjn VPrintf1( " final combined CRC = 0x%08x\n ", s->combinedCRC ); 408186c2349f3dd6574a20f58b31ed901d0006bced4bnjn bsFinishWrite ( s ); 408286c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 408386c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 408486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 408586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 408686c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-------------------------------------------------------------*/ 408786c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*--- end compress.c ---*/ 408886c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-------------------------------------------------------------*/ 408986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 409086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 409186c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-------------------------------------------------------------*/ 409286c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*--- Table for randomising repetitive blocks ---*/ 409386c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*--- randtable.c ---*/ 409486c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-------------------------------------------------------------*/ 409586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 409686c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-- 409786c2349f3dd6574a20f58b31ed901d0006bced4bnjn This file is a part of bzip2 and/or libbzip2, a program and 409886c2349f3dd6574a20f58b31ed901d0006bced4bnjn library for lossless, block-sorting data compression. 409986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 410086c2349f3dd6574a20f58b31ed901d0006bced4bnjn Copyright (C) 1996-2004 Julian R Seward. All rights reserved. 410186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 410286c2349f3dd6574a20f58b31ed901d0006bced4bnjn Redistribution and use in source and binary forms, with or without 410386c2349f3dd6574a20f58b31ed901d0006bced4bnjn modification, are permitted provided that the following conditions 410486c2349f3dd6574a20f58b31ed901d0006bced4bnjn are met: 410586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 410686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 1. Redistributions of source code must retain the above copyright 410786c2349f3dd6574a20f58b31ed901d0006bced4bnjn notice, this list of conditions and the following disclaimer. 410886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 410986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 2. The origin of this software must not be misrepresented; you must 411086c2349f3dd6574a20f58b31ed901d0006bced4bnjn not claim that you wrote the original software. If you use this 411186c2349f3dd6574a20f58b31ed901d0006bced4bnjn software in a product, an acknowledgment in the product 411286c2349f3dd6574a20f58b31ed901d0006bced4bnjn documentation would be appreciated but is not required. 411386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 411486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 3. Altered source versions must be plainly marked as such, and must 411586c2349f3dd6574a20f58b31ed901d0006bced4bnjn not be misrepresented as being the original software. 411686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 411786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 4. The name of the author may not be used to endorse or promote 411886c2349f3dd6574a20f58b31ed901d0006bced4bnjn products derived from this software without specific prior written 411986c2349f3dd6574a20f58b31ed901d0006bced4bnjn permission. 412086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 412186c2349f3dd6574a20f58b31ed901d0006bced4bnjn THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 412286c2349f3dd6574a20f58b31ed901d0006bced4bnjn OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 412386c2349f3dd6574a20f58b31ed901d0006bced4bnjn WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 412486c2349f3dd6574a20f58b31ed901d0006bced4bnjn ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 412586c2349f3dd6574a20f58b31ed901d0006bced4bnjn DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 412686c2349f3dd6574a20f58b31ed901d0006bced4bnjn DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 412786c2349f3dd6574a20f58b31ed901d0006bced4bnjn GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 412886c2349f3dd6574a20f58b31ed901d0006bced4bnjn INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 412986c2349f3dd6574a20f58b31ed901d0006bced4bnjn WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 413086c2349f3dd6574a20f58b31ed901d0006bced4bnjn NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 413186c2349f3dd6574a20f58b31ed901d0006bced4bnjn SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 413286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 413386c2349f3dd6574a20f58b31ed901d0006bced4bnjn Julian Seward, Cambridge, UK. 413486c2349f3dd6574a20f58b31ed901d0006bced4bnjn jseward@bzip.org 413586c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzip2/libbzip2 version 1.0 of 21 March 2000 413686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 413786c2349f3dd6574a20f58b31ed901d0006bced4bnjn This program is based on (at least) the work of: 413886c2349f3dd6574a20f58b31ed901d0006bced4bnjn Mike Burrows 413986c2349f3dd6574a20f58b31ed901d0006bced4bnjn David Wheeler 414086c2349f3dd6574a20f58b31ed901d0006bced4bnjn Peter Fenwick 414186c2349f3dd6574a20f58b31ed901d0006bced4bnjn Alistair Moffat 414286c2349f3dd6574a20f58b31ed901d0006bced4bnjn Radford Neal 414386c2349f3dd6574a20f58b31ed901d0006bced4bnjn Ian H. Witten 414486c2349f3dd6574a20f58b31ed901d0006bced4bnjn Robert Sedgewick 414586c2349f3dd6574a20f58b31ed901d0006bced4bnjn Jon L. Bentley 414686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 414786c2349f3dd6574a20f58b31ed901d0006bced4bnjn For more information on these sources, see the manual. 414886c2349f3dd6574a20f58b31ed901d0006bced4bnjn--*/ 414986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 415086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 415186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 415286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 415386c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------*/ 415486c2349f3dd6574a20f58b31ed901d0006bced4bnjnInt32 BZ2_rNums[512] = { 415586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 619, 720, 127, 481, 931, 816, 813, 233, 566, 247, 415686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 985, 724, 205, 454, 863, 491, 741, 242, 949, 214, 415786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 733, 859, 335, 708, 621, 574, 73, 654, 730, 472, 415886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 419, 436, 278, 496, 867, 210, 399, 680, 480, 51, 415986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 878, 465, 811, 169, 869, 675, 611, 697, 867, 561, 416086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 862, 687, 507, 283, 482, 129, 807, 591, 733, 623, 416186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 150, 238, 59, 379, 684, 877, 625, 169, 643, 105, 416286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 170, 607, 520, 932, 727, 476, 693, 425, 174, 647, 416386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 73, 122, 335, 530, 442, 853, 695, 249, 445, 515, 416486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 909, 545, 703, 919, 874, 474, 882, 500, 594, 612, 416586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 641, 801, 220, 162, 819, 984, 589, 513, 495, 799, 416686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 161, 604, 958, 533, 221, 400, 386, 867, 600, 782, 416786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 382, 596, 414, 171, 516, 375, 682, 485, 911, 276, 416886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 98, 553, 163, 354, 666, 933, 424, 341, 533, 870, 416986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 227, 730, 475, 186, 263, 647, 537, 686, 600, 224, 417086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 469, 68, 770, 919, 190, 373, 294, 822, 808, 206, 417186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 184, 943, 795, 384, 383, 461, 404, 758, 839, 887, 417286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 715, 67, 618, 276, 204, 918, 873, 777, 604, 560, 417386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 951, 160, 578, 722, 79, 804, 96, 409, 713, 940, 417486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 652, 934, 970, 447, 318, 353, 859, 672, 112, 785, 417586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 645, 863, 803, 350, 139, 93, 354, 99, 820, 908, 417686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 609, 772, 154, 274, 580, 184, 79, 626, 630, 742, 417786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 653, 282, 762, 623, 680, 81, 927, 626, 789, 125, 417886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 411, 521, 938, 300, 821, 78, 343, 175, 128, 250, 417986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 170, 774, 972, 275, 999, 639, 495, 78, 352, 126, 418086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 857, 956, 358, 619, 580, 124, 737, 594, 701, 612, 418186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 669, 112, 134, 694, 363, 992, 809, 743, 168, 974, 418286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 944, 375, 748, 52, 600, 747, 642, 182, 862, 81, 418386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 344, 805, 988, 739, 511, 655, 814, 334, 249, 515, 418486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 897, 955, 664, 981, 649, 113, 974, 459, 893, 228, 418586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 433, 837, 553, 268, 926, 240, 102, 654, 459, 51, 418686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 686, 754, 806, 760, 493, 403, 415, 394, 687, 700, 418786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 946, 670, 656, 610, 738, 392, 760, 799, 887, 653, 418886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 978, 321, 576, 617, 626, 502, 894, 679, 243, 440, 418986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 680, 879, 194, 572, 640, 724, 926, 56, 204, 700, 419086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 707, 151, 457, 449, 797, 195, 791, 558, 945, 679, 419186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 297, 59, 87, 824, 713, 663, 412, 693, 342, 606, 419286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 134, 108, 571, 364, 631, 212, 174, 643, 304, 329, 419386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 343, 97, 430, 751, 497, 314, 983, 374, 822, 928, 419486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 140, 206, 73, 263, 980, 736, 876, 478, 430, 305, 419586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 170, 514, 364, 692, 829, 82, 855, 953, 676, 246, 419686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 369, 970, 294, 750, 807, 827, 150, 790, 288, 923, 419786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 804, 378, 215, 828, 592, 281, 565, 555, 710, 82, 419886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 896, 831, 547, 261, 524, 462, 293, 465, 502, 56, 419986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 661, 821, 976, 991, 658, 869, 905, 758, 745, 193, 420086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 768, 550, 608, 933, 378, 286, 215, 979, 792, 961, 420186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 61, 688, 793, 644, 986, 403, 106, 366, 905, 644, 420286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 372, 567, 466, 434, 645, 210, 389, 550, 919, 135, 420386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 780, 773, 635, 389, 707, 100, 626, 958, 165, 504, 420486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 920, 176, 193, 713, 857, 265, 203, 50, 668, 108, 420586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 645, 990, 626, 197, 510, 357, 358, 850, 858, 364, 420686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 936, 638 420786c2349f3dd6574a20f58b31ed901d0006bced4bnjn}; 420886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 420986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 421086c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-------------------------------------------------------------*/ 421186c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*--- end randtable.c ---*/ 421286c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-------------------------------------------------------------*/ 421386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 421486c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-------------------------------------------------------------*/ 421586c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*--- Table for doing CRCs ---*/ 421686c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*--- crctable.c ---*/ 421786c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-------------------------------------------------------------*/ 421886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 421986c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-- 422086c2349f3dd6574a20f58b31ed901d0006bced4bnjn This file is a part of bzip2 and/or libbzip2, a program and 422186c2349f3dd6574a20f58b31ed901d0006bced4bnjn library for lossless, block-sorting data compression. 422286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 422386c2349f3dd6574a20f58b31ed901d0006bced4bnjn Copyright (C) 1996-2004 Julian R Seward. All rights reserved. 422486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 422586c2349f3dd6574a20f58b31ed901d0006bced4bnjn Redistribution and use in source and binary forms, with or without 422686c2349f3dd6574a20f58b31ed901d0006bced4bnjn modification, are permitted provided that the following conditions 422786c2349f3dd6574a20f58b31ed901d0006bced4bnjn are met: 422886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 422986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 1. Redistributions of source code must retain the above copyright 423086c2349f3dd6574a20f58b31ed901d0006bced4bnjn notice, this list of conditions and the following disclaimer. 423186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 423286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 2. The origin of this software must not be misrepresented; you must 423386c2349f3dd6574a20f58b31ed901d0006bced4bnjn not claim that you wrote the original software. If you use this 423486c2349f3dd6574a20f58b31ed901d0006bced4bnjn software in a product, an acknowledgment in the product 423586c2349f3dd6574a20f58b31ed901d0006bced4bnjn documentation would be appreciated but is not required. 423686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 423786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 3. Altered source versions must be plainly marked as such, and must 423886c2349f3dd6574a20f58b31ed901d0006bced4bnjn not be misrepresented as being the original software. 423986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 424086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 4. The name of the author may not be used to endorse or promote 424186c2349f3dd6574a20f58b31ed901d0006bced4bnjn products derived from this software without specific prior written 424286c2349f3dd6574a20f58b31ed901d0006bced4bnjn permission. 424386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 424486c2349f3dd6574a20f58b31ed901d0006bced4bnjn THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 424586c2349f3dd6574a20f58b31ed901d0006bced4bnjn OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 424686c2349f3dd6574a20f58b31ed901d0006bced4bnjn WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 424786c2349f3dd6574a20f58b31ed901d0006bced4bnjn ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 424886c2349f3dd6574a20f58b31ed901d0006bced4bnjn DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 424986c2349f3dd6574a20f58b31ed901d0006bced4bnjn DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 425086c2349f3dd6574a20f58b31ed901d0006bced4bnjn GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 425186c2349f3dd6574a20f58b31ed901d0006bced4bnjn INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 425286c2349f3dd6574a20f58b31ed901d0006bced4bnjn WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 425386c2349f3dd6574a20f58b31ed901d0006bced4bnjn NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 425486c2349f3dd6574a20f58b31ed901d0006bced4bnjn SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 425586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 425686c2349f3dd6574a20f58b31ed901d0006bced4bnjn Julian Seward, Cambridge, UK. 425786c2349f3dd6574a20f58b31ed901d0006bced4bnjn jseward@bzip.org 425886c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzip2/libbzip2 version 1.0 of 21 March 2000 425986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 426086c2349f3dd6574a20f58b31ed901d0006bced4bnjn This program is based on (at least) the work of: 426186c2349f3dd6574a20f58b31ed901d0006bced4bnjn Mike Burrows 426286c2349f3dd6574a20f58b31ed901d0006bced4bnjn David Wheeler 426386c2349f3dd6574a20f58b31ed901d0006bced4bnjn Peter Fenwick 426486c2349f3dd6574a20f58b31ed901d0006bced4bnjn Alistair Moffat 426586c2349f3dd6574a20f58b31ed901d0006bced4bnjn Radford Neal 426686c2349f3dd6574a20f58b31ed901d0006bced4bnjn Ian H. Witten 426786c2349f3dd6574a20f58b31ed901d0006bced4bnjn Robert Sedgewick 426886c2349f3dd6574a20f58b31ed901d0006bced4bnjn Jon L. Bentley 426986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 427086c2349f3dd6574a20f58b31ed901d0006bced4bnjn For more information on these sources, see the manual. 427186c2349f3dd6574a20f58b31ed901d0006bced4bnjn--*/ 427286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 427386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 427486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 427586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 427686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 427786c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-- 427886c2349f3dd6574a20f58b31ed901d0006bced4bnjn I think this is an implementation of the AUTODIN-II, 427986c2349f3dd6574a20f58b31ed901d0006bced4bnjn Ethernet & FDDI 32-bit CRC standard. Vaguely derived 428086c2349f3dd6574a20f58b31ed901d0006bced4bnjn from code by Rob Warnock, in Section 51 of the 428186c2349f3dd6574a20f58b31ed901d0006bced4bnjn comp.compression FAQ. 428286c2349f3dd6574a20f58b31ed901d0006bced4bnjn--*/ 428386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 428486c2349f3dd6574a20f58b31ed901d0006bced4bnjnUInt32 BZ2_crc32Table[256] = { 428586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 428686c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- Ugly, innit? --*/ 428786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 428886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0x00000000L, 0x04c11db7L, 0x09823b6eL, 0x0d4326d9L, 428986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0x130476dcL, 0x17c56b6bL, 0x1a864db2L, 0x1e475005L, 429086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0x2608edb8L, 0x22c9f00fL, 0x2f8ad6d6L, 0x2b4bcb61L, 429186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0x350c9b64L, 0x31cd86d3L, 0x3c8ea00aL, 0x384fbdbdL, 429286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0x4c11db70L, 0x48d0c6c7L, 0x4593e01eL, 0x4152fda9L, 429386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0x5f15adacL, 0x5bd4b01bL, 0x569796c2L, 0x52568b75L, 429486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0x6a1936c8L, 0x6ed82b7fL, 0x639b0da6L, 0x675a1011L, 429586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0x791d4014L, 0x7ddc5da3L, 0x709f7b7aL, 0x745e66cdL, 429686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0x9823b6e0L, 0x9ce2ab57L, 0x91a18d8eL, 0x95609039L, 429786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0x8b27c03cL, 0x8fe6dd8bL, 0x82a5fb52L, 0x8664e6e5L, 429886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0xbe2b5b58L, 0xbaea46efL, 0xb7a96036L, 0xb3687d81L, 429986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0xad2f2d84L, 0xa9ee3033L, 0xa4ad16eaL, 0xa06c0b5dL, 430086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0xd4326d90L, 0xd0f37027L, 0xddb056feL, 0xd9714b49L, 430186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0xc7361b4cL, 0xc3f706fbL, 0xceb42022L, 0xca753d95L, 430286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0xf23a8028L, 0xf6fb9d9fL, 0xfbb8bb46L, 0xff79a6f1L, 430386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0xe13ef6f4L, 0xe5ffeb43L, 0xe8bccd9aL, 0xec7dd02dL, 430486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0x34867077L, 0x30476dc0L, 0x3d044b19L, 0x39c556aeL, 430586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0x278206abL, 0x23431b1cL, 0x2e003dc5L, 0x2ac12072L, 430686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0x128e9dcfL, 0x164f8078L, 0x1b0ca6a1L, 0x1fcdbb16L, 430786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0x018aeb13L, 0x054bf6a4L, 0x0808d07dL, 0x0cc9cdcaL, 430886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0x7897ab07L, 0x7c56b6b0L, 0x71159069L, 0x75d48ddeL, 430986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0x6b93dddbL, 0x6f52c06cL, 0x6211e6b5L, 0x66d0fb02L, 431086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0x5e9f46bfL, 0x5a5e5b08L, 0x571d7dd1L, 0x53dc6066L, 431186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0x4d9b3063L, 0x495a2dd4L, 0x44190b0dL, 0x40d816baL, 431286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0xaca5c697L, 0xa864db20L, 0xa527fdf9L, 0xa1e6e04eL, 431386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0xbfa1b04bL, 0xbb60adfcL, 0xb6238b25L, 0xb2e29692L, 431486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0x8aad2b2fL, 0x8e6c3698L, 0x832f1041L, 0x87ee0df6L, 431586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0x99a95df3L, 0x9d684044L, 0x902b669dL, 0x94ea7b2aL, 431686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0xe0b41de7L, 0xe4750050L, 0xe9362689L, 0xedf73b3eL, 431786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0xf3b06b3bL, 0xf771768cL, 0xfa325055L, 0xfef34de2L, 431886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0xc6bcf05fL, 0xc27dede8L, 0xcf3ecb31L, 0xcbffd686L, 431986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0xd5b88683L, 0xd1799b34L, 0xdc3abdedL, 0xd8fba05aL, 432086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0x690ce0eeL, 0x6dcdfd59L, 0x608edb80L, 0x644fc637L, 432186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0x7a089632L, 0x7ec98b85L, 0x738aad5cL, 0x774bb0ebL, 432286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0x4f040d56L, 0x4bc510e1L, 0x46863638L, 0x42472b8fL, 432386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0x5c007b8aL, 0x58c1663dL, 0x558240e4L, 0x51435d53L, 432486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0x251d3b9eL, 0x21dc2629L, 0x2c9f00f0L, 0x285e1d47L, 432586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0x36194d42L, 0x32d850f5L, 0x3f9b762cL, 0x3b5a6b9bL, 432686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0x0315d626L, 0x07d4cb91L, 0x0a97ed48L, 0x0e56f0ffL, 432786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0x1011a0faL, 0x14d0bd4dL, 0x19939b94L, 0x1d528623L, 432886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0xf12f560eL, 0xf5ee4bb9L, 0xf8ad6d60L, 0xfc6c70d7L, 432986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0xe22b20d2L, 0xe6ea3d65L, 0xeba91bbcL, 0xef68060bL, 433086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0xd727bbb6L, 0xd3e6a601L, 0xdea580d8L, 0xda649d6fL, 433186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0xc423cd6aL, 0xc0e2d0ddL, 0xcda1f604L, 0xc960ebb3L, 433286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0xbd3e8d7eL, 0xb9ff90c9L, 0xb4bcb610L, 0xb07daba7L, 433386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0xae3afba2L, 0xaafbe615L, 0xa7b8c0ccL, 0xa379dd7bL, 433486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0x9b3660c6L, 0x9ff77d71L, 0x92b45ba8L, 0x9675461fL, 433586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0x8832161aL, 0x8cf30badL, 0x81b02d74L, 0x857130c3L, 433686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0x5d8a9099L, 0x594b8d2eL, 0x5408abf7L, 0x50c9b640L, 433786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0x4e8ee645L, 0x4a4ffbf2L, 0x470cdd2bL, 0x43cdc09cL, 433886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0x7b827d21L, 0x7f436096L, 0x7200464fL, 0x76c15bf8L, 433986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0x68860bfdL, 0x6c47164aL, 0x61043093L, 0x65c52d24L, 434086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0x119b4be9L, 0x155a565eL, 0x18197087L, 0x1cd86d30L, 434186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0x029f3d35L, 0x065e2082L, 0x0b1d065bL, 0x0fdc1becL, 434286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0x3793a651L, 0x3352bbe6L, 0x3e119d3fL, 0x3ad08088L, 434386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0x2497d08dL, 0x2056cd3aL, 0x2d15ebe3L, 0x29d4f654L, 434486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0xc5a92679L, 0xc1683bceL, 0xcc2b1d17L, 0xc8ea00a0L, 434586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0xd6ad50a5L, 0xd26c4d12L, 0xdf2f6bcbL, 0xdbee767cL, 434686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0xe3a1cbc1L, 0xe760d676L, 0xea23f0afL, 0xeee2ed18L, 434786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0xf0a5bd1dL, 0xf464a0aaL, 0xf9278673L, 0xfde69bc4L, 434886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0x89b8fd09L, 0x8d79e0beL, 0x803ac667L, 0x84fbdbd0L, 434986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0x9abc8bd5L, 0x9e7d9662L, 0x933eb0bbL, 0x97ffad0cL, 435086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0xafb010b1L, 0xab710d06L, 0xa6322bdfL, 0xa2f33668L, 435186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0xbcb4666dL, 0xb8757bdaL, 0xb5365d03L, 0xb1f740b4L 435286c2349f3dd6574a20f58b31ed901d0006bced4bnjn}; 435386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 435486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 435586c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-------------------------------------------------------------*/ 435686c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*--- end crctable.c ---*/ 435786c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-------------------------------------------------------------*/ 435886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 435986c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-------------------------------------------------------------*/ 436086c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*--- Library top-level functions. ---*/ 436186c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*--- bzlib.c ---*/ 436286c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-------------------------------------------------------------*/ 436386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 436486c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-- 436586c2349f3dd6574a20f58b31ed901d0006bced4bnjn This file is a part of bzip2 and/or libbzip2, a program and 436686c2349f3dd6574a20f58b31ed901d0006bced4bnjn library for lossless, block-sorting data compression. 436786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 436886c2349f3dd6574a20f58b31ed901d0006bced4bnjn Copyright (C) 1996-2004 Julian R Seward. All rights reserved. 436986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 437086c2349f3dd6574a20f58b31ed901d0006bced4bnjn Redistribution and use in source and binary forms, with or without 437186c2349f3dd6574a20f58b31ed901d0006bced4bnjn modification, are permitted provided that the following conditions 437286c2349f3dd6574a20f58b31ed901d0006bced4bnjn are met: 437386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 437486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 1. Redistributions of source code must retain the above copyright 437586c2349f3dd6574a20f58b31ed901d0006bced4bnjn notice, this list of conditions and the following disclaimer. 437686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 437786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 2. The origin of this software must not be misrepresented; you must 437886c2349f3dd6574a20f58b31ed901d0006bced4bnjn not claim that you wrote the original software. If you use this 437986c2349f3dd6574a20f58b31ed901d0006bced4bnjn software in a product, an acknowledgment in the product 438086c2349f3dd6574a20f58b31ed901d0006bced4bnjn documentation would be appreciated but is not required. 438186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 438286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 3. Altered source versions must be plainly marked as such, and must 438386c2349f3dd6574a20f58b31ed901d0006bced4bnjn not be misrepresented as being the original software. 438486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 438586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 4. The name of the author may not be used to endorse or promote 438686c2349f3dd6574a20f58b31ed901d0006bced4bnjn products derived from this software without specific prior written 438786c2349f3dd6574a20f58b31ed901d0006bced4bnjn permission. 438886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 438986c2349f3dd6574a20f58b31ed901d0006bced4bnjn THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 439086c2349f3dd6574a20f58b31ed901d0006bced4bnjn OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 439186c2349f3dd6574a20f58b31ed901d0006bced4bnjn WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 439286c2349f3dd6574a20f58b31ed901d0006bced4bnjn ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 439386c2349f3dd6574a20f58b31ed901d0006bced4bnjn DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 439486c2349f3dd6574a20f58b31ed901d0006bced4bnjn DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 439586c2349f3dd6574a20f58b31ed901d0006bced4bnjn GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 439686c2349f3dd6574a20f58b31ed901d0006bced4bnjn INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 439786c2349f3dd6574a20f58b31ed901d0006bced4bnjn WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 439886c2349f3dd6574a20f58b31ed901d0006bced4bnjn NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 439986c2349f3dd6574a20f58b31ed901d0006bced4bnjn SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 440086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 440186c2349f3dd6574a20f58b31ed901d0006bced4bnjn Julian Seward, Cambridge, UK. 440286c2349f3dd6574a20f58b31ed901d0006bced4bnjn jseward@bzip.org 440386c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzip2/libbzip2 version 1.0 of 21 March 2000 440486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 440586c2349f3dd6574a20f58b31ed901d0006bced4bnjn This program is based on (at least) the work of: 440686c2349f3dd6574a20f58b31ed901d0006bced4bnjn Mike Burrows 440786c2349f3dd6574a20f58b31ed901d0006bced4bnjn David Wheeler 440886c2349f3dd6574a20f58b31ed901d0006bced4bnjn Peter Fenwick 440986c2349f3dd6574a20f58b31ed901d0006bced4bnjn Alistair Moffat 441086c2349f3dd6574a20f58b31ed901d0006bced4bnjn Radford Neal 441186c2349f3dd6574a20f58b31ed901d0006bced4bnjn Ian H. Witten 441286c2349f3dd6574a20f58b31ed901d0006bced4bnjn Robert Sedgewick 441386c2349f3dd6574a20f58b31ed901d0006bced4bnjn Jon L. Bentley 441486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 441586c2349f3dd6574a20f58b31ed901d0006bced4bnjn For more information on these sources, see the manual. 441686c2349f3dd6574a20f58b31ed901d0006bced4bnjn--*/ 441786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 441886c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-- 441986c2349f3dd6574a20f58b31ed901d0006bced4bnjn CHANGES 442086c2349f3dd6574a20f58b31ed901d0006bced4bnjn ~~~~~~~ 442186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0.9.0 -- original version. 442286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 442386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0.9.0a/b -- no changes in this file. 442486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 442586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 0.9.0c 442686c2349f3dd6574a20f58b31ed901d0006bced4bnjn * made zero-length BZ_FLUSH work correctly in bzCompress(). 442786c2349f3dd6574a20f58b31ed901d0006bced4bnjn * fixed bzWrite/bzRead to ignore zero-length requests. 442886c2349f3dd6574a20f58b31ed901d0006bced4bnjn * fixed bzread to correctly handle read requests after EOF. 442986c2349f3dd6574a20f58b31ed901d0006bced4bnjn * wrong parameter order in call to bzDecompressInit in 443086c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzBuffToBuffDecompress. Fixed. 443186c2349f3dd6574a20f58b31ed901d0006bced4bnjn--*/ 443286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 443386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 443486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 443586c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 443686c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*--- Compression stuff ---*/ 443786c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 443886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 443986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 444086c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 444186c2349f3dd6574a20f58b31ed901d0006bced4bnjnvoid BZ2_bz__AssertH__fail ( int errcode ) 444286c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 444386c2349f3dd6574a20f58b31ed901d0006bced4bnjn vex_printf("BZ2_bz__AssertH__fail(%d) called, exiting\n", errcode); 444486c2349f3dd6574a20f58b31ed901d0006bced4bnjn (*serviceFn)(0,0); 444586c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 444686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 444786c2349f3dd6574a20f58b31ed901d0006bced4bnjnvoid bz_internal_error ( int errcode ) 444886c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 444986c2349f3dd6574a20f58b31ed901d0006bced4bnjn vex_printf("bz_internal_error called, exiting\n", errcode); 445086c2349f3dd6574a20f58b31ed901d0006bced4bnjn (*serviceFn)(0,0); 445186c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 445286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 445386c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 445486c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic 445586c2349f3dd6574a20f58b31ed901d0006bced4bnjnint bz_config_ok ( void ) 445686c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 445786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (sizeof(int) != 4) return 0; 445886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (sizeof(short) != 2) return 0; 445986c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (sizeof(char) != 1) return 0; 446086c2349f3dd6574a20f58b31ed901d0006bced4bnjn return 1; 446186c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 446286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 446386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 446486c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 446586c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic 446686c2349f3dd6574a20f58b31ed901d0006bced4bnjnvoid* default_bzalloc ( void* opaque, Int32 items, Int32 size ) 446786c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 446886c2349f3dd6574a20f58b31ed901d0006bced4bnjn void* v = (void*) (*serviceFn)(2, items * size ); 446986c2349f3dd6574a20f58b31ed901d0006bced4bnjn return v; 447086c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 447186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 447286c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic 447386c2349f3dd6574a20f58b31ed901d0006bced4bnjnvoid default_bzfree ( void* opaque, void* addr ) 447486c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 447586c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (addr != NULL) (*serviceFn)( 3, (HWord)addr ); 447686c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 447786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 447886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 447986c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 448086c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic 448186c2349f3dd6574a20f58b31ed901d0006bced4bnjnvoid prepare_new_block ( EState* s ) 448286c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 448386c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 i; 448486c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->nblock = 0; 448586c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->numZ = 0; 448686c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->state_out_pos = 0; 448786c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_INITIALISE_CRC ( s->blockCRC ); 448886c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i < 256; i++) s->inUse[i] = False; 448986c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->blockNo++; 449086c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 449186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 449286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 449386c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 449486c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic 449586c2349f3dd6574a20f58b31ed901d0006bced4bnjnvoid init_RL ( EState* s ) 449686c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 449786c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->state_in_ch = 256; 449886c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->state_in_len = 0; 449986c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 450086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 450186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 450286c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic 450386c2349f3dd6574a20f58b31ed901d0006bced4bnjnBool isempty_RL ( EState* s ) 450486c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 450586c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->state_in_ch < 256 && s->state_in_len > 0) 450686c2349f3dd6574a20f58b31ed901d0006bced4bnjn return False; else 450786c2349f3dd6574a20f58b31ed901d0006bced4bnjn return True; 450886c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 450986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 451086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 451186c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 451286c2349f3dd6574a20f58b31ed901d0006bced4bnjnint BZ_API(BZ2_bzCompressInit) 451386c2349f3dd6574a20f58b31ed901d0006bced4bnjn ( bz_stream* strm, 451486c2349f3dd6574a20f58b31ed901d0006bced4bnjn int blockSize100k, 451586c2349f3dd6574a20f58b31ed901d0006bced4bnjn int verbosity, 451686c2349f3dd6574a20f58b31ed901d0006bced4bnjn int workFactor ) 451786c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 451886c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 n; 451986c2349f3dd6574a20f58b31ed901d0006bced4bnjn EState* s; 452086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 452186c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (!bz_config_ok()) return BZ_CONFIG_ERROR; 452286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 452386c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (strm == NULL || 452486c2349f3dd6574a20f58b31ed901d0006bced4bnjn blockSize100k < 1 || blockSize100k > 9 || 452586c2349f3dd6574a20f58b31ed901d0006bced4bnjn workFactor < 0 || workFactor > 250) 452686c2349f3dd6574a20f58b31ed901d0006bced4bnjn return BZ_PARAM_ERROR; 452786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 452886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (workFactor == 0) workFactor = 30; 452986c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (strm->bzalloc == NULL) strm->bzalloc = default_bzalloc; 453086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (strm->bzfree == NULL) strm->bzfree = default_bzfree; 453186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 453286c2349f3dd6574a20f58b31ed901d0006bced4bnjn s = BZALLOC( sizeof(EState) ); 453386c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s == NULL) return BZ_MEM_ERROR; 453486c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->strm = strm; 453586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 453686c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->arr1 = NULL; 453786c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->arr2 = NULL; 453886c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->ftab = NULL; 453986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 454086c2349f3dd6574a20f58b31ed901d0006bced4bnjn n = 100000 * blockSize100k; 454186c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->arr1 = BZALLOC( n * sizeof(UInt32) ); 454286c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->arr2 = BZALLOC( (n+BZ_N_OVERSHOOT) * sizeof(UInt32) ); 454386c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->ftab = BZALLOC( 65537 * sizeof(UInt32) ); 454486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 454586c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->arr1 == NULL || s->arr2 == NULL || s->ftab == NULL) { 454686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->arr1 != NULL) BZFREE(s->arr1); 454786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->arr2 != NULL) BZFREE(s->arr2); 454886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->ftab != NULL) BZFREE(s->ftab); 454986c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s != NULL) BZFREE(s); 455086c2349f3dd6574a20f58b31ed901d0006bced4bnjn return BZ_MEM_ERROR; 455186c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 455286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 455386c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->blockNo = 0; 455486c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->state = BZ_S_INPUT; 455586c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->mode = BZ_M_RUNNING; 455686c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->combinedCRC = 0; 455786c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->blockSize100k = blockSize100k; 455886c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->nblockMAX = 100000 * blockSize100k - 19; 455986c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->verbosity = verbosity; 456086c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->workFactor = workFactor; 456186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 456286c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->block = (UChar*)s->arr2; 456386c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->mtfv = (UInt16*)s->arr1; 456486c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->zbits = NULL; 456586c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->ptr = (UInt32*)s->arr1; 456686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 456786c2349f3dd6574a20f58b31ed901d0006bced4bnjn strm->state = s; 456886c2349f3dd6574a20f58b31ed901d0006bced4bnjn strm->total_in_lo32 = 0; 456986c2349f3dd6574a20f58b31ed901d0006bced4bnjn strm->total_in_hi32 = 0; 457086c2349f3dd6574a20f58b31ed901d0006bced4bnjn strm->total_out_lo32 = 0; 457186c2349f3dd6574a20f58b31ed901d0006bced4bnjn strm->total_out_hi32 = 0; 457286c2349f3dd6574a20f58b31ed901d0006bced4bnjn init_RL ( s ); 457386c2349f3dd6574a20f58b31ed901d0006bced4bnjn prepare_new_block ( s ); 457486c2349f3dd6574a20f58b31ed901d0006bced4bnjn return BZ_OK; 457586c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 457686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 457786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 457886c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 457986c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic 458086c2349f3dd6574a20f58b31ed901d0006bced4bnjnvoid add_pair_to_block ( EState* s ) 458186c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 458286c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 i; 458386c2349f3dd6574a20f58b31ed901d0006bced4bnjn UChar ch = (UChar)(s->state_in_ch); 458486c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i < s->state_in_len; i++) { 458586c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_UPDATE_CRC( s->blockCRC, ch ); 458686c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 458786c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->inUse[s->state_in_ch] = True; 458886c2349f3dd6574a20f58b31ed901d0006bced4bnjn switch (s->state_in_len) { 458986c2349f3dd6574a20f58b31ed901d0006bced4bnjn case 1: 459086c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->block[s->nblock] = (UChar)ch; s->nblock++; 459186c2349f3dd6574a20f58b31ed901d0006bced4bnjn break; 459286c2349f3dd6574a20f58b31ed901d0006bced4bnjn case 2: 459386c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->block[s->nblock] = (UChar)ch; s->nblock++; 459486c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->block[s->nblock] = (UChar)ch; s->nblock++; 459586c2349f3dd6574a20f58b31ed901d0006bced4bnjn break; 459686c2349f3dd6574a20f58b31ed901d0006bced4bnjn case 3: 459786c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->block[s->nblock] = (UChar)ch; s->nblock++; 459886c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->block[s->nblock] = (UChar)ch; s->nblock++; 459986c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->block[s->nblock] = (UChar)ch; s->nblock++; 460086c2349f3dd6574a20f58b31ed901d0006bced4bnjn break; 460186c2349f3dd6574a20f58b31ed901d0006bced4bnjn default: 460286c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->inUse[s->state_in_len-4] = True; 460386c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->block[s->nblock] = (UChar)ch; s->nblock++; 460486c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->block[s->nblock] = (UChar)ch; s->nblock++; 460586c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->block[s->nblock] = (UChar)ch; s->nblock++; 460686c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->block[s->nblock] = (UChar)ch; s->nblock++; 460786c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->block[s->nblock] = ((UChar)(s->state_in_len-4)); 460886c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->nblock++; 460986c2349f3dd6574a20f58b31ed901d0006bced4bnjn break; 461086c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 461186c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 461286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 461386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 461486c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 461586c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic 461686c2349f3dd6574a20f58b31ed901d0006bced4bnjnvoid flush_RL ( EState* s ) 461786c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 461886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->state_in_ch < 256) add_pair_to_block ( s ); 461986c2349f3dd6574a20f58b31ed901d0006bced4bnjn init_RL ( s ); 462086c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 462186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 462286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 462386c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 462486c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define ADD_CHAR_TO_BLOCK(zs,zchh0) \ 462586c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ \ 462686c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt32 zchh = (UInt32)(zchh0); \ 462786c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- fast track the common case --*/ \ 462886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (zchh != zs->state_in_ch && \ 462986c2349f3dd6574a20f58b31ed901d0006bced4bnjn zs->state_in_len == 1) { \ 463086c2349f3dd6574a20f58b31ed901d0006bced4bnjn UChar ch = (UChar)(zs->state_in_ch); \ 463186c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_UPDATE_CRC( zs->blockCRC, ch ); \ 463286c2349f3dd6574a20f58b31ed901d0006bced4bnjn zs->inUse[zs->state_in_ch] = True; \ 463386c2349f3dd6574a20f58b31ed901d0006bced4bnjn zs->block[zs->nblock] = (UChar)ch; \ 463486c2349f3dd6574a20f58b31ed901d0006bced4bnjn zs->nblock++; \ 463586c2349f3dd6574a20f58b31ed901d0006bced4bnjn zs->state_in_ch = zchh; \ 463686c2349f3dd6574a20f58b31ed901d0006bced4bnjn } \ 463786c2349f3dd6574a20f58b31ed901d0006bced4bnjn else \ 463886c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- general, uncommon cases --*/ \ 463986c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (zchh != zs->state_in_ch || \ 464086c2349f3dd6574a20f58b31ed901d0006bced4bnjn zs->state_in_len == 255) { \ 464186c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (zs->state_in_ch < 256) \ 464286c2349f3dd6574a20f58b31ed901d0006bced4bnjn add_pair_to_block ( zs ); \ 464386c2349f3dd6574a20f58b31ed901d0006bced4bnjn zs->state_in_ch = zchh; \ 464486c2349f3dd6574a20f58b31ed901d0006bced4bnjn zs->state_in_len = 1; \ 464586c2349f3dd6574a20f58b31ed901d0006bced4bnjn } else { \ 464686c2349f3dd6574a20f58b31ed901d0006bced4bnjn zs->state_in_len++; \ 464786c2349f3dd6574a20f58b31ed901d0006bced4bnjn } \ 464886c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 464986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 465086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 465186c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 465286c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic 465386c2349f3dd6574a20f58b31ed901d0006bced4bnjnBool copy_input_until_stop ( EState* s ) 465486c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 465586c2349f3dd6574a20f58b31ed901d0006bced4bnjn Bool progress_in = False; 465686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 465786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->mode == BZ_M_RUNNING) { 465886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 465986c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- fast track the common case --*/ 466086c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (True) { 466186c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- block full? --*/ 466286c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->nblock >= s->nblockMAX) break; 466386c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- no input? --*/ 466486c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->strm->avail_in == 0) break; 466586c2349f3dd6574a20f58b31ed901d0006bced4bnjn progress_in = True; 466686c2349f3dd6574a20f58b31ed901d0006bced4bnjn ADD_CHAR_TO_BLOCK ( s, (UInt32)(*((UChar*)(s->strm->next_in))) ); 466786c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->strm->next_in++; 466886c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->strm->avail_in--; 466986c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->strm->total_in_lo32++; 467086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; 467186c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 467286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 467386c2349f3dd6574a20f58b31ed901d0006bced4bnjn } else { 467486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 467586c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- general, uncommon case --*/ 467686c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (True) { 467786c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- block full? --*/ 467886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->nblock >= s->nblockMAX) break; 467986c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- no input? --*/ 468086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->strm->avail_in == 0) break; 468186c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- flush/finish end? --*/ 468286c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->avail_in_expect == 0) break; 468386c2349f3dd6574a20f58b31ed901d0006bced4bnjn progress_in = True; 468486c2349f3dd6574a20f58b31ed901d0006bced4bnjn ADD_CHAR_TO_BLOCK ( s, (UInt32)(*((UChar*)(s->strm->next_in))) ); 468586c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->strm->next_in++; 468686c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->strm->avail_in--; 468786c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->strm->total_in_lo32++; 468886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; 468986c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->avail_in_expect--; 469086c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 469186c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 469286c2349f3dd6574a20f58b31ed901d0006bced4bnjn return progress_in; 469386c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 469486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 469586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 469686c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 469786c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic 469886c2349f3dd6574a20f58b31ed901d0006bced4bnjnBool copy_output_until_stop ( EState* s ) 469986c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 470086c2349f3dd6574a20f58b31ed901d0006bced4bnjn Bool progress_out = False; 470186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 470286c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (True) { 470386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 470486c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- no output space? --*/ 470586c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->strm->avail_out == 0) break; 470686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 470786c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*-- block done? --*/ 470886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->state_out_pos >= s->numZ) break; 470986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 471086c2349f3dd6574a20f58b31ed901d0006bced4bnjn progress_out = True; 471186c2349f3dd6574a20f58b31ed901d0006bced4bnjn *(s->strm->next_out) = s->zbits[s->state_out_pos]; 471286c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->state_out_pos++; 471386c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->strm->avail_out--; 471486c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->strm->next_out++; 471586c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->strm->total_out_lo32++; 471686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++; 471786c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 471886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 471986c2349f3dd6574a20f58b31ed901d0006bced4bnjn return progress_out; 472086c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 472186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 472286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 472386c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 472486c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic 472586c2349f3dd6574a20f58b31ed901d0006bced4bnjnBool handle_compress ( bz_stream* strm ) 472686c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 472786c2349f3dd6574a20f58b31ed901d0006bced4bnjn Bool progress_in = False; 472886c2349f3dd6574a20f58b31ed901d0006bced4bnjn Bool progress_out = False; 472986c2349f3dd6574a20f58b31ed901d0006bced4bnjn EState* s = strm->state; 473086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 473186c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (True) { 473286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 473386c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->state == BZ_S_OUTPUT) { 473486c2349f3dd6574a20f58b31ed901d0006bced4bnjn progress_out |= copy_output_until_stop ( s ); 473586c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->state_out_pos < s->numZ) break; 473686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->mode == BZ_M_FINISHING && 473786c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->avail_in_expect == 0 && 473886c2349f3dd6574a20f58b31ed901d0006bced4bnjn isempty_RL(s)) break; 473986c2349f3dd6574a20f58b31ed901d0006bced4bnjn prepare_new_block ( s ); 474086c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->state = BZ_S_INPUT; 474186c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->mode == BZ_M_FLUSHING && 474286c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->avail_in_expect == 0 && 474386c2349f3dd6574a20f58b31ed901d0006bced4bnjn isempty_RL(s)) break; 474486c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 474586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 474686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->state == BZ_S_INPUT) { 474786c2349f3dd6574a20f58b31ed901d0006bced4bnjn progress_in |= copy_input_until_stop ( s ); 474886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->mode != BZ_M_RUNNING && s->avail_in_expect == 0) { 474986c2349f3dd6574a20f58b31ed901d0006bced4bnjn flush_RL ( s ); 475086c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ2_compressBlock ( s, (Bool)(s->mode == BZ_M_FINISHING) ); 475186c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->state = BZ_S_OUTPUT; 475286c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 475386c2349f3dd6574a20f58b31ed901d0006bced4bnjn else 475486c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->nblock >= s->nblockMAX) { 475586c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ2_compressBlock ( s, False ); 475686c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->state = BZ_S_OUTPUT; 475786c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 475886c2349f3dd6574a20f58b31ed901d0006bced4bnjn else 475986c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->strm->avail_in == 0) { 476086c2349f3dd6574a20f58b31ed901d0006bced4bnjn break; 476186c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 476286c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 476386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 476486c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 476586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 476686c2349f3dd6574a20f58b31ed901d0006bced4bnjn return progress_in || progress_out; 476786c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 476886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 476986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 477086c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 477186c2349f3dd6574a20f58b31ed901d0006bced4bnjnint BZ_API(BZ2_bzCompress) ( bz_stream *strm, int action ) 477286c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 477386c2349f3dd6574a20f58b31ed901d0006bced4bnjn Bool progress; 477486c2349f3dd6574a20f58b31ed901d0006bced4bnjn EState* s; 477586c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (strm == NULL) return BZ_PARAM_ERROR; 477686c2349f3dd6574a20f58b31ed901d0006bced4bnjn s = strm->state; 477786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s == NULL) return BZ_PARAM_ERROR; 477886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->strm != strm) return BZ_PARAM_ERROR; 477986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 478086c2349f3dd6574a20f58b31ed901d0006bced4bnjn preswitch: 478186c2349f3dd6574a20f58b31ed901d0006bced4bnjn switch (s->mode) { 478286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 478386c2349f3dd6574a20f58b31ed901d0006bced4bnjn case BZ_M_IDLE: 478486c2349f3dd6574a20f58b31ed901d0006bced4bnjn return BZ_SEQUENCE_ERROR; 478586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 478686c2349f3dd6574a20f58b31ed901d0006bced4bnjn case BZ_M_RUNNING: 478786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (action == BZ_RUN) { 478886c2349f3dd6574a20f58b31ed901d0006bced4bnjn progress = handle_compress ( strm ); 478986c2349f3dd6574a20f58b31ed901d0006bced4bnjn return progress ? BZ_RUN_OK : BZ_PARAM_ERROR; 479086c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 479186c2349f3dd6574a20f58b31ed901d0006bced4bnjn else 479286c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (action == BZ_FLUSH) { 479386c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->avail_in_expect = strm->avail_in; 479486c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->mode = BZ_M_FLUSHING; 479586c2349f3dd6574a20f58b31ed901d0006bced4bnjn goto preswitch; 479686c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 479786c2349f3dd6574a20f58b31ed901d0006bced4bnjn else 479886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (action == BZ_FINISH) { 479986c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->avail_in_expect = strm->avail_in; 480086c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->mode = BZ_M_FINISHING; 480186c2349f3dd6574a20f58b31ed901d0006bced4bnjn goto preswitch; 480286c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 480386c2349f3dd6574a20f58b31ed901d0006bced4bnjn else 480486c2349f3dd6574a20f58b31ed901d0006bced4bnjn return BZ_PARAM_ERROR; 480586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 480686c2349f3dd6574a20f58b31ed901d0006bced4bnjn case BZ_M_FLUSHING: 480786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (action != BZ_FLUSH) return BZ_SEQUENCE_ERROR; 480886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->avail_in_expect != s->strm->avail_in) 480986c2349f3dd6574a20f58b31ed901d0006bced4bnjn return BZ_SEQUENCE_ERROR; 481086c2349f3dd6574a20f58b31ed901d0006bced4bnjn progress = handle_compress ( strm ); 481186c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->avail_in_expect > 0 || !isempty_RL(s) || 481286c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->state_out_pos < s->numZ) return BZ_FLUSH_OK; 481386c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->mode = BZ_M_RUNNING; 481486c2349f3dd6574a20f58b31ed901d0006bced4bnjn return BZ_RUN_OK; 481586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 481686c2349f3dd6574a20f58b31ed901d0006bced4bnjn case BZ_M_FINISHING: 481786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (action != BZ_FINISH) return BZ_SEQUENCE_ERROR; 481886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->avail_in_expect != s->strm->avail_in) 481986c2349f3dd6574a20f58b31ed901d0006bced4bnjn return BZ_SEQUENCE_ERROR; 482086c2349f3dd6574a20f58b31ed901d0006bced4bnjn progress = handle_compress ( strm ); 482186c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (!progress) return BZ_SEQUENCE_ERROR; 482286c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->avail_in_expect > 0 || !isempty_RL(s) || 482386c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->state_out_pos < s->numZ) return BZ_FINISH_OK; 482486c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->mode = BZ_M_IDLE; 482586c2349f3dd6574a20f58b31ed901d0006bced4bnjn return BZ_STREAM_END; 482686c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 482786c2349f3dd6574a20f58b31ed901d0006bced4bnjn return BZ_OK; /*--not reached--*/ 482886c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 482986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 483086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 483186c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 483286c2349f3dd6574a20f58b31ed901d0006bced4bnjnint BZ_API(BZ2_bzCompressEnd) ( bz_stream *strm ) 483386c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 483486c2349f3dd6574a20f58b31ed901d0006bced4bnjn EState* s; 483586c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (strm == NULL) return BZ_PARAM_ERROR; 483686c2349f3dd6574a20f58b31ed901d0006bced4bnjn s = strm->state; 483786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s == NULL) return BZ_PARAM_ERROR; 483886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->strm != strm) return BZ_PARAM_ERROR; 483986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 484086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->arr1 != NULL) BZFREE(s->arr1); 484186c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->arr2 != NULL) BZFREE(s->arr2); 484286c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->ftab != NULL) BZFREE(s->ftab); 484386c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZFREE(strm->state); 484486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 484586c2349f3dd6574a20f58b31ed901d0006bced4bnjn strm->state = NULL; 484686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 484786c2349f3dd6574a20f58b31ed901d0006bced4bnjn return BZ_OK; 484886c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 484986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 485086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 485186c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 485286c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*--- Decompression stuff ---*/ 485386c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 485486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 485586c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 485686c2349f3dd6574a20f58b31ed901d0006bced4bnjnint BZ_API(BZ2_bzDecompressInit) 485786c2349f3dd6574a20f58b31ed901d0006bced4bnjn ( bz_stream* strm, 485886c2349f3dd6574a20f58b31ed901d0006bced4bnjn int verbosity, 485986c2349f3dd6574a20f58b31ed901d0006bced4bnjn int small ) 486086c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 486186c2349f3dd6574a20f58b31ed901d0006bced4bnjn DState* s; 486286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 486386c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (!bz_config_ok()) return BZ_CONFIG_ERROR; 486486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 486586c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (strm == NULL) return BZ_PARAM_ERROR; 486686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (small != 0 && small != 1) return BZ_PARAM_ERROR; 486786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (verbosity < 0 || verbosity > 4) return BZ_PARAM_ERROR; 486886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 486986c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (strm->bzalloc == NULL) strm->bzalloc = default_bzalloc; 487086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (strm->bzfree == NULL) strm->bzfree = default_bzfree; 487186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 487286c2349f3dd6574a20f58b31ed901d0006bced4bnjn s = BZALLOC( sizeof(DState) ); 487386c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s == NULL) return BZ_MEM_ERROR; 487486c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->strm = strm; 487586c2349f3dd6574a20f58b31ed901d0006bced4bnjn strm->state = s; 487686c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->state = BZ_X_MAGIC_1; 487786c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->bsLive = 0; 487886c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->bsBuff = 0; 487986c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->calculatedCombinedCRC = 0; 488086c2349f3dd6574a20f58b31ed901d0006bced4bnjn strm->total_in_lo32 = 0; 488186c2349f3dd6574a20f58b31ed901d0006bced4bnjn strm->total_in_hi32 = 0; 488286c2349f3dd6574a20f58b31ed901d0006bced4bnjn strm->total_out_lo32 = 0; 488386c2349f3dd6574a20f58b31ed901d0006bced4bnjn strm->total_out_hi32 = 0; 488486c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->smallDecompress = (Bool)small; 488586c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->ll4 = NULL; 488686c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->ll16 = NULL; 488786c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->tt = NULL; 488886c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->currBlockNo = 0; 488986c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->verbosity = verbosity; 489086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 489186c2349f3dd6574a20f58b31ed901d0006bced4bnjn return BZ_OK; 489286c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 489386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 489486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 489586c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 489686c2349f3dd6574a20f58b31ed901d0006bced4bnjn/* Return True iff data corruption is discovered. 489786c2349f3dd6574a20f58b31ed901d0006bced4bnjn Returns False if there is no problem. 489886c2349f3dd6574a20f58b31ed901d0006bced4bnjn*/ 489986c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic 490086c2349f3dd6574a20f58b31ed901d0006bced4bnjnBool unRLE_obuf_to_output_FAST ( DState* s ) 490186c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 490286c2349f3dd6574a20f58b31ed901d0006bced4bnjn UChar k1; 490386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 490486c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->blockRandomised) { 490586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 490686c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (True) { 490786c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* try to finish existing run */ 490886c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (True) { 490986c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->strm->avail_out == 0) return False; 491086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->state_out_len == 0) break; 491186c2349f3dd6574a20f58b31ed901d0006bced4bnjn *( (UChar*)(s->strm->next_out) ) = s->state_out_ch; 491286c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch ); 491386c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->state_out_len--; 491486c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->strm->next_out++; 491586c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->strm->avail_out--; 491686c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->strm->total_out_lo32++; 491786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++; 491886c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 491986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 492086c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* can a new run be started? */ 492186c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->nblock_used == s->save_nblock+1) return False; 492286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 492386c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* Only caused by corrupt data stream? */ 492486c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->nblock_used > s->save_nblock+1) 492586c2349f3dd6574a20f58b31ed901d0006bced4bnjn return True; 492686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 492786c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->state_out_len = 1; 492886c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->state_out_ch = s->k0; 492986c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; 493086c2349f3dd6574a20f58b31ed901d0006bced4bnjn k1 ^= BZ_RAND_MASK; s->nblock_used++; 493186c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->nblock_used == s->save_nblock+1) continue; 493286c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (k1 != s->k0) { s->k0 = k1; continue; }; 493386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 493486c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->state_out_len = 2; 493586c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; 493686c2349f3dd6574a20f58b31ed901d0006bced4bnjn k1 ^= BZ_RAND_MASK; s->nblock_used++; 493786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->nblock_used == s->save_nblock+1) continue; 493886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (k1 != s->k0) { s->k0 = k1; continue; }; 493986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 494086c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->state_out_len = 3; 494186c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; 494286c2349f3dd6574a20f58b31ed901d0006bced4bnjn k1 ^= BZ_RAND_MASK; s->nblock_used++; 494386c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->nblock_used == s->save_nblock+1) continue; 494486c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (k1 != s->k0) { s->k0 = k1; continue; }; 494586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 494686c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; 494786c2349f3dd6574a20f58b31ed901d0006bced4bnjn k1 ^= BZ_RAND_MASK; s->nblock_used++; 494886c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->state_out_len = ((Int32)k1) + 4; 494986c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_GET_FAST(s->k0); BZ_RAND_UPD_MASK; 495086c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->k0 ^= BZ_RAND_MASK; s->nblock_used++; 495186c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 495286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 495386c2349f3dd6574a20f58b31ed901d0006bced4bnjn } else { 495486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 495586c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* restore */ 495686c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt32 c_calculatedBlockCRC = s->calculatedBlockCRC; 495786c2349f3dd6574a20f58b31ed901d0006bced4bnjn UChar c_state_out_ch = s->state_out_ch; 495886c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 c_state_out_len = s->state_out_len; 495986c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 c_nblock_used = s->nblock_used; 496086c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 c_k0 = s->k0; 496186c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt32* c_tt = s->tt; 496286c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt32 c_tPos = s->tPos; 496386c2349f3dd6574a20f58b31ed901d0006bced4bnjn char* cs_next_out = s->strm->next_out; 496486c2349f3dd6574a20f58b31ed901d0006bced4bnjn unsigned int cs_avail_out = s->strm->avail_out; 496586c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* end restore */ 496686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 496786c2349f3dd6574a20f58b31ed901d0006bced4bnjn UInt32 avail_out_INIT = cs_avail_out; 496886c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 s_save_nblockPP = s->save_nblock+1; 496986c2349f3dd6574a20f58b31ed901d0006bced4bnjn unsigned int total_out_lo32_old; 497086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 497186c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (True) { 497286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 497386c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* try to finish existing run */ 497486c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (c_state_out_len > 0) { 497586c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (True) { 497686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (cs_avail_out == 0) goto return_notr; 497786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (c_state_out_len == 1) break; 497886c2349f3dd6574a20f58b31ed901d0006bced4bnjn *( (UChar*)(cs_next_out) ) = c_state_out_ch; 497986c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_UPDATE_CRC ( c_calculatedBlockCRC, c_state_out_ch ); 498086c2349f3dd6574a20f58b31ed901d0006bced4bnjn c_state_out_len--; 498186c2349f3dd6574a20f58b31ed901d0006bced4bnjn cs_next_out++; 498286c2349f3dd6574a20f58b31ed901d0006bced4bnjn cs_avail_out--; 498386c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 498486c2349f3dd6574a20f58b31ed901d0006bced4bnjn s_state_out_len_eq_one: 498586c2349f3dd6574a20f58b31ed901d0006bced4bnjn { 498686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (cs_avail_out == 0) { 498786c2349f3dd6574a20f58b31ed901d0006bced4bnjn c_state_out_len = 1; goto return_notr; 498886c2349f3dd6574a20f58b31ed901d0006bced4bnjn }; 498986c2349f3dd6574a20f58b31ed901d0006bced4bnjn *( (UChar*)(cs_next_out) ) = c_state_out_ch; 499086c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_UPDATE_CRC ( c_calculatedBlockCRC, c_state_out_ch ); 499186c2349f3dd6574a20f58b31ed901d0006bced4bnjn cs_next_out++; 499286c2349f3dd6574a20f58b31ed901d0006bced4bnjn cs_avail_out--; 499386c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 499486c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 499586c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* Only caused by corrupt data stream? */ 499686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (c_nblock_used > s_save_nblockPP) 499786c2349f3dd6574a20f58b31ed901d0006bced4bnjn return True; 499886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 499986c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* can a new run be started? */ 500086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (c_nblock_used == s_save_nblockPP) { 500186c2349f3dd6574a20f58b31ed901d0006bced4bnjn c_state_out_len = 0; goto return_notr; 500286c2349f3dd6574a20f58b31ed901d0006bced4bnjn }; 500386c2349f3dd6574a20f58b31ed901d0006bced4bnjn c_state_out_ch = c_k0; 500486c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_GET_FAST_C(k1); c_nblock_used++; 500586c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (k1 != c_k0) { 500686c2349f3dd6574a20f58b31ed901d0006bced4bnjn c_k0 = k1; goto s_state_out_len_eq_one; 500786c2349f3dd6574a20f58b31ed901d0006bced4bnjn }; 500886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (c_nblock_used == s_save_nblockPP) 500986c2349f3dd6574a20f58b31ed901d0006bced4bnjn goto s_state_out_len_eq_one; 501086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 501186c2349f3dd6574a20f58b31ed901d0006bced4bnjn c_state_out_len = 2; 501286c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_GET_FAST_C(k1); c_nblock_used++; 501386c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (c_nblock_used == s_save_nblockPP) continue; 501486c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (k1 != c_k0) { c_k0 = k1; continue; }; 501586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 501686c2349f3dd6574a20f58b31ed901d0006bced4bnjn c_state_out_len = 3; 501786c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_GET_FAST_C(k1); c_nblock_used++; 501886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (c_nblock_used == s_save_nblockPP) continue; 501986c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (k1 != c_k0) { c_k0 = k1; continue; }; 502086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 502186c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_GET_FAST_C(k1); c_nblock_used++; 502286c2349f3dd6574a20f58b31ed901d0006bced4bnjn c_state_out_len = ((Int32)k1) + 4; 502386c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_GET_FAST_C(c_k0); c_nblock_used++; 502486c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 502586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 502686c2349f3dd6574a20f58b31ed901d0006bced4bnjn return_notr: 502786c2349f3dd6574a20f58b31ed901d0006bced4bnjn total_out_lo32_old = s->strm->total_out_lo32; 502886c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->strm->total_out_lo32 += (avail_out_INIT - cs_avail_out); 502986c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->strm->total_out_lo32 < total_out_lo32_old) 503086c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->strm->total_out_hi32++; 503186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 503286c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* save */ 503386c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->calculatedBlockCRC = c_calculatedBlockCRC; 503486c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->state_out_ch = c_state_out_ch; 503586c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->state_out_len = c_state_out_len; 503686c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->nblock_used = c_nblock_used; 503786c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->k0 = c_k0; 503886c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->tt = c_tt; 503986c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->tPos = c_tPos; 504086c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->strm->next_out = cs_next_out; 504186c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->strm->avail_out = cs_avail_out; 504286c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* end save */ 504386c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 504486c2349f3dd6574a20f58b31ed901d0006bced4bnjn return False; 504586c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 504686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 504786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 504886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 504986c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 505086c2349f3dd6574a20f58b31ed901d0006bced4bnjn/* Return True iff data corruption is discovered. 505186c2349f3dd6574a20f58b31ed901d0006bced4bnjn Returns False if there is no problem. 505286c2349f3dd6574a20f58b31ed901d0006bced4bnjn*/ 505386c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic 505486c2349f3dd6574a20f58b31ed901d0006bced4bnjnBool unRLE_obuf_to_output_SMALL ( DState* s ) 505586c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 505686c2349f3dd6574a20f58b31ed901d0006bced4bnjn UChar k1; 505786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 505886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->blockRandomised) { 505986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 506086c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (True) { 506186c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* try to finish existing run */ 506286c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (True) { 506386c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->strm->avail_out == 0) return False; 506486c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->state_out_len == 0) break; 506586c2349f3dd6574a20f58b31ed901d0006bced4bnjn *( (UChar*)(s->strm->next_out) ) = s->state_out_ch; 506686c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch ); 506786c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->state_out_len--; 506886c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->strm->next_out++; 506986c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->strm->avail_out--; 507086c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->strm->total_out_lo32++; 507186c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++; 507286c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 507386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 507486c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* can a new run be started? */ 507586c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->nblock_used == s->save_nblock+1) return False; 507686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 507786c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* Only caused by corrupt data stream? */ 507886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->nblock_used > s->save_nblock+1) 507986c2349f3dd6574a20f58b31ed901d0006bced4bnjn return True; 508086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 508186c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->state_out_len = 1; 508286c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->state_out_ch = s->k0; 508386c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; 508486c2349f3dd6574a20f58b31ed901d0006bced4bnjn k1 ^= BZ_RAND_MASK; s->nblock_used++; 508586c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->nblock_used == s->save_nblock+1) continue; 508686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (k1 != s->k0) { s->k0 = k1; continue; }; 508786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 508886c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->state_out_len = 2; 508986c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; 509086c2349f3dd6574a20f58b31ed901d0006bced4bnjn k1 ^= BZ_RAND_MASK; s->nblock_used++; 509186c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->nblock_used == s->save_nblock+1) continue; 509286c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (k1 != s->k0) { s->k0 = k1; continue; }; 509386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 509486c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->state_out_len = 3; 509586c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; 509686c2349f3dd6574a20f58b31ed901d0006bced4bnjn k1 ^= BZ_RAND_MASK; s->nblock_used++; 509786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->nblock_used == s->save_nblock+1) continue; 509886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (k1 != s->k0) { s->k0 = k1; continue; }; 509986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 510086c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; 510186c2349f3dd6574a20f58b31ed901d0006bced4bnjn k1 ^= BZ_RAND_MASK; s->nblock_used++; 510286c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->state_out_len = ((Int32)k1) + 4; 510386c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_GET_SMALL(s->k0); BZ_RAND_UPD_MASK; 510486c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->k0 ^= BZ_RAND_MASK; s->nblock_used++; 510586c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 510686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 510786c2349f3dd6574a20f58b31ed901d0006bced4bnjn } else { 510886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 510986c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (True) { 511086c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* try to finish existing run */ 511186c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (True) { 511286c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->strm->avail_out == 0) return False; 511386c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->state_out_len == 0) break; 511486c2349f3dd6574a20f58b31ed901d0006bced4bnjn *( (UChar*)(s->strm->next_out) ) = s->state_out_ch; 511586c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch ); 511686c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->state_out_len--; 511786c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->strm->next_out++; 511886c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->strm->avail_out--; 511986c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->strm->total_out_lo32++; 512086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++; 512186c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 512286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 512386c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* can a new run be started? */ 512486c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->nblock_used == s->save_nblock+1) return False; 512586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 512686c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* Only caused by corrupt data stream? */ 512786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->nblock_used > s->save_nblock+1) 512886c2349f3dd6574a20f58b31ed901d0006bced4bnjn return True; 512986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 513086c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->state_out_len = 1; 513186c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->state_out_ch = s->k0; 513286c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_GET_SMALL(k1); s->nblock_used++; 513386c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->nblock_used == s->save_nblock+1) continue; 513486c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (k1 != s->k0) { s->k0 = k1; continue; }; 513586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 513686c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->state_out_len = 2; 513786c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_GET_SMALL(k1); s->nblock_used++; 513886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->nblock_used == s->save_nblock+1) continue; 513986c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (k1 != s->k0) { s->k0 = k1; continue; }; 514086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 514186c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->state_out_len = 3; 514286c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_GET_SMALL(k1); s->nblock_used++; 514386c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->nblock_used == s->save_nblock+1) continue; 514486c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (k1 != s->k0) { s->k0 = k1; continue; }; 514586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 514686c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_GET_SMALL(k1); s->nblock_used++; 514786c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->state_out_len = ((Int32)k1) + 4; 514886c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_GET_SMALL(s->k0); s->nblock_used++; 514986c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 515086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 515186c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 515286c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 515386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 515486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 515586c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 515686c2349f3dd6574a20f58b31ed901d0006bced4bnjnint BZ_API(BZ2_bzDecompress) ( bz_stream *strm ) 515786c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 515886c2349f3dd6574a20f58b31ed901d0006bced4bnjn Bool corrupt; 515986c2349f3dd6574a20f58b31ed901d0006bced4bnjn DState* s; 516086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (strm == NULL) return BZ_PARAM_ERROR; 516186c2349f3dd6574a20f58b31ed901d0006bced4bnjn s = strm->state; 516286c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s == NULL) return BZ_PARAM_ERROR; 516386c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->strm != strm) return BZ_PARAM_ERROR; 516486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 516586c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (True) { 516686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->state == BZ_X_IDLE) return BZ_SEQUENCE_ERROR; 516786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->state == BZ_X_OUTPUT) { 516886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->smallDecompress) 516986c2349f3dd6574a20f58b31ed901d0006bced4bnjn corrupt = unRLE_obuf_to_output_SMALL ( s ); else 517086c2349f3dd6574a20f58b31ed901d0006bced4bnjn corrupt = unRLE_obuf_to_output_FAST ( s ); 517186c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (corrupt) return BZ_DATA_ERROR; 517286c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->nblock_used == s->save_nblock+1 && s->state_out_len == 0) { 517386c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_FINALISE_CRC ( s->calculatedBlockCRC ); 517486c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->verbosity >= 3) 517586c2349f3dd6574a20f58b31ed901d0006bced4bnjn VPrintf2 ( " {0x%08x, 0x%08x}", s->storedBlockCRC, 517686c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->calculatedBlockCRC ); 517786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->verbosity >= 2) VPrintf0 ( "]" ); 517886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->calculatedBlockCRC != s->storedBlockCRC) 517986c2349f3dd6574a20f58b31ed901d0006bced4bnjn return BZ_DATA_ERROR; 518086c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->calculatedCombinedCRC 518186c2349f3dd6574a20f58b31ed901d0006bced4bnjn = (s->calculatedCombinedCRC << 1) | 518286c2349f3dd6574a20f58b31ed901d0006bced4bnjn (s->calculatedCombinedCRC >> 31); 518386c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->calculatedCombinedCRC ^= s->calculatedBlockCRC; 518486c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->state = BZ_X_BLKHDR_1; 518586c2349f3dd6574a20f58b31ed901d0006bced4bnjn } else { 518686c2349f3dd6574a20f58b31ed901d0006bced4bnjn return BZ_OK; 518786c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 518886c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 518986c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->state >= BZ_X_MAGIC_1) { 519086c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 r = BZ2_decompress ( s ); 519186c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (r == BZ_STREAM_END) { 519286c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->verbosity >= 3) 519386c2349f3dd6574a20f58b31ed901d0006bced4bnjn VPrintf2 ( "\n combined CRCs: stored = 0x%08x, computed = 0x%08x", 519486c2349f3dd6574a20f58b31ed901d0006bced4bnjn s->storedCombinedCRC, s->calculatedCombinedCRC ); 519586c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->calculatedCombinedCRC != s->storedCombinedCRC) 519686c2349f3dd6574a20f58b31ed901d0006bced4bnjn return BZ_DATA_ERROR; 519786c2349f3dd6574a20f58b31ed901d0006bced4bnjn return r; 519886c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 519986c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->state != BZ_X_OUTPUT) return r; 520086c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 520186c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 520286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 520386c2349f3dd6574a20f58b31ed901d0006bced4bnjn AssertH ( 0, 6001 ); 520486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 520586c2349f3dd6574a20f58b31ed901d0006bced4bnjn return 0; /*NOTREACHED*/ 520686c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 520786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 520886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 520986c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 521086c2349f3dd6574a20f58b31ed901d0006bced4bnjnint BZ_API(BZ2_bzDecompressEnd) ( bz_stream *strm ) 521186c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 521286c2349f3dd6574a20f58b31ed901d0006bced4bnjn DState* s; 521386c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (strm == NULL) return BZ_PARAM_ERROR; 521486c2349f3dd6574a20f58b31ed901d0006bced4bnjn s = strm->state; 521586c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s == NULL) return BZ_PARAM_ERROR; 521686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->strm != strm) return BZ_PARAM_ERROR; 521786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 521886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->tt != NULL) BZFREE(s->tt); 521986c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->ll16 != NULL) BZFREE(s->ll16); 522086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (s->ll4 != NULL) BZFREE(s->ll4); 522186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 522286c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZFREE(strm->state); 522386c2349f3dd6574a20f58b31ed901d0006bced4bnjn strm->state = NULL; 522486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 522586c2349f3dd6574a20f58b31ed901d0006bced4bnjn return BZ_OK; 522686c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 522786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 522886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 522986c2349f3dd6574a20f58b31ed901d0006bced4bnjn#ifndef BZ_NO_STDIO 523086c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 523186c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*--- File I/O stuff ---*/ 523286c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 523386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 523486c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define BZ_SETERR(eee) \ 523586c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ \ 523686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (bzerror != NULL) *bzerror = eee; \ 523786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (bzf != NULL) bzf->lastErr = eee; \ 523886c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 523986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 524086c2349f3dd6574a20f58b31ed901d0006bced4bnjntypedef 524186c2349f3dd6574a20f58b31ed901d0006bced4bnjn struct { 524286c2349f3dd6574a20f58b31ed901d0006bced4bnjn FILE* handle; 524386c2349f3dd6574a20f58b31ed901d0006bced4bnjn Char buf[BZ_MAX_UNUSED]; 524486c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 bufN; 524586c2349f3dd6574a20f58b31ed901d0006bced4bnjn Bool writing; 524686c2349f3dd6574a20f58b31ed901d0006bced4bnjn bz_stream strm; 524786c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 lastErr; 524886c2349f3dd6574a20f58b31ed901d0006bced4bnjn Bool initialisedOk; 524986c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 525086c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzFile; 525186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 525286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 525386c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------*/ 525486c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic Bool myfeof ( FILE* f ) 525586c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 525686c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 c = fgetc ( f ); 525786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (c == EOF) return True; 525886c2349f3dd6574a20f58b31ed901d0006bced4bnjn ungetc ( c, f ); 525986c2349f3dd6574a20f58b31ed901d0006bced4bnjn return False; 526086c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 526186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 526286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 526386c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 526486c2349f3dd6574a20f58b31ed901d0006bced4bnjnBZFILE* BZ_API(BZ2_bzWriteOpen) 526586c2349f3dd6574a20f58b31ed901d0006bced4bnjn ( int* bzerror, 526686c2349f3dd6574a20f58b31ed901d0006bced4bnjn FILE* f, 526786c2349f3dd6574a20f58b31ed901d0006bced4bnjn int blockSize100k, 526886c2349f3dd6574a20f58b31ed901d0006bced4bnjn int verbosity, 526986c2349f3dd6574a20f58b31ed901d0006bced4bnjn int workFactor ) 527086c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 527186c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 ret; 527286c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzFile* bzf = NULL; 527386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 527486c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_SETERR(BZ_OK); 527586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 527686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (f == NULL || 527786c2349f3dd6574a20f58b31ed901d0006bced4bnjn (blockSize100k < 1 || blockSize100k > 9) || 527886c2349f3dd6574a20f58b31ed901d0006bced4bnjn (workFactor < 0 || workFactor > 250) || 527986c2349f3dd6574a20f58b31ed901d0006bced4bnjn (verbosity < 0 || verbosity > 4)) 528086c2349f3dd6574a20f58b31ed901d0006bced4bnjn { BZ_SETERR(BZ_PARAM_ERROR); return NULL; }; 528186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 528286c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (ferror(f)) 528386c2349f3dd6574a20f58b31ed901d0006bced4bnjn { BZ_SETERR(BZ_IO_ERROR); return NULL; }; 528486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 528586c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzf = malloc ( sizeof(bzFile) ); 528686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (bzf == NULL) 528786c2349f3dd6574a20f58b31ed901d0006bced4bnjn { BZ_SETERR(BZ_MEM_ERROR); return NULL; }; 528886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 528986c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_SETERR(BZ_OK); 529086c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzf->initialisedOk = False; 529186c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzf->bufN = 0; 529286c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzf->handle = f; 529386c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzf->writing = True; 529486c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzf->strm.bzalloc = NULL; 529586c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzf->strm.bzfree = NULL; 529686c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzf->strm.opaque = NULL; 529786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 529886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (workFactor == 0) workFactor = 30; 529986c2349f3dd6574a20f58b31ed901d0006bced4bnjn ret = BZ2_bzCompressInit ( &(bzf->strm), blockSize100k, 530086c2349f3dd6574a20f58b31ed901d0006bced4bnjn verbosity, workFactor ); 530186c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (ret != BZ_OK) 530286c2349f3dd6574a20f58b31ed901d0006bced4bnjn { BZ_SETERR(ret); free(bzf); return NULL; }; 530386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 530486c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzf->strm.avail_in = 0; 530586c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzf->initialisedOk = True; 530686c2349f3dd6574a20f58b31ed901d0006bced4bnjn return bzf; 530786c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 530886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 530986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 531086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 531186c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 531286c2349f3dd6574a20f58b31ed901d0006bced4bnjnvoid BZ_API(BZ2_bzWrite) 531386c2349f3dd6574a20f58b31ed901d0006bced4bnjn ( int* bzerror, 531486c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZFILE* b, 531586c2349f3dd6574a20f58b31ed901d0006bced4bnjn void* buf, 531686c2349f3dd6574a20f58b31ed901d0006bced4bnjn int len ) 531786c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 531886c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 n, n2, ret; 531986c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzFile* bzf = (bzFile*)b; 532086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 532186c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_SETERR(BZ_OK); 532286c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (bzf == NULL || buf == NULL || len < 0) 532386c2349f3dd6574a20f58b31ed901d0006bced4bnjn { BZ_SETERR(BZ_PARAM_ERROR); return; }; 532486c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (!(bzf->writing)) 532586c2349f3dd6574a20f58b31ed901d0006bced4bnjn { BZ_SETERR(BZ_SEQUENCE_ERROR); return; }; 532686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (ferror(bzf->handle)) 532786c2349f3dd6574a20f58b31ed901d0006bced4bnjn { BZ_SETERR(BZ_IO_ERROR); return; }; 532886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 532986c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (len == 0) 533086c2349f3dd6574a20f58b31ed901d0006bced4bnjn { BZ_SETERR(BZ_OK); return; }; 533186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 533286c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzf->strm.avail_in = len; 533386c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzf->strm.next_in = buf; 533486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 533586c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (True) { 533686c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzf->strm.avail_out = BZ_MAX_UNUSED; 533786c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzf->strm.next_out = bzf->buf; 533886c2349f3dd6574a20f58b31ed901d0006bced4bnjn ret = BZ2_bzCompress ( &(bzf->strm), BZ_RUN ); 533986c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (ret != BZ_RUN_OK) 534086c2349f3dd6574a20f58b31ed901d0006bced4bnjn { BZ_SETERR(ret); return; }; 534186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 534286c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (bzf->strm.avail_out < BZ_MAX_UNUSED) { 534386c2349f3dd6574a20f58b31ed901d0006bced4bnjn n = BZ_MAX_UNUSED - bzf->strm.avail_out; 534486c2349f3dd6574a20f58b31ed901d0006bced4bnjn n2 = fwrite ( (void*)(bzf->buf), sizeof(UChar), 534586c2349f3dd6574a20f58b31ed901d0006bced4bnjn n, bzf->handle ); 534686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (n != n2 || ferror(bzf->handle)) 534786c2349f3dd6574a20f58b31ed901d0006bced4bnjn { BZ_SETERR(BZ_IO_ERROR); return; }; 534886c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 534986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 535086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (bzf->strm.avail_in == 0) 535186c2349f3dd6574a20f58b31ed901d0006bced4bnjn { BZ_SETERR(BZ_OK); return; }; 535286c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 535386c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 535486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 535586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 535686c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 535786c2349f3dd6574a20f58b31ed901d0006bced4bnjnvoid BZ_API(BZ2_bzWriteClose) 535886c2349f3dd6574a20f58b31ed901d0006bced4bnjn ( int* bzerror, 535986c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZFILE* b, 536086c2349f3dd6574a20f58b31ed901d0006bced4bnjn int abandon, 536186c2349f3dd6574a20f58b31ed901d0006bced4bnjn unsigned int* nbytes_in, 536286c2349f3dd6574a20f58b31ed901d0006bced4bnjn unsigned int* nbytes_out ) 536386c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 536486c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ2_bzWriteClose64 ( bzerror, b, abandon, 536586c2349f3dd6574a20f58b31ed901d0006bced4bnjn nbytes_in, NULL, nbytes_out, NULL ); 536686c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 536786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 536886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 536986c2349f3dd6574a20f58b31ed901d0006bced4bnjnvoid BZ_API(BZ2_bzWriteClose64) 537086c2349f3dd6574a20f58b31ed901d0006bced4bnjn ( int* bzerror, 537186c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZFILE* b, 537286c2349f3dd6574a20f58b31ed901d0006bced4bnjn int abandon, 537386c2349f3dd6574a20f58b31ed901d0006bced4bnjn unsigned int* nbytes_in_lo32, 537486c2349f3dd6574a20f58b31ed901d0006bced4bnjn unsigned int* nbytes_in_hi32, 537586c2349f3dd6574a20f58b31ed901d0006bced4bnjn unsigned int* nbytes_out_lo32, 537686c2349f3dd6574a20f58b31ed901d0006bced4bnjn unsigned int* nbytes_out_hi32 ) 537786c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 537886c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 n, n2, ret; 537986c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzFile* bzf = (bzFile*)b; 538086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 538186c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (bzf == NULL) 538286c2349f3dd6574a20f58b31ed901d0006bced4bnjn { BZ_SETERR(BZ_OK); return; }; 538386c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (!(bzf->writing)) 538486c2349f3dd6574a20f58b31ed901d0006bced4bnjn { BZ_SETERR(BZ_SEQUENCE_ERROR); return; }; 538586c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (ferror(bzf->handle)) 538686c2349f3dd6574a20f58b31ed901d0006bced4bnjn { BZ_SETERR(BZ_IO_ERROR); return; }; 538786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 538886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (nbytes_in_lo32 != NULL) *nbytes_in_lo32 = 0; 538986c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (nbytes_in_hi32 != NULL) *nbytes_in_hi32 = 0; 539086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (nbytes_out_lo32 != NULL) *nbytes_out_lo32 = 0; 539186c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (nbytes_out_hi32 != NULL) *nbytes_out_hi32 = 0; 539286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 539386c2349f3dd6574a20f58b31ed901d0006bced4bnjn if ((!abandon) && bzf->lastErr == BZ_OK) { 539486c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (True) { 539586c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzf->strm.avail_out = BZ_MAX_UNUSED; 539686c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzf->strm.next_out = bzf->buf; 539786c2349f3dd6574a20f58b31ed901d0006bced4bnjn ret = BZ2_bzCompress ( &(bzf->strm), BZ_FINISH ); 539886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (ret != BZ_FINISH_OK && ret != BZ_STREAM_END) 539986c2349f3dd6574a20f58b31ed901d0006bced4bnjn { BZ_SETERR(ret); return; }; 540086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 540186c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (bzf->strm.avail_out < BZ_MAX_UNUSED) { 540286c2349f3dd6574a20f58b31ed901d0006bced4bnjn n = BZ_MAX_UNUSED - bzf->strm.avail_out; 540386c2349f3dd6574a20f58b31ed901d0006bced4bnjn n2 = fwrite ( (void*)(bzf->buf), sizeof(UChar), 540486c2349f3dd6574a20f58b31ed901d0006bced4bnjn n, bzf->handle ); 540586c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (n != n2 || ferror(bzf->handle)) 540686c2349f3dd6574a20f58b31ed901d0006bced4bnjn { BZ_SETERR(BZ_IO_ERROR); return; }; 540786c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 540886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 540986c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (ret == BZ_STREAM_END) break; 541086c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 541186c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 541286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 541386c2349f3dd6574a20f58b31ed901d0006bced4bnjn if ( !abandon && !ferror ( bzf->handle ) ) { 541486c2349f3dd6574a20f58b31ed901d0006bced4bnjn fflush ( bzf->handle ); 541586c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (ferror(bzf->handle)) 541686c2349f3dd6574a20f58b31ed901d0006bced4bnjn { BZ_SETERR(BZ_IO_ERROR); return; }; 541786c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 541886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 541986c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (nbytes_in_lo32 != NULL) 542086c2349f3dd6574a20f58b31ed901d0006bced4bnjn *nbytes_in_lo32 = bzf->strm.total_in_lo32; 542186c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (nbytes_in_hi32 != NULL) 542286c2349f3dd6574a20f58b31ed901d0006bced4bnjn *nbytes_in_hi32 = bzf->strm.total_in_hi32; 542386c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (nbytes_out_lo32 != NULL) 542486c2349f3dd6574a20f58b31ed901d0006bced4bnjn *nbytes_out_lo32 = bzf->strm.total_out_lo32; 542586c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (nbytes_out_hi32 != NULL) 542686c2349f3dd6574a20f58b31ed901d0006bced4bnjn *nbytes_out_hi32 = bzf->strm.total_out_hi32; 542786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 542886c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_SETERR(BZ_OK); 542986c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ2_bzCompressEnd ( &(bzf->strm) ); 543086c2349f3dd6574a20f58b31ed901d0006bced4bnjn free ( bzf ); 543186c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 543286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 543386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 543486c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 543586c2349f3dd6574a20f58b31ed901d0006bced4bnjnBZFILE* BZ_API(BZ2_bzReadOpen) 543686c2349f3dd6574a20f58b31ed901d0006bced4bnjn ( int* bzerror, 543786c2349f3dd6574a20f58b31ed901d0006bced4bnjn FILE* f, 543886c2349f3dd6574a20f58b31ed901d0006bced4bnjn int verbosity, 543986c2349f3dd6574a20f58b31ed901d0006bced4bnjn int small, 544086c2349f3dd6574a20f58b31ed901d0006bced4bnjn void* unused, 544186c2349f3dd6574a20f58b31ed901d0006bced4bnjn int nUnused ) 544286c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 544386c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzFile* bzf = NULL; 544486c2349f3dd6574a20f58b31ed901d0006bced4bnjn int ret; 544586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 544686c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_SETERR(BZ_OK); 544786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 544886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (f == NULL || 544986c2349f3dd6574a20f58b31ed901d0006bced4bnjn (small != 0 && small != 1) || 545086c2349f3dd6574a20f58b31ed901d0006bced4bnjn (verbosity < 0 || verbosity > 4) || 545186c2349f3dd6574a20f58b31ed901d0006bced4bnjn (unused == NULL && nUnused != 0) || 545286c2349f3dd6574a20f58b31ed901d0006bced4bnjn (unused != NULL && (nUnused < 0 || nUnused > BZ_MAX_UNUSED))) 545386c2349f3dd6574a20f58b31ed901d0006bced4bnjn { BZ_SETERR(BZ_PARAM_ERROR); return NULL; }; 545486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 545586c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (ferror(f)) 545686c2349f3dd6574a20f58b31ed901d0006bced4bnjn { BZ_SETERR(BZ_IO_ERROR); return NULL; }; 545786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 545886c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzf = malloc ( sizeof(bzFile) ); 545986c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (bzf == NULL) 546086c2349f3dd6574a20f58b31ed901d0006bced4bnjn { BZ_SETERR(BZ_MEM_ERROR); return NULL; }; 546186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 546286c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_SETERR(BZ_OK); 546386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 546486c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzf->initialisedOk = False; 546586c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzf->handle = f; 546686c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzf->bufN = 0; 546786c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzf->writing = False; 546886c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzf->strm.bzalloc = NULL; 546986c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzf->strm.bzfree = NULL; 547086c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzf->strm.opaque = NULL; 547186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 547286c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (nUnused > 0) { 547386c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzf->buf[bzf->bufN] = *((UChar*)(unused)); bzf->bufN++; 547486c2349f3dd6574a20f58b31ed901d0006bced4bnjn unused = ((void*)( 1 + ((UChar*)(unused)) )); 547586c2349f3dd6574a20f58b31ed901d0006bced4bnjn nUnused--; 547686c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 547786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 547886c2349f3dd6574a20f58b31ed901d0006bced4bnjn ret = BZ2_bzDecompressInit ( &(bzf->strm), verbosity, small ); 547986c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (ret != BZ_OK) 548086c2349f3dd6574a20f58b31ed901d0006bced4bnjn { BZ_SETERR(ret); free(bzf); return NULL; }; 548186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 548286c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzf->strm.avail_in = bzf->bufN; 548386c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzf->strm.next_in = bzf->buf; 548486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 548586c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzf->initialisedOk = True; 548686c2349f3dd6574a20f58b31ed901d0006bced4bnjn return bzf; 548786c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 548886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 548986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 549086c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 549186c2349f3dd6574a20f58b31ed901d0006bced4bnjnvoid BZ_API(BZ2_bzReadClose) ( int *bzerror, BZFILE *b ) 549286c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 549386c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzFile* bzf = (bzFile*)b; 549486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 549586c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_SETERR(BZ_OK); 549686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (bzf == NULL) 549786c2349f3dd6574a20f58b31ed901d0006bced4bnjn { BZ_SETERR(BZ_OK); return; }; 549886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 549986c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (bzf->writing) 550086c2349f3dd6574a20f58b31ed901d0006bced4bnjn { BZ_SETERR(BZ_SEQUENCE_ERROR); return; }; 550186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 550286c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (bzf->initialisedOk) 550386c2349f3dd6574a20f58b31ed901d0006bced4bnjn (void)BZ2_bzDecompressEnd ( &(bzf->strm) ); 550486c2349f3dd6574a20f58b31ed901d0006bced4bnjn free ( bzf ); 550586c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 550686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 550786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 550886c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 550986c2349f3dd6574a20f58b31ed901d0006bced4bnjnint BZ_API(BZ2_bzRead) 551086c2349f3dd6574a20f58b31ed901d0006bced4bnjn ( int* bzerror, 551186c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZFILE* b, 551286c2349f3dd6574a20f58b31ed901d0006bced4bnjn void* buf, 551386c2349f3dd6574a20f58b31ed901d0006bced4bnjn int len ) 551486c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 551586c2349f3dd6574a20f58b31ed901d0006bced4bnjn Int32 n, ret; 551686c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzFile* bzf = (bzFile*)b; 551786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 551886c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_SETERR(BZ_OK); 551986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 552086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (bzf == NULL || buf == NULL || len < 0) 552186c2349f3dd6574a20f58b31ed901d0006bced4bnjn { BZ_SETERR(BZ_PARAM_ERROR); return 0; }; 552286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 552386c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (bzf->writing) 552486c2349f3dd6574a20f58b31ed901d0006bced4bnjn { BZ_SETERR(BZ_SEQUENCE_ERROR); return 0; }; 552586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 552686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (len == 0) 552786c2349f3dd6574a20f58b31ed901d0006bced4bnjn { BZ_SETERR(BZ_OK); return 0; }; 552886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 552986c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzf->strm.avail_out = len; 553086c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzf->strm.next_out = buf; 553186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 553286c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (True) { 553386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 553486c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (ferror(bzf->handle)) 553586c2349f3dd6574a20f58b31ed901d0006bced4bnjn { BZ_SETERR(BZ_IO_ERROR); return 0; }; 553686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 553786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (bzf->strm.avail_in == 0 && !myfeof(bzf->handle)) { 553886c2349f3dd6574a20f58b31ed901d0006bced4bnjn n = fread ( bzf->buf, sizeof(UChar), 553986c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_MAX_UNUSED, bzf->handle ); 554086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (ferror(bzf->handle)) 554186c2349f3dd6574a20f58b31ed901d0006bced4bnjn { BZ_SETERR(BZ_IO_ERROR); return 0; }; 554286c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzf->bufN = n; 554386c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzf->strm.avail_in = bzf->bufN; 554486c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzf->strm.next_in = bzf->buf; 554586c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 554686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 554786c2349f3dd6574a20f58b31ed901d0006bced4bnjn ret = BZ2_bzDecompress ( &(bzf->strm) ); 554886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 554986c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (ret != BZ_OK && ret != BZ_STREAM_END) 555086c2349f3dd6574a20f58b31ed901d0006bced4bnjn { BZ_SETERR(ret); return 0; }; 555186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 555286c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (ret == BZ_OK && myfeof(bzf->handle) && 555386c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzf->strm.avail_in == 0 && bzf->strm.avail_out > 0) 555486c2349f3dd6574a20f58b31ed901d0006bced4bnjn { BZ_SETERR(BZ_UNEXPECTED_EOF); return 0; }; 555586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 555686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (ret == BZ_STREAM_END) 555786c2349f3dd6574a20f58b31ed901d0006bced4bnjn { BZ_SETERR(BZ_STREAM_END); 555886c2349f3dd6574a20f58b31ed901d0006bced4bnjn return len - bzf->strm.avail_out; }; 555986c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (bzf->strm.avail_out == 0) 556086c2349f3dd6574a20f58b31ed901d0006bced4bnjn { BZ_SETERR(BZ_OK); return len; }; 556186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 556286c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 556386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 556486c2349f3dd6574a20f58b31ed901d0006bced4bnjn return 0; /*not reached*/ 556586c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 556686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 556786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 556886c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 556986c2349f3dd6574a20f58b31ed901d0006bced4bnjnvoid BZ_API(BZ2_bzReadGetUnused) 557086c2349f3dd6574a20f58b31ed901d0006bced4bnjn ( int* bzerror, 557186c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZFILE* b, 557286c2349f3dd6574a20f58b31ed901d0006bced4bnjn void** unused, 557386c2349f3dd6574a20f58b31ed901d0006bced4bnjn int* nUnused ) 557486c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 557586c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzFile* bzf = (bzFile*)b; 557686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (bzf == NULL) 557786c2349f3dd6574a20f58b31ed901d0006bced4bnjn { BZ_SETERR(BZ_PARAM_ERROR); return; }; 557886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (bzf->lastErr != BZ_STREAM_END) 557986c2349f3dd6574a20f58b31ed901d0006bced4bnjn { BZ_SETERR(BZ_SEQUENCE_ERROR); return; }; 558086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (unused == NULL || nUnused == NULL) 558186c2349f3dd6574a20f58b31ed901d0006bced4bnjn { BZ_SETERR(BZ_PARAM_ERROR); return; }; 558286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 558386c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ_SETERR(BZ_OK); 558486c2349f3dd6574a20f58b31ed901d0006bced4bnjn *nUnused = bzf->strm.avail_in; 558586c2349f3dd6574a20f58b31ed901d0006bced4bnjn *unused = bzf->strm.next_in; 558686c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 558786c2349f3dd6574a20f58b31ed901d0006bced4bnjn#endif 558886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 558986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 559086c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 559186c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*--- Misc convenience stuff ---*/ 559286c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 559386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 559486c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 559586c2349f3dd6574a20f58b31ed901d0006bced4bnjnint BZ_API(BZ2_bzBuffToBuffCompress) 559686c2349f3dd6574a20f58b31ed901d0006bced4bnjn ( char* dest, 559786c2349f3dd6574a20f58b31ed901d0006bced4bnjn unsigned int* destLen, 559886c2349f3dd6574a20f58b31ed901d0006bced4bnjn char* source, 559986c2349f3dd6574a20f58b31ed901d0006bced4bnjn unsigned int sourceLen, 560086c2349f3dd6574a20f58b31ed901d0006bced4bnjn int blockSize100k, 560186c2349f3dd6574a20f58b31ed901d0006bced4bnjn int verbosity, 560286c2349f3dd6574a20f58b31ed901d0006bced4bnjn int workFactor ) 560386c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 560486c2349f3dd6574a20f58b31ed901d0006bced4bnjn bz_stream strm; 560586c2349f3dd6574a20f58b31ed901d0006bced4bnjn int ret; 560686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 560786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (dest == NULL || destLen == NULL || 560886c2349f3dd6574a20f58b31ed901d0006bced4bnjn source == NULL || 560986c2349f3dd6574a20f58b31ed901d0006bced4bnjn blockSize100k < 1 || blockSize100k > 9 || 561086c2349f3dd6574a20f58b31ed901d0006bced4bnjn verbosity < 0 || verbosity > 4 || 561186c2349f3dd6574a20f58b31ed901d0006bced4bnjn workFactor < 0 || workFactor > 250) 561286c2349f3dd6574a20f58b31ed901d0006bced4bnjn return BZ_PARAM_ERROR; 561386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 561486c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (workFactor == 0) workFactor = 30; 561586c2349f3dd6574a20f58b31ed901d0006bced4bnjn strm.bzalloc = NULL; 561686c2349f3dd6574a20f58b31ed901d0006bced4bnjn strm.bzfree = NULL; 561786c2349f3dd6574a20f58b31ed901d0006bced4bnjn strm.opaque = NULL; 561886c2349f3dd6574a20f58b31ed901d0006bced4bnjn ret = BZ2_bzCompressInit ( &strm, blockSize100k, 561986c2349f3dd6574a20f58b31ed901d0006bced4bnjn verbosity, workFactor ); 562086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (ret != BZ_OK) return ret; 562186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 562286c2349f3dd6574a20f58b31ed901d0006bced4bnjn strm.next_in = source; 562386c2349f3dd6574a20f58b31ed901d0006bced4bnjn strm.next_out = dest; 562486c2349f3dd6574a20f58b31ed901d0006bced4bnjn strm.avail_in = sourceLen; 562586c2349f3dd6574a20f58b31ed901d0006bced4bnjn strm.avail_out = *destLen; 562686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 562786c2349f3dd6574a20f58b31ed901d0006bced4bnjn ret = BZ2_bzCompress ( &strm, BZ_FINISH ); 562886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (ret == BZ_FINISH_OK) goto output_overflow; 562986c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (ret != BZ_STREAM_END) goto errhandler; 563086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 563186c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* normal termination */ 563286c2349f3dd6574a20f58b31ed901d0006bced4bnjn *destLen -= strm.avail_out; 563386c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ2_bzCompressEnd ( &strm ); 563486c2349f3dd6574a20f58b31ed901d0006bced4bnjn return BZ_OK; 563586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 563686c2349f3dd6574a20f58b31ed901d0006bced4bnjn output_overflow: 563786c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ2_bzCompressEnd ( &strm ); 563886c2349f3dd6574a20f58b31ed901d0006bced4bnjn return BZ_OUTBUFF_FULL; 563986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 564086c2349f3dd6574a20f58b31ed901d0006bced4bnjn errhandler: 564186c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ2_bzCompressEnd ( &strm ); 564286c2349f3dd6574a20f58b31ed901d0006bced4bnjn return ret; 564386c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 564486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 564586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 564686c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 564786c2349f3dd6574a20f58b31ed901d0006bced4bnjnint BZ_API(BZ2_bzBuffToBuffDecompress) 564886c2349f3dd6574a20f58b31ed901d0006bced4bnjn ( char* dest, 564986c2349f3dd6574a20f58b31ed901d0006bced4bnjn unsigned int* destLen, 565086c2349f3dd6574a20f58b31ed901d0006bced4bnjn char* source, 565186c2349f3dd6574a20f58b31ed901d0006bced4bnjn unsigned int sourceLen, 565286c2349f3dd6574a20f58b31ed901d0006bced4bnjn int small, 565386c2349f3dd6574a20f58b31ed901d0006bced4bnjn int verbosity ) 565486c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 565586c2349f3dd6574a20f58b31ed901d0006bced4bnjn bz_stream strm; 565686c2349f3dd6574a20f58b31ed901d0006bced4bnjn int ret; 565786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 565886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (dest == NULL || destLen == NULL || 565986c2349f3dd6574a20f58b31ed901d0006bced4bnjn source == NULL || 566086c2349f3dd6574a20f58b31ed901d0006bced4bnjn (small != 0 && small != 1) || 566186c2349f3dd6574a20f58b31ed901d0006bced4bnjn verbosity < 0 || verbosity > 4) 566286c2349f3dd6574a20f58b31ed901d0006bced4bnjn return BZ_PARAM_ERROR; 566386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 566486c2349f3dd6574a20f58b31ed901d0006bced4bnjn strm.bzalloc = NULL; 566586c2349f3dd6574a20f58b31ed901d0006bced4bnjn strm.bzfree = NULL; 566686c2349f3dd6574a20f58b31ed901d0006bced4bnjn strm.opaque = NULL; 566786c2349f3dd6574a20f58b31ed901d0006bced4bnjn ret = BZ2_bzDecompressInit ( &strm, verbosity, small ); 566886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (ret != BZ_OK) return ret; 566986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 567086c2349f3dd6574a20f58b31ed901d0006bced4bnjn strm.next_in = source; 567186c2349f3dd6574a20f58b31ed901d0006bced4bnjn strm.next_out = dest; 567286c2349f3dd6574a20f58b31ed901d0006bced4bnjn strm.avail_in = sourceLen; 567386c2349f3dd6574a20f58b31ed901d0006bced4bnjn strm.avail_out = *destLen; 567486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 567586c2349f3dd6574a20f58b31ed901d0006bced4bnjn ret = BZ2_bzDecompress ( &strm ); 567686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (ret == BZ_OK) goto output_overflow_or_eof; 567786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (ret != BZ_STREAM_END) goto errhandler; 567886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 567986c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* normal termination */ 568086c2349f3dd6574a20f58b31ed901d0006bced4bnjn *destLen -= strm.avail_out; 568186c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ2_bzDecompressEnd ( &strm ); 568286c2349f3dd6574a20f58b31ed901d0006bced4bnjn return BZ_OK; 568386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 568486c2349f3dd6574a20f58b31ed901d0006bced4bnjn output_overflow_or_eof: 568586c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (strm.avail_out > 0) { 568686c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ2_bzDecompressEnd ( &strm ); 568786c2349f3dd6574a20f58b31ed901d0006bced4bnjn return BZ_UNEXPECTED_EOF; 568886c2349f3dd6574a20f58b31ed901d0006bced4bnjn } else { 568986c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ2_bzDecompressEnd ( &strm ); 569086c2349f3dd6574a20f58b31ed901d0006bced4bnjn return BZ_OUTBUFF_FULL; 569186c2349f3dd6574a20f58b31ed901d0006bced4bnjn }; 569286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 569386c2349f3dd6574a20f58b31ed901d0006bced4bnjn errhandler: 569486c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ2_bzDecompressEnd ( &strm ); 569586c2349f3dd6574a20f58b31ed901d0006bced4bnjn return ret; 569686c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 569786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 569886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 569986c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 570086c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-- 570186c2349f3dd6574a20f58b31ed901d0006bced4bnjn Code contributed by Yoshioka Tsuneo 570286c2349f3dd6574a20f58b31ed901d0006bced4bnjn (QWF00133@niftyserve.or.jp/tsuneo-y@is.aist-nara.ac.jp), 570386c2349f3dd6574a20f58b31ed901d0006bced4bnjn to support better zlib compatibility. 570486c2349f3dd6574a20f58b31ed901d0006bced4bnjn This code is not _officially_ part of libbzip2 (yet); 570586c2349f3dd6574a20f58b31ed901d0006bced4bnjn I haven't tested it, documented it, or considered the 570686c2349f3dd6574a20f58b31ed901d0006bced4bnjn threading-safeness of it. 570786c2349f3dd6574a20f58b31ed901d0006bced4bnjn If this code breaks, please contact both Yoshioka and me. 570886c2349f3dd6574a20f58b31ed901d0006bced4bnjn--*/ 570986c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 571086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 571186c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 571286c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-- 571386c2349f3dd6574a20f58b31ed901d0006bced4bnjn return version like "0.9.0c". 571486c2349f3dd6574a20f58b31ed901d0006bced4bnjn--*/ 571586c2349f3dd6574a20f58b31ed901d0006bced4bnjnconst char * BZ_API(BZ2_bzlibVersion)(void) 571686c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 571786c2349f3dd6574a20f58b31ed901d0006bced4bnjn return BZ_VERSION; 571886c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 571986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 572086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 572186c2349f3dd6574a20f58b31ed901d0006bced4bnjn#ifndef BZ_NO_STDIO 572286c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 572386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 572486c2349f3dd6574a20f58b31ed901d0006bced4bnjn#if defined(_WIN32) || defined(OS2) || defined(MSDOS) 572586c2349f3dd6574a20f58b31ed901d0006bced4bnjn# include <fcntl.h> 572686c2349f3dd6574a20f58b31ed901d0006bced4bnjn# include <io.h> 572786c2349f3dd6574a20f58b31ed901d0006bced4bnjn# define SET_BINARY_MODE(file) setmode(fileno(file),O_BINARY) 572886c2349f3dd6574a20f58b31ed901d0006bced4bnjn#else 572986c2349f3dd6574a20f58b31ed901d0006bced4bnjn# define SET_BINARY_MODE(file) 573086c2349f3dd6574a20f58b31ed901d0006bced4bnjn#endif 573186c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic 573286c2349f3dd6574a20f58b31ed901d0006bced4bnjnBZFILE * bzopen_or_bzdopen 573386c2349f3dd6574a20f58b31ed901d0006bced4bnjn ( const char *path, /* no use when bzdopen */ 573486c2349f3dd6574a20f58b31ed901d0006bced4bnjn int fd, /* no use when bzdopen */ 573586c2349f3dd6574a20f58b31ed901d0006bced4bnjn const char *mode, 573686c2349f3dd6574a20f58b31ed901d0006bced4bnjn int open_mode) /* bzopen: 0, bzdopen:1 */ 573786c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 573886c2349f3dd6574a20f58b31ed901d0006bced4bnjn int bzerr; 573986c2349f3dd6574a20f58b31ed901d0006bced4bnjn char unused[BZ_MAX_UNUSED]; 574086c2349f3dd6574a20f58b31ed901d0006bced4bnjn int blockSize100k = 9; 574186c2349f3dd6574a20f58b31ed901d0006bced4bnjn int writing = 0; 574286c2349f3dd6574a20f58b31ed901d0006bced4bnjn char mode2[10] = ""; 574386c2349f3dd6574a20f58b31ed901d0006bced4bnjn FILE *fp = NULL; 574486c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZFILE *bzfp = NULL; 574586c2349f3dd6574a20f58b31ed901d0006bced4bnjn int verbosity = 0; 574686c2349f3dd6574a20f58b31ed901d0006bced4bnjn int workFactor = 30; 574786c2349f3dd6574a20f58b31ed901d0006bced4bnjn int smallMode = 0; 574886c2349f3dd6574a20f58b31ed901d0006bced4bnjn int nUnused = 0; 574986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 575086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (mode == NULL) return NULL; 575186c2349f3dd6574a20f58b31ed901d0006bced4bnjn while (*mode) { 575286c2349f3dd6574a20f58b31ed901d0006bced4bnjn switch (*mode) { 575386c2349f3dd6574a20f58b31ed901d0006bced4bnjn case 'r': 575486c2349f3dd6574a20f58b31ed901d0006bced4bnjn writing = 0; break; 575586c2349f3dd6574a20f58b31ed901d0006bced4bnjn case 'w': 575686c2349f3dd6574a20f58b31ed901d0006bced4bnjn writing = 1; break; 575786c2349f3dd6574a20f58b31ed901d0006bced4bnjn case 's': 575886c2349f3dd6574a20f58b31ed901d0006bced4bnjn smallMode = 1; break; 575986c2349f3dd6574a20f58b31ed901d0006bced4bnjn default: 576086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (isdigit((int)(*mode))) { 576186c2349f3dd6574a20f58b31ed901d0006bced4bnjn blockSize100k = *mode-BZ_HDR_0; 576286c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 576386c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 576486c2349f3dd6574a20f58b31ed901d0006bced4bnjn mode++; 576586c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 576686c2349f3dd6574a20f58b31ed901d0006bced4bnjn strcat(mode2, writing ? "w" : "r" ); 576786c2349f3dd6574a20f58b31ed901d0006bced4bnjn strcat(mode2,"b"); /* binary mode */ 576886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 576986c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (open_mode==0) { 577086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (path==NULL || strcmp(path,"")==0) { 577186c2349f3dd6574a20f58b31ed901d0006bced4bnjn fp = (writing ? stdout : stdin); 577286c2349f3dd6574a20f58b31ed901d0006bced4bnjn SET_BINARY_MODE(fp); 577386c2349f3dd6574a20f58b31ed901d0006bced4bnjn } else { 577486c2349f3dd6574a20f58b31ed901d0006bced4bnjn fp = fopen(path,mode2); 577586c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 577686c2349f3dd6574a20f58b31ed901d0006bced4bnjn } else { 577786c2349f3dd6574a20f58b31ed901d0006bced4bnjn#ifdef BZ_STRICT_ANSI 577886c2349f3dd6574a20f58b31ed901d0006bced4bnjn fp = NULL; 577986c2349f3dd6574a20f58b31ed901d0006bced4bnjn#else 578086c2349f3dd6574a20f58b31ed901d0006bced4bnjn fp = fdopen(fd,mode2); 578186c2349f3dd6574a20f58b31ed901d0006bced4bnjn#endif 578286c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 578386c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (fp == NULL) return NULL; 578486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 578586c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (writing) { 578686c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* Guard against total chaos and anarchy -- JRS */ 578786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (blockSize100k < 1) blockSize100k = 1; 578886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (blockSize100k > 9) blockSize100k = 9; 578986c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzfp = BZ2_bzWriteOpen(&bzerr,fp,blockSize100k, 579086c2349f3dd6574a20f58b31ed901d0006bced4bnjn verbosity,workFactor); 579186c2349f3dd6574a20f58b31ed901d0006bced4bnjn } else { 579286c2349f3dd6574a20f58b31ed901d0006bced4bnjn bzfp = BZ2_bzReadOpen(&bzerr,fp,verbosity,smallMode, 579386c2349f3dd6574a20f58b31ed901d0006bced4bnjn unused,nUnused); 579486c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 579586c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (bzfp == NULL) { 579686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (fp != stdin && fp != stdout) fclose(fp); 579786c2349f3dd6574a20f58b31ed901d0006bced4bnjn return NULL; 579886c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 579986c2349f3dd6574a20f58b31ed901d0006bced4bnjn return bzfp; 580086c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 580186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 580286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 580386c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 580486c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-- 580586c2349f3dd6574a20f58b31ed901d0006bced4bnjn open file for read or write. 580686c2349f3dd6574a20f58b31ed901d0006bced4bnjn ex) bzopen("file","w9") 580786c2349f3dd6574a20f58b31ed901d0006bced4bnjn case path="" or NULL => use stdin or stdout. 580886c2349f3dd6574a20f58b31ed901d0006bced4bnjn--*/ 580986c2349f3dd6574a20f58b31ed901d0006bced4bnjnBZFILE * BZ_API(BZ2_bzopen) 581086c2349f3dd6574a20f58b31ed901d0006bced4bnjn ( const char *path, 581186c2349f3dd6574a20f58b31ed901d0006bced4bnjn const char *mode ) 581286c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 581386c2349f3dd6574a20f58b31ed901d0006bced4bnjn return bzopen_or_bzdopen(path,-1,mode,/*bzopen*/0); 581486c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 581586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 581686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 581786c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 581886c2349f3dd6574a20f58b31ed901d0006bced4bnjnBZFILE * BZ_API(BZ2_bzdopen) 581986c2349f3dd6574a20f58b31ed901d0006bced4bnjn ( int fd, 582086c2349f3dd6574a20f58b31ed901d0006bced4bnjn const char *mode ) 582186c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 582286c2349f3dd6574a20f58b31ed901d0006bced4bnjn return bzopen_or_bzdopen(NULL,fd,mode,/*bzdopen*/1); 582386c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 582486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 582586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 582686c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 582786c2349f3dd6574a20f58b31ed901d0006bced4bnjnint BZ_API(BZ2_bzread) (BZFILE* b, void* buf, int len ) 582886c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 582986c2349f3dd6574a20f58b31ed901d0006bced4bnjn int bzerr, nread; 583086c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (((bzFile*)b)->lastErr == BZ_STREAM_END) return 0; 583186c2349f3dd6574a20f58b31ed901d0006bced4bnjn nread = BZ2_bzRead(&bzerr,b,buf,len); 583286c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (bzerr == BZ_OK || bzerr == BZ_STREAM_END) { 583386c2349f3dd6574a20f58b31ed901d0006bced4bnjn return nread; 583486c2349f3dd6574a20f58b31ed901d0006bced4bnjn } else { 583586c2349f3dd6574a20f58b31ed901d0006bced4bnjn return -1; 583686c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 583786c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 583886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 583986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 584086c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 584186c2349f3dd6574a20f58b31ed901d0006bced4bnjnint BZ_API(BZ2_bzwrite) (BZFILE* b, void* buf, int len ) 584286c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 584386c2349f3dd6574a20f58b31ed901d0006bced4bnjn int bzerr; 584486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 584586c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ2_bzWrite(&bzerr,b,buf,len); 584686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if(bzerr == BZ_OK){ 584786c2349f3dd6574a20f58b31ed901d0006bced4bnjn return len; 584886c2349f3dd6574a20f58b31ed901d0006bced4bnjn }else{ 584986c2349f3dd6574a20f58b31ed901d0006bced4bnjn return -1; 585086c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 585186c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 585286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 585386c2349f3dd6574a20f58b31ed901d0006bced4bnjn 585486c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 585586c2349f3dd6574a20f58b31ed901d0006bced4bnjnint BZ_API(BZ2_bzflush) (BZFILE *b) 585686c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 585786c2349f3dd6574a20f58b31ed901d0006bced4bnjn /* do nothing now... */ 585886c2349f3dd6574a20f58b31ed901d0006bced4bnjn return 0; 585986c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 586086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 586186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 586286c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 586386c2349f3dd6574a20f58b31ed901d0006bced4bnjnvoid BZ_API(BZ2_bzclose) (BZFILE* b) 586486c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 586586c2349f3dd6574a20f58b31ed901d0006bced4bnjn int bzerr; 586686c2349f3dd6574a20f58b31ed901d0006bced4bnjn FILE *fp = ((bzFile *)b)->handle; 586786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 586886c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (b==NULL) {return;} 586986c2349f3dd6574a20f58b31ed901d0006bced4bnjn if(((bzFile*)b)->writing){ 587086c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ2_bzWriteClose(&bzerr,b,0,NULL,NULL); 587186c2349f3dd6574a20f58b31ed901d0006bced4bnjn if(bzerr != BZ_OK){ 587286c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ2_bzWriteClose(NULL,b,1,NULL,NULL); 587386c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 587486c2349f3dd6574a20f58b31ed901d0006bced4bnjn }else{ 587586c2349f3dd6574a20f58b31ed901d0006bced4bnjn BZ2_bzReadClose(&bzerr,b); 587686c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 587786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if(fp!=stdin && fp!=stdout){ 587886c2349f3dd6574a20f58b31ed901d0006bced4bnjn fclose(fp); 587986c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 588086c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 588186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 588286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 588386c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*---------------------------------------------------*/ 588486c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-- 588586c2349f3dd6574a20f58b31ed901d0006bced4bnjn return last error code 588686c2349f3dd6574a20f58b31ed901d0006bced4bnjn--*/ 588786c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic char *bzerrorstrings[] = { 588886c2349f3dd6574a20f58b31ed901d0006bced4bnjn "OK" 588986c2349f3dd6574a20f58b31ed901d0006bced4bnjn ,"SEQUENCE_ERROR" 589086c2349f3dd6574a20f58b31ed901d0006bced4bnjn ,"PARAM_ERROR" 589186c2349f3dd6574a20f58b31ed901d0006bced4bnjn ,"MEM_ERROR" 589286c2349f3dd6574a20f58b31ed901d0006bced4bnjn ,"DATA_ERROR" 589386c2349f3dd6574a20f58b31ed901d0006bced4bnjn ,"DATA_ERROR_MAGIC" 589486c2349f3dd6574a20f58b31ed901d0006bced4bnjn ,"IO_ERROR" 589586c2349f3dd6574a20f58b31ed901d0006bced4bnjn ,"UNEXPECTED_EOF" 589686c2349f3dd6574a20f58b31ed901d0006bced4bnjn ,"OUTBUFF_FULL" 589786c2349f3dd6574a20f58b31ed901d0006bced4bnjn ,"CONFIG_ERROR" 589886c2349f3dd6574a20f58b31ed901d0006bced4bnjn ,"???" /* for future */ 589986c2349f3dd6574a20f58b31ed901d0006bced4bnjn ,"???" /* for future */ 590086c2349f3dd6574a20f58b31ed901d0006bced4bnjn ,"???" /* for future */ 590186c2349f3dd6574a20f58b31ed901d0006bced4bnjn ,"???" /* for future */ 590286c2349f3dd6574a20f58b31ed901d0006bced4bnjn ,"???" /* for future */ 590386c2349f3dd6574a20f58b31ed901d0006bced4bnjn ,"???" /* for future */ 590486c2349f3dd6574a20f58b31ed901d0006bced4bnjn}; 590586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 590686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 590786c2349f3dd6574a20f58b31ed901d0006bced4bnjnconst char * BZ_API(BZ2_bzerror) (BZFILE *b, int *errnum) 590886c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 590986c2349f3dd6574a20f58b31ed901d0006bced4bnjn int err = ((bzFile *)b)->lastErr; 591086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 591186c2349f3dd6574a20f58b31ed901d0006bced4bnjn if(err>0) err = 0; 591286c2349f3dd6574a20f58b31ed901d0006bced4bnjn *errnum = err; 591386c2349f3dd6574a20f58b31ed901d0006bced4bnjn return bzerrorstrings[err*-1]; 591486c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 591586c2349f3dd6574a20f58b31ed901d0006bced4bnjn#endif 591686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 591786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 591886c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-------------------------------------------------------------*/ 591986c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*--- end bzlib.c ---*/ 592086c2349f3dd6574a20f58b31ed901d0006bced4bnjn/*-------------------------------------------------------------*/ 592186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 592286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 592386c2349f3dd6574a20f58b31ed901d0006bced4bnjn///////////////////////////////////////////////////////////////////// 592486c2349f3dd6574a20f58b31ed901d0006bced4bnjn///////////////////////////////////////////////////////////////////// 592586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 592686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 592786c2349f3dd6574a20f58b31ed901d0006bced4bnjn/* A test program written to test robustness to decompression of 592886c2349f3dd6574a20f58b31ed901d0006bced4bnjn corrupted data. Usage is 592986c2349f3dd6574a20f58b31ed901d0006bced4bnjn unzcrash filename 593086c2349f3dd6574a20f58b31ed901d0006bced4bnjn and the program will read the specified file, compress it (in memory), 593186c2349f3dd6574a20f58b31ed901d0006bced4bnjn and then repeatedly decompress it, each time with a different bit of 593286c2349f3dd6574a20f58b31ed901d0006bced4bnjn the compressed data inverted, so as to test all possible one-bit errors. 593386c2349f3dd6574a20f58b31ed901d0006bced4bnjn This should not cause any invalid memory accesses. If it does, 593486c2349f3dd6574a20f58b31ed901d0006bced4bnjn I want to know about it! 593586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 593686c2349f3dd6574a20f58b31ed901d0006bced4bnjn p.s. As you can see from the above description, the process is 593786c2349f3dd6574a20f58b31ed901d0006bced4bnjn incredibly slow. A file of size eg 5KB will cause it to run for 593886c2349f3dd6574a20f58b31ed901d0006bced4bnjn many hours. 593986c2349f3dd6574a20f58b31ed901d0006bced4bnjn*/ 594086c2349f3dd6574a20f58b31ed901d0006bced4bnjn 594186c2349f3dd6574a20f58b31ed901d0006bced4bnjn//#include <stdio.h> 594286c2349f3dd6574a20f58b31ed901d0006bced4bnjn//#include <assert.h> 594386c2349f3dd6574a20f58b31ed901d0006bced4bnjn//#include "bzlib.h" 594486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 594586c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define M_BLOCK 1000000 594686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 594786c2349f3dd6574a20f58b31ed901d0006bced4bnjn 594886c2349f3dd6574a20f58b31ed901d0006bced4bnjn#define M_BLOCK_OUT (M_BLOCK + 1000000) 594986c2349f3dd6574a20f58b31ed901d0006bced4bnjn char inbuf[M_BLOCK]; 595086c2349f3dd6574a20f58b31ed901d0006bced4bnjn char outbuf[M_BLOCK_OUT]; 595186c2349f3dd6574a20f58b31ed901d0006bced4bnjn char zbuf[M_BLOCK + 600 + (M_BLOCK / 100)]; 595286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 595386c2349f3dd6574a20f58b31ed901d0006bced4bnjnint nIn; 595486c2349f3dd6574a20f58b31ed901d0006bced4bnjnunsigned int nOut; 595586c2349f3dd6574a20f58b31ed901d0006bced4bnjnunsigned int nZ; 595686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 595786c2349f3dd6574a20f58b31ed901d0006bced4bnjn#if 0 595886c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic char *bzerrorstrings[] = { 595986c2349f3dd6574a20f58b31ed901d0006bced4bnjn "OK" 596086c2349f3dd6574a20f58b31ed901d0006bced4bnjn ,"SEQUENCE_ERROR" 596186c2349f3dd6574a20f58b31ed901d0006bced4bnjn ,"PARAM_ERROR" 596286c2349f3dd6574a20f58b31ed901d0006bced4bnjn ,"MEM_ERROR" 596386c2349f3dd6574a20f58b31ed901d0006bced4bnjn ,"DATA_ERROR" 596486c2349f3dd6574a20f58b31ed901d0006bced4bnjn ,"DATA_ERROR_MAGIC" 596586c2349f3dd6574a20f58b31ed901d0006bced4bnjn ,"IO_ERROR" 596686c2349f3dd6574a20f58b31ed901d0006bced4bnjn ,"UNEXPECTED_EOF" 596786c2349f3dd6574a20f58b31ed901d0006bced4bnjn ,"OUTBUFF_FULL" 596886c2349f3dd6574a20f58b31ed901d0006bced4bnjn ,"???" /* for future */ 596986c2349f3dd6574a20f58b31ed901d0006bced4bnjn ,"???" /* for future */ 597086c2349f3dd6574a20f58b31ed901d0006bced4bnjn ,"???" /* for future */ 597186c2349f3dd6574a20f58b31ed901d0006bced4bnjn ,"???" /* for future */ 597286c2349f3dd6574a20f58b31ed901d0006bced4bnjn ,"???" /* for future */ 597386c2349f3dd6574a20f58b31ed901d0006bced4bnjn ,"???" /* for future */ 597486c2349f3dd6574a20f58b31ed901d0006bced4bnjn}; 597586c2349f3dd6574a20f58b31ed901d0006bced4bnjn#endif 597686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 597786c2349f3dd6574a20f58b31ed901d0006bced4bnjnvoid flip_bit ( int bit ) 597886c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 597986c2349f3dd6574a20f58b31ed901d0006bced4bnjn int byteno = bit / 8; 598086c2349f3dd6574a20f58b31ed901d0006bced4bnjn int bitno = bit % 8; 5981cd030b59fd308ea5450bb1209ba18efc4c84f295sewardj UChar mask = 1 << bitno; 598286c2349f3dd6574a20f58b31ed901d0006bced4bnjn //fprintf ( stderr, "(byte %d bit %d mask %d)", 598386c2349f3dd6574a20f58b31ed901d0006bced4bnjn // byteno, bitno, (int)mask ); 598486c2349f3dd6574a20f58b31ed901d0006bced4bnjn zbuf[byteno] ^= mask; 598586c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 598686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 598786c2349f3dd6574a20f58b31ed901d0006bced4bnjnvoid set_inbuf ( void ) 598886c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 598986c2349f3dd6574a20f58b31ed901d0006bced4bnjn inbuf[0] = 0; 599086c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "At her sixtieth birthday party, Margaret Thatcher "); 599186c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "blew on the cake to light the candles.\n"); 599286c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "This program, bzip2, the associated library libbzip2, and all\n"); 599386c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "documentation, are copyright (C) 1996-2004 Julian R Seward. All\n"); 599486c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "rights reserved.\n"); 599586c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 599686c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "Redistribution and use in source and binary forms, with or without\n"); 599786c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "modification, are permitted provided that the following conditions\n"); 599886c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "are met:\n"); 599986c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 600086c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "1. Redistributions of source code must retain the above copyright\n"); 600186c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " notice, this list of conditions and the following disclaimer.\n"); 600286c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 600386c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "2. The origin of this software must not be misrepresented; you must\n"); 600486c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " not claim that you wrote the original software. If you use this\n"); 600586c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " software in a product, an acknowledgment in the product\n"); 600686c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " documentation would be appreciated but is not required.\n"); 600786c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 600886c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "3. Altered source versions must be plainly marked as such, and must\n"); 600986c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " not be misrepresented as being the original software.\n"); 601086c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 601186c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "4. The name of the author may not be used to endorse or promote\n"); 601286c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " products derived from this software without specific prior written\n"); 601386c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " permission.\n"); 601486c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 601586c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS\n"); 601686c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n"); 601786c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n"); 601886c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY\n"); 601986c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n"); 602086c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\n"); 602186c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n"); 602286c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n"); 602386c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n"); 602486c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n"); 602586c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"); 602686c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 602786c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 602886c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 602986c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 603086c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 603186c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 603286c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 603386c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 603486c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 603586c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 603686c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 603786c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 603886c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 603986c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 604086c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 604186c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 604286c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 604386c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 604486c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 604586c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 604686c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 604786c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 604886c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 604986c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 605086c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 605186c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 605286c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 605386c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 605486c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 605586c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 605686c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 605786c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 605886c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 605986c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 606086c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 606186c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 606286c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 606386c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 606486c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 606586c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 606686c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 606786c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "ababababababababababababababababababababababababababababababab"); 606886c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " GNU GENERAL PUBLIC LICENSE\n"); 606986c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " Version 2, June 1991\n"); 607086c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 607186c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " Copyright (C) 1989, 1991 Free Software Foundation, Inc.\n"); 607286c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n"); 607386c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " Everyone is permitted to copy and distribute verbatim copies\n"); 607486c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " of this license document, but changing it is not allowed.\n"); 607586c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 607686c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " Preamble\n"); 607786c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 607886c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " The licenses for most software are designed to take away your\n"); 607986c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "freedom to share and change it. By contrast, the GNU General Public\n"); 608086c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "License is intended to guarantee your freedom to share and change free\n"); 608186c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "software--to make sure the software is free for all its users. This\n"); 608286c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "General Public License applies to most of the Free Software\n"); 608386c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "Foundation's software and to any other program whose authors commit to\n"); 608486c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "using it. (Some other Free Software Foundation software is covered by\n"); 608586c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "the GNU Library General Public License instead.) You can apply it to\n"); 608686c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "your programs, too.\n"); 608786c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 608886c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " When we speak of free software, we are referring to freedom, not\n"); 608986c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "price. Our General Public Licenses are designed to make sure that you\n"); 609086c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "have the freedom to distribute copies of free software (and charge for\n"); 609186c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "this service if you wish), that you receive source code or can get it\n"); 609286c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "if you want it, that you can change the software or use pieces of it\n"); 609386c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "in new free programs; and that you know you can do these things.\n"); 609486c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 609586c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " To protect your rights, we need to make restrictions that forbid\n"); 609686c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "anyone to deny you these rights or to ask you to surrender the rights.\n"); 609786c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "These restrictions translate to certain responsibilities for you if you\n"); 609886c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "distribute copies of the software, or if you modify it.\n"); 609986c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 610086c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " For example, if you distribute copies of such a program, whether\n"); 610186c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "gratis or for a fee, you must give the recipients all the rights that\n"); 610286c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "you have. You must make sure that they, too, receive or can get the\n"); 610386c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "source code. And you must show them these terms so they know their\n"); 610486c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "rights.\n"); 610586c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 610686c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " We protect your rights with two steps: (1) copyright the software, and\n"); 610786c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "(2) offer you this license which gives you legal permission to copy,\n"); 610886c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "distribute and/or modify the software.\n"); 610986c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 611086c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " Also, for each author's protection and ours, we want to make certain\n"); 611186c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "that everyone understands that there is no warranty for this free\n"); 611286c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "software. If the software is modified by someone else and passed on, we\n"); 611386c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "want its recipients to know that what they have is not the original, so\n"); 611486c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "that any problems introduced by others will not reflect on the original\n"); 611586c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "authors' reputations.\n"); 611686c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 611786c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " Finally, any free program is threatened constantly by software\n"); 611886c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "patents. We wish to avoid the danger that redistributors of a free\n"); 611986c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "program will individually obtain patent licenses, in effect making the\n"); 612086c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "program proprietary. To prevent this, we have made it clear that any\n"); 612186c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "patent must be licensed for everyone's free use or not licensed at all.\n"); 612286c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 612386c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " The precise terms and conditions for copying, distribution and\n"); 612486c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "modification follow.\n"); 612586c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 612686c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " GNU GENERAL PUBLIC LICENSE\n"); 612786c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n"); 612886c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 612986c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " 0. This License applies to any program or other work which contains\n"); 613086c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "a notice placed by the copyright holder saying it may be distributed\n"); 613186c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "under the terms of this General Public License. The Program, below,\n"); 613286c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "refers to any such program or work, and a work based on the Program\n"); 613386c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "means either the Program or any derivative work under copyright law:\n"); 613486c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "that is to say, a work containing the Program or a portion of it,\n"); 613586c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "either verbatim or with modifications and/or translated into another\n"); 613686c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "language. (Hereinafter, translation is included without limitation in\n"); 613786c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "the term modification.) Each licensee is addressed as you.\n"); 613886c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 613986c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "Activities other than copying, distribution and modification are not\n"); 614086c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "covered by this License; they are outside its scope. The act of\n"); 614186c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "running the Program is not restricted, and the output from the Program\n"); 614286c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "is covered only if its contents constitute a work based on the\n"); 614386c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "Program (independent of having been made by running the Program).\n"); 614486c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "Whether that is true depends on what the Program does.\n"); 614586c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 614686c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " 1. You may copy and distribute verbatim copies of the Program's\n"); 614786c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "source code as you receive it, in any medium, provided that you\n"); 614886c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "conspicuously and appropriately publish on each copy an appropriate\n"); 614986c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "copyright notice and disclaimer of warranty; keep intact all the\n"); 615086c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "notices that refer to this License and to the absence of any warranty;\n"); 615186c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "and give any other recipients of the Program a copy of this License\n"); 615286c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "along with the Program.\n"); 615386c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 615486c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "You may charge a fee for the physical act of transferring a copy, and\n"); 615586c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "you may at your option offer warranty protection in exchange for a fee.\n"); 615686c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 615786c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " 2. You may modify your copy or copies of the Program or any portion\n"); 615886c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "of it, thus forming a work based on the Program, and copy and\n"); 615986c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "distribute such modifications or work under the terms of Section 1\n"); 616086c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "above, provided that you also meet all of these conditions:\n"); 616186c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 616286c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " a) You must cause the modified files to carry prominent notices\n"); 616386c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " stating that you changed the files and the date of any change.\n"); 616486c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 616586c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " b) You must cause any work that you distribute or publish, that in\n"); 616686c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " whole or in part contains or is derived from the Program or any\n"); 616786c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " part thereof, to be licensed as a whole at no charge to all third\n"); 616886c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " parties under the terms of this License.\n"); 616986c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 617086c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " c) If the modified program normally reads commands interactively\n"); 617186c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " when run, you must cause it, when started running for such\n"); 617286c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " interactive use in the most ordinary way, to print or display an\n"); 617386c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " announcement including an appropriate copyright notice and a\n"); 617486c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " notice that there is no warranty (or else, saying that you provide\n"); 617586c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " a warranty) and that users may redistribute the program under\n"); 617686c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " these conditions, and telling the user how to view a copy of this\n"); 617786c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " License. (Exception: if the Program itself is interactive but\n"); 617886c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " does not normally print such an announcement, your work based on\n"); 617986c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " the Program is not required to print an announcement.)\n"); 618086c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 618186c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "These requirements apply to the modified work as a whole. If\n"); 618286c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "identifiable sections of that work are not derived from the Program,\n"); 618386c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "and can be reasonably considered independent and separate works in\n"); 618486c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "themselves, then this License, and its terms, do not apply to those\n"); 618586c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "sections when you distribute them as separate works. But when you\n"); 618686c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "distribute the same sections as part of a whole which is a work based\n"); 618786c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "on the Program, the distribution of the whole must be on the terms of\n"); 618886c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "this License, whose permissions for other licensees extend to the\n"); 618986c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "entire whole, and thus to each and every part regardless of who wrote it.\n"); 619086c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 619186c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "Thus, it is not the intent of this section to claim rights or contest\n"); 619286c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "your rights to work written entirely by you; rather, the intent is to\n"); 619386c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "exercise the right to control the distribution of derivative or\n"); 619486c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "collective works based on the Program.\n"); 619586c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 619686c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "In addition, mere aggregation of another work not based on the Program\n"); 619786c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "with the Program (or with a work based on the Program) on a volume of\n"); 619886c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "a storage or distribution medium does not bring the other work under\n"); 619986c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "the scope of this License.\n"); 620086c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 620186c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " 3. You may copy and distribute the Program (or a work based on it,\n"); 620286c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "under Section 2) in object code or executable form under the terms of\n"); 620386c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "Sections 1 and 2 above provided that you also do one of the following:\n"); 620486c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 620586c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " a) Accompany it with the complete corresponding machine-readable\n"); 620686c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " source code, which must be distributed under the terms of Sections\n"); 620786c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " 1 and 2 above on a medium customarily used for software interchange; or,\n"); 620886c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 620986c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " b) Accompany it with a written offer, valid for at least three\n"); 621086c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " years, to give any third party, for a charge no more than your\n"); 621186c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " cost of physically performing source distribution, a complete\n"); 621286c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " machine-readable copy of the corresponding source code, to be\n"); 621386c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " distributed under the terms of Sections 1 and 2 above on a medium\n"); 621486c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " customarily used for software interchange; or,\n"); 621586c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 621686c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " c) Accompany it with the information you received as to the offer\n"); 621786c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " to distribute corresponding source code. (This alternative is\n"); 621886c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " allowed only for noncommercial distribution and only if you\n"); 621986c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " received the program in object code or executable form with such\n"); 622086c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " an offer, in accord with Subsection b above.)\n"); 622186c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 622286c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "The source code for a work means the preferred form of the work for\n"); 622386c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "making modifications to it. For an executable work, complete source\n"); 622486c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "code means all the source code for all modules it contains, plus any\n"); 622586c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "associated interface definition files, plus the scripts used to\n"); 622686c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "control compilation and installation of the executable. However, as a\n"); 622786c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "special exception, the source code distributed need not include\n"); 622886c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "anything that is normally distributed (in either source or binary\n"); 622986c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "form) with the major components (compiler, kernel, and so on) of the\n"); 623086c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "operating system on which the executable runs, unless that component\n"); 623186c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "itself accompanies the executable.\n"); 623286c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 623386c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "If distribution of executable or object code is made by offering\n"); 623486c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "access to copy from a designated place, then offering equivalent\n"); 623586c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "access to copy the source code from the same place counts as\n"); 623686c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "distribution of the source code, even though third parties are not\n"); 623786c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "compelled to copy the source along with the object code.\n"); 623886c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 623986c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " 4. You may not copy, modify, sublicense, or distribute the Program\n"); 624086c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "except as expressly provided under this License. Any attempt\n"); 624186c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "otherwise to copy, modify, sublicense or distribute the Program is\n"); 624286c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "void, and will automatically terminate your rights under this License.\n"); 624386c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "However, parties who have received copies, or rights, from you under\n"); 624486c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "this License will not have their licenses terminated so long as such\n"); 624586c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "parties remain in full compliance.\n"); 624686c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 624786c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " 5. You are not required to accept this License, since you have not\n"); 624886c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "signed it. However, nothing else grants you permission to modify or\n"); 624986c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "distribute the Program or its derivative works. These actions are\n"); 625086c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "prohibited by law if you do not accept this License. Therefore, by\n"); 625186c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "modifying or distributing the Program (or any work based on the\n"); 625286c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "Program), you indicate your acceptance of this License to do so, and\n"); 625386c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "all its terms and conditions for copying, distributing or modifying\n"); 625486c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "the Program or works based on it.\n"); 625586c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 625686c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " 6. Each time you redistribute the Program (or any work based on the\n"); 625786c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "Program), the recipient automatically receives a license from the\n"); 625886c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "original licensor to copy, distribute or modify the Program subject to\n"); 625986c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "these terms and conditions. You may not impose any further\n"); 626086c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "restrictions on the recipients' exercise of the rights granted herein.\n"); 626186c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "You are not responsible for enforcing compliance by third parties to\n"); 626286c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "this License.\n"); 626386c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 626486c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " 7. If, as a consequence of a court judgment or allegation of patent\n"); 626586c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "infringement or for any other reason (not limited to patent issues),\n"); 626686c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "conditions are imposed on you (whether by court order, agreement or\n"); 626786c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "otherwise) that contradict the conditions of this License, they do not\n"); 626886c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "excuse you from the conditions of this License. If you cannot\n"); 626986c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "distribute so as to satisfy simultaneously your obligations under this\n"); 627086c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "License and any other pertinent obligations, then as a consequence you\n"); 627186c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "may not distribute the Program at all. For example, if a patent\n"); 627286c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "license would not permit royalty-free redistribution of the Program by\n"); 627386c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "all those who receive copies directly or indirectly through you, then\n"); 627486c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "the only way you could satisfy both it and this License would be to\n"); 627586c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "refrain entirely from distribution of the Program.\n"); 627686c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 627786c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "If any portion of this section is held invalid or unenforceable under\n"); 627886c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "any particular circumstance, the balance of the section is intended to\n"); 627986c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "apply and the section as a whole is intended to apply in other\n"); 628086c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "circumstances.\n"); 628186c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 628286c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "It is not the purpose of this section to induce you to infringe any\n"); 628386c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "patents or other property right claims or to contest validity of any\n"); 628486c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "such claims; this section has the sole purpose of protecting the\n"); 628586c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "integrity of the free software distribution system, which is\n"); 628686c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "implemented by public license practices. Many people have made\n"); 628786c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "generous contributions to the wide range of software distributed\n"); 628886c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "through that system in reliance on consistent application of that\n"); 628986c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "system; it is up to the author/donor to decide if he or she is willing\n"); 629086c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "to distribute software through any other system and a licensee cannot\n"); 629186c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "impose that choice.\n"); 629286c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 629386c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "This section is intended to make thoroughly clear what is believed to\n"); 629486c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "be a consequence of the rest of this License.\n"); 629586c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 629686c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " 8. If the distribution and/or use of the Program is restricted in\n"); 629786c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "certain countries either by patents or by copyrighted interfaces, the\n"); 629886c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "original copyright holder who places the Program under this License\n"); 629986c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "may add an explicit geographical distribution limitation excluding\n"); 630086c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "those countries, so that distribution is permitted only in or among\n"); 630186c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "countries not thus excluded. In such case, this License incorporates\n"); 630286c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "the limitation as if written in the body of this License.\n"); 630386c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 630486c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " 9. The Free Software Foundation may publish revised and/or new versions\n"); 630586c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "of the General Public License from time to time. Such new versions will\n"); 630686c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "be similar in spirit to the present version, but may differ in detail to\n"); 630786c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "address new problems or concerns.\n"); 630886c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 630986c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "Each version is given a distinguishing version number. If the Program\n"); 631086c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "specifies a version number of this License which applies to it and any\n"); 631186c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "later version, you have the option of following the terms and conditions\n"); 631286c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "either of that version or of any later version published by the Free\n"); 631386c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "Software Foundation. If the Program does not specify a version number of\n"); 631486c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "this License, you may choose any version ever published by the Free Software\n"); 631586c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "Foundation.\n"); 631686c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 631786c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " 10. If you wish to incorporate parts of the Program into other free\n"); 631886c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "programs whose distribution conditions are different, write to the author\n"); 631986c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "to ask for permission. For software which is copyrighted by the Free\n"); 632086c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "Software Foundation, write to the Free Software Foundation; we sometimes\n"); 632186c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "make exceptions for this. Our decision will be guided by the two goals\n"); 632286c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "of preserving the free status of all derivatives of our free software and\n"); 632386c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "of promoting the sharing and reuse of software generally.\n"); 632486c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 632586c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " NO WARRANTY\n"); 632686c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 632786c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\n"); 632886c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN\n"); 632986c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\n"); 633086c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "PROVIDE THE PROGRAM AS IS WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\n"); 633186c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n"); 633286c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS\n"); 633386c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE\n"); 633486c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\n"); 633586c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "REPAIR OR CORRECTION.\n"); 633686c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 633786c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\n"); 633886c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\n"); 633986c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\n"); 634086c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\n"); 634186c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\n"); 634286c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\n"); 634386c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\n"); 634486c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\n"); 634586c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "POSSIBILITY OF SUCH DAMAGES.\n"); 634686c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 634786c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " END OF TERMS AND CONDITIONS\n"); 634886c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 634986c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " How to Apply These Terms to Your New Programs\n"); 635086c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 635186c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " If you develop a new program, and you want it to be of the greatest\n"); 635286c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "possible use to the public, the best way to achieve this is to make it\n"); 635386c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "free software which everyone can redistribute and change under these terms.\n"); 635486c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 635586c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " To do so, attach the following notices to the program. It is safest\n"); 635686c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "to attach them to the start of each source file to most effectively\n"); 635786c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "convey the exclusion of warranty; and each file should have at least\n"); 635886c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "the copyright line and a pointer to where the full notice is found.\n"); 635986c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 636086c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " <one line to give the program's name and a brief idea of what it does.>\n"); 636186c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " Copyright (C) <year> <name of author>\n"); 636286c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 636386c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " This program is free software; you can redistribute it and/or modify\n"); 636486c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " it under the terms of the GNU General Public License as published by\n"); 636586c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " the Free Software Foundation; either version 2 of the License, or\n"); 636686c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " (at your option) any later version.\n"); 636786c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 636886c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " This program is distributed in the hope that it will be useful,\n"); 636986c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " but WITHOUT ANY WARRANTY; without even the implied warranty of\n"); 637086c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"); 637186c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " GNU General Public License for more details.\n"); 637286c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 637386c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " You should have received a copy of the GNU General Public License\n"); 637486c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " along with this program; if not, write to the Free Software\n"); 637586c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n"); 637686c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 637786c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 637886c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "Also add information on how to contact you by electronic and paper mail.\n"); 637986c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 638086c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "If the program is interactive, make it output a short notice like this\n"); 638186c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "when it starts in an interactive mode:\n"); 638286c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 638386c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " Gnomovision version 69, Copyright (C) year name of author\n"); 638486c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n"); 638586c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " This is free software, and you are welcome to redistribute it\n"); 638686c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " under certain conditions; type `show c' for details.\n"); 638786c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 638886c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "The hypothetical commands `show w' and `show c' should show the appropriate\n"); 638986c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "parts of the General Public License. Of course, the commands you use may\n"); 639086c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "be called something other than `show w' and `show c'; they could even be\n"); 639186c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "mouse-clicks or menu items--whatever suits your program.\n"); 639286c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 639386c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "You should also get your employer (if you work as a programmer) or your\n"); 639486c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "school, if any, to sign a copyright disclaimer for the program, if\n"); 639586c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "necessary. Here is a sample; alter the names:\n"); 639686c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 639786c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n"); 639886c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " `Gnomovision' (which makes passes at compilers) written by James Hacker.\n"); 639986c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 640086c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " <signature of Ty Coon>, 1 April 1989\n"); 640186c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, " Ty Coon, President of Vice\n"); 640286c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 640386c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "This General Public License does not permit incorporating your program into\n"); 640486c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "proprietary programs. If your program is a subroutine library, you may\n"); 640586c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "consider it more useful to permit linking proprietary applications with the\n"); 640686c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "library. If this is what you want to do, use the GNU Library General\n"); 640786c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "Public License instead of this License.\n"); 640886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 640986c2349f3dd6574a20f58b31ed901d0006bced4bnjn my_strcat(inbuf, "\n"); 641086c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 641186c2349f3dd6574a20f58b31ed901d0006bced4bnjn 641286c2349f3dd6574a20f58b31ed901d0006bced4bnjn#include <stdio.h> 641383b62cbbab29bde83eba40231f307c2a311e73c8njn#include "tests/malloc.h" 641486c2349f3dd6574a20f58b31ed901d0006bced4bnjn#include <assert.h> 641586c2349f3dd6574a20f58b31ed901d0006bced4bnjn 641686c2349f3dd6574a20f58b31ed901d0006bced4bnjn/* For providing services. */ 641786c2349f3dd6574a20f58b31ed901d0006bced4bnjnstatic HWord g_serviceFn ( HWord arg1, HWord arg2 ) 641886c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 641986c2349f3dd6574a20f58b31ed901d0006bced4bnjn switch (arg1) { 642086c2349f3dd6574a20f58b31ed901d0006bced4bnjn case 0: /* EXIT */ 642186c2349f3dd6574a20f58b31ed901d0006bced4bnjn exit(0); 642286c2349f3dd6574a20f58b31ed901d0006bced4bnjn case 1: /* PUTC */ 642386c2349f3dd6574a20f58b31ed901d0006bced4bnjn putchar(arg2); 642486c2349f3dd6574a20f58b31ed901d0006bced4bnjn return 0; 642586c2349f3dd6574a20f58b31ed901d0006bced4bnjn case 2: /* MALLOC */ 642686c2349f3dd6574a20f58b31ed901d0006bced4bnjn return (HWord)malloc(arg2); 642786c2349f3dd6574a20f58b31ed901d0006bced4bnjn case 3: /* FREE */ 642886c2349f3dd6574a20f58b31ed901d0006bced4bnjn free((void*)arg2); 642986c2349f3dd6574a20f58b31ed901d0006bced4bnjn return 0; 643086c2349f3dd6574a20f58b31ed901d0006bced4bnjn default: 643186c2349f3dd6574a20f58b31ed901d0006bced4bnjn assert(0); 643286c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 643386c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 643486c2349f3dd6574a20f58b31ed901d0006bced4bnjn 643546712cd593e0c9ddf48431635e5b3e84a4eb1f42sewardjstatic char *bzerrorstrings[] = { 643646712cd593e0c9ddf48431635e5b3e84a4eb1f42sewardj "OK" 643746712cd593e0c9ddf48431635e5b3e84a4eb1f42sewardj ,"SEQUENCE_ERROR" 643846712cd593e0c9ddf48431635e5b3e84a4eb1f42sewardj ,"PARAM_ERROR" 643946712cd593e0c9ddf48431635e5b3e84a4eb1f42sewardj ,"MEM_ERROR" 644046712cd593e0c9ddf48431635e5b3e84a4eb1f42sewardj ,"DATA_ERROR" 644146712cd593e0c9ddf48431635e5b3e84a4eb1f42sewardj ,"DATA_ERROR_MAGIC" 644246712cd593e0c9ddf48431635e5b3e84a4eb1f42sewardj ,"IO_ERROR" 644346712cd593e0c9ddf48431635e5b3e84a4eb1f42sewardj ,"UNEXPECTED_EOF" 644446712cd593e0c9ddf48431635e5b3e84a4eb1f42sewardj ,"OUTBUFF_FULL" 644546712cd593e0c9ddf48431635e5b3e84a4eb1f42sewardj ,"CONFIG_ERROR" 644646712cd593e0c9ddf48431635e5b3e84a4eb1f42sewardj ,"???" /* for future */ 644746712cd593e0c9ddf48431635e5b3e84a4eb1f42sewardj ,"???" /* for future */ 644846712cd593e0c9ddf48431635e5b3e84a4eb1f42sewardj ,"???" /* for future */ 644946712cd593e0c9ddf48431635e5b3e84a4eb1f42sewardj ,"???" /* for future */ 645046712cd593e0c9ddf48431635e5b3e84a4eb1f42sewardj ,"???" /* for future */ 645146712cd593e0c9ddf48431635e5b3e84a4eb1f42sewardj ,"???" /* for future */ 645246712cd593e0c9ddf48431635e5b3e84a4eb1f42sewardj}; 645346712cd593e0c9ddf48431635e5b3e84a4eb1f42sewardj 645446712cd593e0c9ddf48431635e5b3e84a4eb1f42sewardj// If given a cmd line arg, behave as a correctness regtest 645546712cd593e0c9ddf48431635e5b3e84a4eb1f42sewardj// (run fast and be verbose). If not, run for a long time 645646712cd593e0c9ddf48431635e5b3e84a4eb1f42sewardj// which is what is needed for the performance suite. 645746712cd593e0c9ddf48431635e5b3e84a4eb1f42sewardjint main ( int argc, char** argv ) 645886c2349f3dd6574a20f58b31ed901d0006bced4bnjn{ 645986c2349f3dd6574a20f58b31ed901d0006bced4bnjn int r; 646086c2349f3dd6574a20f58b31ed901d0006bced4bnjn int bit; 646186c2349f3dd6574a20f58b31ed901d0006bced4bnjn int i; 646286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 646346712cd593e0c9ddf48431635e5b3e84a4eb1f42sewardj int regtest; 646446712cd593e0c9ddf48431635e5b3e84a4eb1f42sewardj assert(argc == 1 || argc == 2); 646546712cd593e0c9ddf48431635e5b3e84a4eb1f42sewardj regtest = argc==2; 646646712cd593e0c9ddf48431635e5b3e84a4eb1f42sewardj 646786c2349f3dd6574a20f58b31ed901d0006bced4bnjn serviceFn = g_serviceFn; 646886c2349f3dd6574a20f58b31ed901d0006bced4bnjn 646986c2349f3dd6574a20f58b31ed901d0006bced4bnjn set_inbuf(); 647086c2349f3dd6574a20f58b31ed901d0006bced4bnjn nIn = vex_strlen(inbuf)+1; 647186c2349f3dd6574a20f58b31ed901d0006bced4bnjn vex_printf( "%d bytes read\n", nIn ); 647286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 647386c2349f3dd6574a20f58b31ed901d0006bced4bnjn nZ = M_BLOCK; 647486c2349f3dd6574a20f58b31ed901d0006bced4bnjn r = BZ2_bzBuffToBuffCompress ( 647586c2349f3dd6574a20f58b31ed901d0006bced4bnjn zbuf, &nZ, inbuf, nIn, 9, 3/*verb*/, 30 ); 647686c2349f3dd6574a20f58b31ed901d0006bced4bnjn 647786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (r != BZ_OK) { 647886c2349f3dd6574a20f58b31ed901d0006bced4bnjn vex_printf("initial compress failed!\n"); 647986c2349f3dd6574a20f58b31ed901d0006bced4bnjn (*serviceFn)(0,0); 648086c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 648186c2349f3dd6574a20f58b31ed901d0006bced4bnjn vex_printf( "%d after compression\n", nZ ); 648286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 648346712cd593e0c9ddf48431635e5b3e84a4eb1f42sewardj for (bit = 0; bit < nZ*8; bit += (bit < 35 ? 1 : (regtest?2377:137))) { 648446712cd593e0c9ddf48431635e5b3e84a4eb1f42sewardj if (regtest) 648546712cd593e0c9ddf48431635e5b3e84a4eb1f42sewardj vex_printf( "bit %d ", bit ); 648686c2349f3dd6574a20f58b31ed901d0006bced4bnjn flip_bit ( bit ); 648786c2349f3dd6574a20f58b31ed901d0006bced4bnjn nOut = M_BLOCK_OUT; 648886c2349f3dd6574a20f58b31ed901d0006bced4bnjn r = BZ2_bzBuffToBuffDecompress ( 648986c2349f3dd6574a20f58b31ed901d0006bced4bnjn outbuf, &nOut, zbuf, nZ, 1/*small*/, 0 ); 649046712cd593e0c9ddf48431635e5b3e84a4eb1f42sewardj if (regtest) 649146712cd593e0c9ddf48431635e5b3e84a4eb1f42sewardj vex_printf( " %d %s ", r, bzerrorstrings[-r] ); 649286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 649386c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (r != BZ_OK) { 649446712cd593e0c9ddf48431635e5b3e84a4eb1f42sewardj if (regtest) 649546712cd593e0c9ddf48431635e5b3e84a4eb1f42sewardj vex_printf( "\n" ); 649686c2349f3dd6574a20f58b31ed901d0006bced4bnjn } else { 649786c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (nOut != nIn) { 649886c2349f3dd6574a20f58b31ed901d0006bced4bnjn vex_printf( "nIn/nOut mismatch %d %d\n", nIn, nOut ); 649986c2349f3dd6574a20f58b31ed901d0006bced4bnjn (*serviceFn)(0,0); 650086c2349f3dd6574a20f58b31ed901d0006bced4bnjn } else { 650186c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i < nOut; i++) 650286c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (inbuf[i] != outbuf[i]) { 650386c2349f3dd6574a20f58b31ed901d0006bced4bnjn vex_printf( "mismatch at %d\n", i ); 650486c2349f3dd6574a20f58b31ed901d0006bced4bnjn (*serviceFn)(0,0); 650586c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 650686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (i == nOut) vex_printf( "really ok!\n" ); 650786c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 650886c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 650986c2349f3dd6574a20f58b31ed901d0006bced4bnjn 651086c2349f3dd6574a20f58b31ed901d0006bced4bnjn flip_bit ( bit ); 651186c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 651286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 651386c2349f3dd6574a20f58b31ed901d0006bced4bnjn#if 0 651486c2349f3dd6574a20f58b31ed901d0006bced4bnjn assert (nOut == nIn); 651586c2349f3dd6574a20f58b31ed901d0006bced4bnjn for (i = 0; i < nOut; i++) { 651686c2349f3dd6574a20f58b31ed901d0006bced4bnjn if (inbuf[i] != outbuf[i]) { 651786c2349f3dd6574a20f58b31ed901d0006bced4bnjn vex_printf( "difference at %d !\n", i ); 651886c2349f3dd6574a20f58b31ed901d0006bced4bnjn return 1; 651986c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 652086c2349f3dd6574a20f58b31ed901d0006bced4bnjn } 652186c2349f3dd6574a20f58b31ed901d0006bced4bnjn#endif 652286c2349f3dd6574a20f58b31ed901d0006bced4bnjn 652386c2349f3dd6574a20f58b31ed901d0006bced4bnjn vex_printf( "all ok\n" ); 652486c2349f3dd6574a20f58b31ed901d0006bced4bnjn (*serviceFn)(0,0); 652586c2349f3dd6574a20f58b31ed901d0006bced4bnjn /*NOTREACHED*/ 652686c2349f3dd6574a20f58b31ed901d0006bced4bnjn return 0; 652786c2349f3dd6574a20f58b31ed901d0006bced4bnjn} 6528