mirror of
https://github.com/reactos/reactos.git
synced 2024-11-20 06:15:26 +00:00
130 lines
5.5 KiB
C
130 lines
5.5 KiB
C
/*
|
|
* MSZIP decompression header (taken from cabinet.h of cabinet dll)
|
|
*
|
|
* Copyright 2002 Greg Turner
|
|
* Copyright 2005 Gerold Jens Wucherpfennig
|
|
* Copyright 2010 Christian Costa
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
|
*/
|
|
|
|
#include "fdi.h"
|
|
|
|
typedef unsigned char cab_UBYTE; /* 8 bits */
|
|
typedef UINT16 cab_UWORD; /* 16 bits */
|
|
typedef UINT32 cab_ULONG; /* 32 bits */
|
|
typedef INT32 cab_LONG; /* 32 bits */
|
|
|
|
typedef struct {
|
|
unsigned int FDI_Intmagic;
|
|
PFNALLOC pfnalloc;
|
|
PFNFREE pfnfree;
|
|
PFNOPEN pfnopen;
|
|
PFNREAD pfnread;
|
|
PFNWRITE pfnwrite;
|
|
PFNCLOSE pfnclose;
|
|
PFNSEEK pfnseek;
|
|
PERF perf;
|
|
} FDI_Int, *PFDI_Int;
|
|
|
|
/* cast an HFDI into a PFDI_Int */
|
|
#define PFDI_INT(hfdi) ((PFDI_Int)(hfdi))
|
|
|
|
#define PFDI_ALLOC(hfdi, size) ((*PFDI_INT(hfdi)->pfnalloc) (size))
|
|
#define PFDI_FREE(hfdi, ptr) ((*PFDI_INT(hfdi)->pfnfree) (ptr))
|
|
|
|
/* MSZIP stuff */
|
|
#define ZIPWSIZE 0x8000 /* window size */
|
|
#define ZIPLBITS 9 /* bits in base literal/length lookup table */
|
|
#define ZIPDBITS 6 /* bits in base distance lookup table */
|
|
#define ZIPBMAX 16 /* maximum bit length of any code */
|
|
#define ZIPN_MAX 288 /* maximum number of codes in any set */
|
|
|
|
struct Ziphuft {
|
|
cab_UBYTE e; /* number of extra bits or operation */
|
|
cab_UBYTE b; /* number of bits in this code or subcode */
|
|
union {
|
|
cab_UWORD n; /* literal, length base, or distance base */
|
|
struct Ziphuft *t; /* pointer to next level of table */
|
|
} v;
|
|
};
|
|
|
|
struct ZIPstate {
|
|
cab_ULONG window_posn; /* current offset within the window */
|
|
cab_ULONG bb; /* bit buffer */
|
|
cab_ULONG bk; /* bits in bit buffer */
|
|
cab_ULONG ll[288+32]; /* literal/length and distance code lengths */
|
|
cab_ULONG c[ZIPBMAX+1]; /* bit length count table */
|
|
cab_LONG lx[ZIPBMAX+1]; /* memory for l[-1..ZIPBMAX-1] */
|
|
struct Ziphuft *u[ZIPBMAX]; /* table stack */
|
|
cab_ULONG v[ZIPN_MAX]; /* values in order of bit length */
|
|
cab_ULONG x[ZIPBMAX+1]; /* bit offsets, then code stack */
|
|
cab_UBYTE *inpos;
|
|
};
|
|
|
|
#define CAB(x) (decomp_state->x)
|
|
#define ZIP(x) (decomp_state->methods.zip.x)
|
|
#define DECR_OK (0)
|
|
#define DECR_DATAFORMAT (1)
|
|
#define DECR_ILLEGALDATA (2)
|
|
#define DECR_NOMEMORY (3)
|
|
#define DECR_CHECKSUM (4)
|
|
#define DECR_INPUT (5)
|
|
#define DECR_OUTPUT (6)
|
|
#define DECR_USERABORT (7)
|
|
|
|
#define ZIPNEEDBITS(n) {while(k<(n)){cab_LONG c=*(ZIP(inpos)++);\
|
|
b|=((cab_ULONG)c)<<k;k+=8;}}
|
|
#define ZIPDUMPBITS(n) {b>>=(n);k-=(n);}
|
|
|
|
/* CAB data blocks are <= 32768 bytes in uncompressed form. Uncompressed
|
|
* blocks have zero growth. MSZIP guarantees that it won't grow above
|
|
* uncompressed size by more than 12 bytes. LZX guarantees it won't grow
|
|
* more than 6144 bytes.
|
|
*/
|
|
#define CAB_BLOCKMAX (32768)
|
|
#define CAB_INPUTMAX (CAB_BLOCKMAX+6144)
|
|
|
|
typedef struct fdi_cds_fwd {
|
|
void *hfdi; /* the hfdi we are using */
|
|
cab_UBYTE inbuf[CAB_INPUTMAX+2]; /* +2 for lzx bitbuffer overflows! */
|
|
cab_UBYTE outbuf[CAB_BLOCKMAX];
|
|
union {
|
|
struct ZIPstate zip;
|
|
} methods;
|
|
} fdi_decomp_state;
|
|
|
|
/* Tables for deflate from PKZIP's appnote.txt. */
|
|
|
|
#define THOSE_ZIP_CONSTS \
|
|
static const cab_UBYTE Zipborder[] = /* Order of the bit length code lengths */ \
|
|
{ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; \
|
|
static const cab_UWORD Zipcplens[] = /* Copy lengths for literal codes 257..285 */ \
|
|
{ 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, \
|
|
59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; \
|
|
static const cab_UWORD Zipcplext[] = /* Extra bits for literal codes 257..285 */ \
|
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, \
|
|
4, 5, 5, 5, 5, 0, 99, 99}; /* 99==invalid */ \
|
|
static const cab_UWORD Zipcpdist[] = /* Copy offsets for distance codes 0..29 */ \
|
|
{ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, \
|
|
513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577}; \
|
|
static const cab_UWORD Zipcpdext[] = /* Extra bits for distance codes */ \
|
|
{ 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, \
|
|
10, 11, 11, 12, 12, 13, 13}; \
|
|
/* And'ing with Zipmask[n] masks the lower n bits */ \
|
|
static const cab_UWORD Zipmask[17] = { \
|
|
0x0000, 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff, \
|
|
0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff \
|
|
}
|