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