windows-nt/Source/XPSP1/NT/enduser/stuff/itss/lzx/decoder/decvars.h
2020-09-26 16:20:57 +08:00

185 lines
5.8 KiB
C

/*
* decvars.h
*
* Variables for the decoder
*/
/*
* MAX_MAIN_TREE_ELEMENTS should be >= 256 + 8*num_position_slots
* (that comes out to 256 + 8*51 right now, for a 2 MB window).
*
* Make divisible by 4 so things are longword aligned.
*/
#define MAX_MAIN_TREE_ELEMENTS 672
typedef struct
{
/* 16-bit version does not have one big window pointer */
#ifndef BIT16
/* pointer to beginning of window buffer */
byte *dec_mem_window;
#endif
/* window/decoding buffer parameters */
ulong dec_window_size;
ulong dec_window_mask;
/* previous match offsets */
ulong dec_last_matchpos_offset[NUM_REPEATED_OFFSETS];
/* main tree table */
short dec_main_tree_table[1 << MAIN_TREE_TABLE_BITS];
/* secondary length tree table */
short dec_secondary_length_tree_table[1 << SECONDARY_LEN_TREE_TABLE_BITS];
/* main tree bit lengths */
byte dec_main_tree_len[MAX_MAIN_TREE_ELEMENTS];
/* secondary tree bit lengths */
byte dec_secondary_length_tree_len[NUM_SECONDARY_LENGTHS];
byte pad1[3]; /* NUM_SECONDARY_LENGTHS == 249 */
/* aligned offset table */
char dec_aligned_table[1 << ALIGNED_TABLE_BITS];
byte dec_aligned_len[ALIGNED_NUM_ELEMENTS];
/* left/right pointers for main tree (2*n shorts left, 2*n shorts for right) */
short dec_main_tree_left_right[MAX_MAIN_TREE_ELEMENTS*4];
/* left/right pointers for secondary length tree */
short dec_secondary_length_tree_left_right[NUM_SECONDARY_LENGTHS*4];
/* input (compressed) data pointers */
byte * dec_input_curpos;
byte * dec_end_input_pos;
/* output (uncompressed) data pointer */
byte * dec_output_buffer;
/* position in data stream at start of this decode call */
long dec_position_at_start;
/* previous lengths */
byte dec_main_tree_prev_len[MAX_MAIN_TREE_ELEMENTS];
byte dec_secondary_length_tree_prev_len[NUM_SECONDARY_LENGTHS];
/* bitwise i/o */
ulong dec_bitbuf;
signed char dec_bitcount;
/* number of distinct position (displacement) slots */
byte dec_num_position_slots;
bool dec_first_time_this_group;
bool dec_error_condition;
/* misc */
long dec_bufpos;
ulong dec_current_file_size;
ulong dec_instr_pos;
ulong dec_num_cfdata_frames;
/* original size of current block being decoded (in uncompressed bytes) */
long dec_original_block_size;
/* remaining size of current block being decoded (in uncompressed bytes) */
long dec_block_size;
/* type of current block being decoded */
lzx_block_type dec_block_type;
/* current state of decoder */
decoder_state dec_decoder_state;
/* memory allocation functions */
PFNALLOC dec_malloc;
PFNFREE dec_free;
/* file i/o functions */
PFNOPEN dec_open;
PFNREAD dec_read;
PFNWRITE dec_write;
PFNCLOSE dec_close;
PFNSEEK dec_seek;
#ifdef BIT16
byte * dec_output_curpos;
int dec_last_chance_page_to_use;
int dec_pos_to_page[NUM_OUTPUT_BUFFER_PAGES];
/*
* Variables for big buffer
*/
struct
{
BYTE HUGE *Buf; /* history buffer: NULL -> using disk ring buffer */
BYTE HUGE *BufEnd; /* last byte in history buffer + 1 */
BYTE HUGE *BufPos; /* current position in output buffer */
unsigned long Cur; /* current position in the history buffer */
unsigned short NumBytes; /* total number of bytes to decompress */
int fOutOverflow; /* if too little space in output buffer */
BYTE WindowBits; /* needed in DComp_Reset() */
int fRingFault; /* if disk callbacks fail */
} DComp;
/*
* Variables for ring buffer
*/
struct
{
int Handle; /* ring file handle */
PBUFFER RingBuffer; /* current output ring buffer */
BYTE FAR *RingPointer; /* current output pointer (into RingBuffer) */
BYTE FAR *RingPointerLimit; /* address of last byte of RingBuffer + 1 */
int RingPages; /* how many pages there are total */
PBUFFER pNewest; /* pointer to most recently used buffer */
PBUFFER pOldest; /* pointer to least recently used buffer */
PAGETABLEENTRY FAR *PageTable; /* pointer to array of pointers */
} Disk;
void (NEAR *DComp_Token_Match)(void *context, MATCH Match);
void (NEAR *DComp_Token_Literal)(void *context, int Chr);
#endif
} t_decoder_context;
/* declare arrays? */
#ifndef ALLOC_VARS
EXT const byte NEAR dec_extra_bits[];
EXT const long NEAR MP_POS_minus2[];
#else
const byte NEAR dec_extra_bits[] =
{
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,14,14,
15,15,16,16,17,17,17,17,
17,17,17,17,17,17,17,17,
17,17,17
};
/*
* first (base) position covered by each slot
* 2 subtracted for optimisation purposes (see decverb.c/decalign.c comments)
*/
const long NEAR MP_POS_minus2[sizeof(dec_extra_bits)] =
{
0-2, 1-2, 2-2, 3-2, 4-2, 6-2, 8-2, 12-2,
16-2, 24-2, 32-2, 48-2, 64-2, 96-2, 128-2, 192-2,
256-2, 384-2, 512-2, 768-2, 1024-2, 1536-2, 2048-2, 3072-2,
4096-2, 6144-2, 8192-2, 12288-2, 16384-2, 24576-2, 32768-2, 49152-2,
65536-2, 98304-2, 131072-2, 196608-2, 262144-2, 393216-2, 524288-2, 655360-2,
786432-2, 917504-2, 1048576-2, 1179648-2, 1310720-2, 1441792-2, 1572864-2, 1703936-2,
1835008-2, 1966080-2, 2097152-2
};
#endif