tbzlib_private.h - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       tbzlib_private.h (12000B)
       ---
            1 /*
            2  * THIS FILE IS NOT IDENTICAL TO THE ORIGINAL
            3  * FROM THE BZIP2 DISTRIBUTION.
            4  *
            5  * It has been modified, mainly to break the library
            6  * into smaller pieces.
            7  *
            8  * Russ Cox
            9  * rsc@plan9.bell-labs.com
           10  * July 2000
           11  */
           12 
           13 
           14 /*-------------------------------------------------------------*/
           15 /*--- Private header file for the library.                                                ---*/
           16 /*---                                                                                                          bzlib_private.h ---*/
           17 /*-------------------------------------------------------------*/
           18 
           19 /*--
           20   This file is a part of bzip2 and/or libbzip2, a program and
           21   library for lossless, block-sorting data compression.
           22 
           23   Copyright (C) 1996-2000 Julian R Seward.  All rights reserved.
           24 
           25   Redistribution and use in source and binary forms, with or without
           26   modification, are permitted provided that the following conditions
           27   are met:
           28 
           29   1. Redistributions of source code must retain the above copyright
           30           notice, this list of conditions and the following disclaimer.
           31 
           32   2. The origin of this software must not be misrepresented; you must
           33           not claim that you wrote the original software.        If you use this
           34           software in a product, an acknowledgment in the product
           35           documentation would be appreciated but is not required.
           36 
           37   3. Altered source versions must be plainly marked as such, and must
           38           not be misrepresented as being the original software.
           39 
           40   4. The name of the author may not be used to endorse or promote
           41           products derived from this software without specific prior written
           42           permission.
           43 
           44   THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
           45   OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
           46   WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
           47   ARE DISCLAIMED.         IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
           48   DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
           49   DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
           50   GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
           51   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
           52   WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
           53   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
           54   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
           55 
           56   Julian Seward, Cambridge, UK.
           57   jseward@acm.org
           58   bzip2/libbzip2 version 1.0 of 21 March 2000
           59 
           60   This program is based on (at least) the work of:
           61           Mike Burrows
           62           David Wheeler
           63           Peter Fenwick
           64           Alistair Moffat
           65           Radford Neal
           66           Ian H. Witten
           67           Robert Sedgewick
           68           Jon L. Bentley
           69 
           70   For more information on these sources, see the manual.
           71 --*/
           72 
           73 
           74 #ifndef _BZLIB_PRIVATE_H
           75 #define _BZLIB_PRIVATE_H
           76 
           77 /*-- General stuff. --*/
           78 
           79 #define BZ_VERSION  "1.0.1, 23-June-2000"
           80 
           81 #ifndef __GNUC__
           82 #define __inline__  /* */
           83 #endif
           84 
           85 /* these #defines can be overridden by bzlib_stdio.h */
           86 extern void bz_internal_error ( int errcode );
           87 #define AssertH(cond,errcode) \
           88         { if (!(cond)) bz_internal_error ( errcode ); }
           89 #define AssertD(cond,msg) /* */
           90 #define VPrintf0(zf) USED(zf)
           91 #define VPrintf1(zf,za1) do { USED(zf); USED(za1); } while(0)
           92 #define VPrintf2(zf,za1,za2) do { USED(zf); USED(za1); USED(za2); } while(0)
           93 #define VPrintf3(zf,za1,za2,za3) do { USED(zf); USED(za1); USED(za2); USED(za3); } while(0)
           94 #define VPrintf4(zf,za1,za2,za3,za4) do { USED(zf); USED(za1); USED(za2); USED(za3); USED(za4); } while(0)
           95 #define VPrintf5(zf,za1,za2,za3,za4,za5) do { USED(zf); USED(za1); USED(za2); USED(za3); USED(za4); USED(za5); } while(0)
           96 
           97 #define BZALLOC(nnn) (strm->bzalloc)(strm->opaque,(nnn),1)
           98 #define BZFREE(ppp)        (strm->bzfree)(strm->opaque,(ppp))
           99 
          100 
          101 /*-- Constants for the back end. --*/
          102 
          103 #define BZ_MAX_ALPHA_SIZE 258
          104 #define BZ_MAX_CODE_LEN                23
          105 
          106 #define BZ_RUNA 0
          107 #define BZ_RUNB 1
          108 
          109 #define BZ_N_GROUPS 6
          110 #define BZ_G_SIZE          50
          111 #define BZ_N_ITERS  4
          112 
          113 #define BZ_MAX_SELECTORS (2 + (900000 / BZ_G_SIZE))
          114 
          115 
          116 
          117 /*-- Stuff for randomising repetitive blocks. --*/
          118 
          119 extern Int32 BZ2_rNums[512];
          120 
          121 #define BZ_RAND_DECLS                                                                  \
          122         Int32 rNToGo;                                                                                  \
          123         Int32 rTPos                                                                                          \
          124 
          125 #define BZ_RAND_INIT_MASK                                                          \
          126         s->rNToGo = 0;                                                                                  \
          127         s->rTPos         = 0                                                                                  \
          128 
          129 #define BZ_RAND_MASK ((s->rNToGo == 1) ? 1 : 0)
          130 
          131 #define BZ_RAND_UPD_MASK                                                          \
          132         if (s->rNToGo == 0) {                                                          \
          133                 s->rNToGo = BZ2_rNums[s->rTPos];                          \
          134                 s->rTPos++;                                                                                  \
          135                 if (s->rTPos == 512) s->rTPos = 0;                  \
          136         }                                                                                                                  \
          137         s->rNToGo--;
          138 
          139 
          140 
          141 /*-- Stuff for doing CRCs. --*/
          142 
          143 extern UInt32 BZ2_crc32Table[256];
          144 
          145 #define BZ_INITIALISE_CRC(crcVar)                                  \
          146 {                                                                                                                          \
          147         crcVar = 0xffffffffL;                                                          \
          148 }
          149 
          150 #define BZ_FINALISE_CRC(crcVar)                                          \
          151 {                                                                                                                          \
          152         crcVar = ~(crcVar);                                                                  \
          153 }
          154 
          155 #define BZ_UPDATE_CRC(crcVar,cha)                                  \
          156 {                                                                                                                          \
          157         crcVar = (crcVar << 8) ^                                                  \
          158                                 BZ2_crc32Table[(crcVar >> 24) ^          \
          159                                                                         ((UChar)cha)];                  \
          160 }
          161 
          162 
          163 
          164 /*-- States and modes for compression. --*/
          165 
          166 #define BZ_M_IDLE                  1
          167 #define BZ_M_RUNNING          2
          168 #define BZ_M_FLUSHING  3
          169 #define BZ_M_FINISHING 4
          170 
          171 #define BZ_S_OUTPUT          1
          172 #define BZ_S_INPUT          2
          173 
          174 #define BZ_N_RADIX 2
          175 #define BZ_N_QSORT 12
          176 #define BZ_N_SHELL 18
          177 #define BZ_N_OVERSHOOT (BZ_N_RADIX + BZ_N_QSORT + BZ_N_SHELL + 2)
          178 
          179 
          180 
          181 
          182 /*-- Structure holding all the compression-side stuff. --*/
          183 
          184 typedef
          185         struct {
          186                 /* pointer back to the struct bz_stream */
          187                 bz_stream* strm;
          188 
          189                 /* mode this stream is in, and whether inputting */
          190                 /* or outputting data */
          191                 Int32                mode;
          192                 Int32                state;
          193 
          194                 /* remembers avail_in when flush/finish requested */
          195                 UInt32        avail_in_expect;
          196 
          197                 /* for doing the block sorting */
          198                 UInt32*        arr1;
          199                 UInt32*        arr2;
          200                 UInt32*        ftab;
          201                 Int32                origPtr;
          202 
          203                 /* aliases for arr1 and arr2 */
          204                 UInt32*        ptr;
          205                 UChar*        block;
          206                 UInt16*        mtfv;
          207                 UChar*        zbits;
          208 
          209                 /* for deciding when to use the fallback sorting algorithm */
          210                 Int32                workFactor;
          211 
          212                 /* run-length-encoding of the input */
          213                 UInt32        state_in_ch;
          214                 Int32                state_in_len;
          215                 BZ_RAND_DECLS;
          216 
          217                 /* input and output limits and current posns */
          218                 Int32                nblock;
          219                 Int32                nblockMAX;
          220                 Int32                numZ;
          221                 Int32                state_out_pos;
          222 
          223                 /* map of bytes used in block */
          224                 Int32                nInUse;
          225                 Bool                inUse[256];
          226                 UChar                unseqToSeq[256];
          227 
          228                 /* the buffer for bit stream creation */
          229                 UInt32        bsBuff;
          230                 Int32                bsLive;
          231 
          232                 /* block and combined CRCs */
          233                 UInt32        blockCRC;
          234                 UInt32        combinedCRC;
          235 
          236                 /* misc administratium */
          237                 Int32                verbosity;
          238                 Int32                blockNo;
          239                 Int32                blockSize100k;
          240 
          241                 /* stuff for coding the MTF values */
          242                 Int32                nMTF;
          243                 Int32                mtfFreq          [BZ_MAX_ALPHA_SIZE];
          244                 UChar                selector          [BZ_MAX_SELECTORS];
          245                 UChar                selectorMtf[BZ_MAX_SELECTORS];
          246 
          247                 UChar                len          [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
          248                 Int32                code          [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
          249                 Int32                rfreq          [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
          250                 /* second dimension: only 3 needed; 4 makes index calculations faster */
          251                 UInt32        len_pack[BZ_MAX_ALPHA_SIZE][4];
          252 
          253         }
          254         EState;
          255 
          256 
          257 
          258 /*-- externs for compression. --*/
          259 
          260 extern void
          261 BZ2_blockSort ( EState* );
          262 
          263 extern void
          264 BZ2_compressBlock ( EState*, Bool );
          265 
          266 extern void
          267 BZ2_bsInitWrite ( EState* );
          268 
          269 extern void
          270 BZ2_hbAssignCodes ( Int32*, UChar*, Int32, Int32, Int32 );
          271 
          272 extern void
          273 BZ2_hbMakeCodeLengths ( UChar*, Int32*, Int32, Int32 );
          274 
          275 
          276 
          277 /*-- states for decompression. --*/
          278 
          279 #define BZ_X_IDLE                         1
          280 #define BZ_X_OUTPUT                 2
          281 
          282 #define BZ_X_MAGIC_1                 10
          283 #define BZ_X_MAGIC_2                 11
          284 #define BZ_X_MAGIC_3                 12
          285 #define BZ_X_MAGIC_4                 13
          286 #define BZ_X_BLKHDR_1         14
          287 #define BZ_X_BLKHDR_2         15
          288 #define BZ_X_BLKHDR_3         16
          289 #define BZ_X_BLKHDR_4         17
          290 #define BZ_X_BLKHDR_5         18
          291 #define BZ_X_BLKHDR_6         19
          292 #define BZ_X_BCRC_1                 20
          293 #define BZ_X_BCRC_2                 21
          294 #define BZ_X_BCRC_3                 22
          295 #define BZ_X_BCRC_4                 23
          296 #define BZ_X_RANDBIT                 24
          297 #define BZ_X_ORIGPTR_1         25
          298 #define BZ_X_ORIGPTR_2         26
          299 #define BZ_X_ORIGPTR_3         27
          300 #define BZ_X_MAPPING_1         28
          301 #define BZ_X_MAPPING_2         29
          302 #define BZ_X_SELECTOR_1         30
          303 #define BZ_X_SELECTOR_2         31
          304 #define BZ_X_SELECTOR_3         32
          305 #define BZ_X_CODING_1         33
          306 #define BZ_X_CODING_2         34
          307 #define BZ_X_CODING_3         35
          308 #define BZ_X_MTF_1                 36
          309 #define BZ_X_MTF_2                 37
          310 #define BZ_X_MTF_3                 38
          311 #define BZ_X_MTF_4                 39
          312 #define BZ_X_MTF_5                 40
          313 #define BZ_X_MTF_6                 41
          314 #define BZ_X_ENDHDR_2         42
          315 #define BZ_X_ENDHDR_3         43
          316 #define BZ_X_ENDHDR_4         44
          317 #define BZ_X_ENDHDR_5         45
          318 #define BZ_X_ENDHDR_6         46
          319 #define BZ_X_CCRC_1                 47
          320 #define BZ_X_CCRC_2                 48
          321 #define BZ_X_CCRC_3                 49
          322 #define BZ_X_CCRC_4                 50
          323 
          324 
          325 
          326 /*-- Constants for the fast MTF decoder. --*/
          327 
          328 #define MTFA_SIZE 4096
          329 #define MTFL_SIZE 16
          330 
          331 
          332 
          333 /*-- Structure holding all the decompression-side stuff. --*/
          334 
          335 typedef
          336         struct {
          337                 /* pointer back to the struct bz_stream */
          338                 bz_stream* strm;
          339 
          340                 /* state indicator for this stream */
          341                 Int32                state;
          342 
          343                 /* for doing the final run-length decoding */
          344                 UChar                state_out_ch;
          345                 Int32                state_out_len;
          346                 Bool                blockRandomised;
          347                 BZ_RAND_DECLS;
          348 
          349                 /* the buffer for bit stream reading */
          350                 UInt32        bsBuff;
          351                 Int32                bsLive;
          352 
          353                 /* misc administratium */
          354                 Int32                blockSize100k;
          355                 Bool                smallDecompress;
          356                 Int32                currBlockNo;
          357                 Int32                verbosity;
          358 
          359                 /* for undoing the Burrows-Wheeler transform */
          360                 Int32                origPtr;
          361                 UInt32        tPos;
          362                 Int32                k0;
          363                 Int32                unzftab[256];
          364                 Int32                nblock_used;
          365                 Int32                cftab[257];
          366                 Int32                cftabCopy[257];
          367 
          368                 /* for undoing the Burrows-Wheeler transform (FAST) */
          369                 UInt32        *tt;
          370 
          371                 /* for undoing the Burrows-Wheeler transform (SMALL) */
          372                 UInt16        *ll16;
          373                 UChar                *ll4;
          374 
          375                 /* stored and calculated CRCs */
          376                 UInt32        storedBlockCRC;
          377                 UInt32        storedCombinedCRC;
          378                 UInt32        calculatedBlockCRC;
          379                 UInt32        calculatedCombinedCRC;
          380 
          381                 /* map of bytes used in block */
          382                 Int32                nInUse;
          383                 Bool                inUse[256];
          384                 Bool                inUse16[16];
          385                 UChar                seqToUnseq[256];
          386 
          387                 /* for decoding the MTF values */
          388                 UChar                mtfa         [MTFA_SIZE];
          389                 Int32                mtfbase[256 / MTFL_SIZE];
          390                 UChar                selector          [BZ_MAX_SELECTORS];
          391                 UChar                selectorMtf[BZ_MAX_SELECTORS];
          392                 UChar                len  [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
          393 
          394                 Int32                limit         [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
          395                 Int32                base         [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
          396                 Int32                perm         [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
          397                 Int32                minLens[BZ_N_GROUPS];
          398 
          399                 /* save area for scalars in the main decompress code */
          400                 Int32                save_i;
          401                 Int32                save_j;
          402                 Int32                save_t;
          403                 Int32                save_alphaSize;
          404                 Int32                save_nGroups;
          405                 Int32                save_nSelectors;
          406                 Int32                save_EOB;
          407                 Int32                save_groupNo;
          408                 Int32                save_groupPos;
          409                 Int32                save_nextSym;
          410                 Int32                save_nblockMAX;
          411                 Int32                save_nblock;
          412                 Int32                save_es;
          413                 Int32                save_N;
          414                 Int32                save_curr;
          415                 Int32                save_zt;
          416                 Int32                save_zn;
          417                 Int32                save_zvec;
          418                 Int32                save_zj;
          419                 Int32                save_gSel;
          420                 Int32                save_gMinlen;
          421                 Int32*        save_gLimit;
          422                 Int32*        save_gBase;
          423                 Int32*        save_gPerm;
          424 
          425         }
          426         DState;
          427 
          428 
          429 
          430 /*-- Macros for decompression. --*/
          431 
          432 #define BZ_GET_FAST(cccc)                                                         \
          433          s->tPos = s->tt[s->tPos];                                                 \
          434          cccc = (UChar)(s->tPos & 0xff);                                 \
          435          s->tPos >>= 8;
          436 
          437 #define BZ_GET_FAST_C(cccc)                                                 \
          438          c_tPos = c_tt[c_tPos];                                                         \
          439          cccc = (UChar)(c_tPos & 0xff);                                 \
          440          c_tPos >>= 8;
          441 
          442 #define SET_LL4(i,n)                                                                                                                  \
          443         { if (((i) & 0x1) == 0)                                                                                                  \
          444                   s->ll4[(i) >> 1] = (s->ll4[(i) >> 1] & 0xf0) | (n); else          \
          445                   s->ll4[(i) >> 1] = (s->ll4[(i) >> 1] & 0x0f) | ((n) << 4);  \
          446         }
          447 
          448 #define GET_LL4(i)                                                                          \
          449         ((((UInt32)(s->ll4[(i) >> 1])) >> (((i) << 2) & 0x4)) & 0xF)
          450 
          451 #define SET_LL(i,n)                                                                        \
          452         { s->ll16[i] = (UInt16)(n & 0x0000ffff);        \
          453           SET_LL4(i, n >> 16);                                                        \
          454         }
          455 
          456 #define GET_LL(i) \
          457         (((UInt32)s->ll16[i]) | (GET_LL4(i) << 16))
          458 
          459 #define BZ_GET_SMALL(cccc)                                                                                \
          460                 cccc = BZ2_indexIntoF ( s->tPos, s->cftab );                \
          461                 s->tPos = GET_LL(s->tPos);
          462 
          463 
          464 /*-- externs for decompression. --*/
          465 
          466 extern Int32
          467 BZ2_indexIntoF ( Int32, Int32* );
          468 
          469 extern Int32
          470 BZ2_decompress ( DState* );
          471 
          472 extern void
          473 BZ2_hbCreateDecodeTables ( Int32*, Int32*, Int32*, UChar*,
          474                                                                         Int32,  Int32, Int32 );
          475 
          476 
          477 #endif
          478 
          479 /* sometimes not including <stdio.h> makes this necessary */
          480 #ifndef NULL
          481 #define NULL 0
          482 #endif
          483 
          484 /* internal library functions */
          485 extern int
          486 bz_config_ok( void );
          487 
          488 extern void*
          489 default_bzalloc( void*, Int32, Int32 );
          490 
          491 extern void
          492 default_bzfree( void*, void* );
          493 
          494 /*-------------------------------------------------------------*/
          495 /*--- end                                                                                          bzlib_private.h ---*/
          496 /*-------------------------------------------------------------*/