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

147 lines
4.9 KiB
C

/*
* decmacro.h
*
* Macros used by the decoder
*/
/*
* decode an element from the aligned offset tree, without checking
* for the end of the input data
*/
#define DECODE_ALIGNED_NOEOFCHECK(j) \
(j) = context->dec_aligned_table[dec_bitbuf >> (32-ALIGNED_TABLE_BITS)]; \
FILL_BUF_NOEOFCHECK(context->dec_aligned_len[(j)]);
/*
* Decode an element from the main tree
* Check for EOF
*/
#define DECODE_MAIN_TREE(j) \
j = context->dec_main_tree_table[dec_bitbuf >> (32-MAIN_TREE_TABLE_BITS)]; \
if (j < 0) \
{ \
ulong mask = (1L << (32-1-MAIN_TREE_TABLE_BITS)); \
do \
{ \
j = -j; \
if (dec_bitbuf & mask) \
j = context->dec_main_tree_left_right[j*2+1]; \
else \
j = context->dec_main_tree_left_right[j*2]; \
mask >>= 1; \
} while (j < 0); \
} \
FILL_BUF_FULLCHECK(context->dec_main_tree_len[j]);
/*
* Decode an element from the secondary length tree
* No checking for EOF
*/
#define DECODE_LEN_TREE_NOEOFCHECK(matchlen) \
matchlen = context->dec_secondary_length_tree_table[dec_bitbuf >> (32-SECONDARY_LEN_TREE_TABLE_BITS)]; \
if (matchlen < 0) \
{ \
ulong mask = (1L << (32-1-SECONDARY_LEN_TREE_TABLE_BITS)); \
do \
{ \
matchlen = -matchlen; \
if (dec_bitbuf & mask) \
matchlen = context->dec_secondary_length_tree_left_right[matchlen*2+1];\
else \
matchlen = context->dec_secondary_length_tree_left_right[matchlen*2]; \
mask >>= 1; \
} while (matchlen < 0); \
} \
FILL_BUF_NOEOFCHECK(context->dec_secondary_length_tree_len[matchlen]); \
matchlen += NUM_PRIMARY_LENGTHS;
/*
* read n bits from input stream into dest_var, but don't
* check for EOF
*/
#define GET_BITS_NOEOFCHECK(N,DEST_VAR) \
{ \
DEST_VAR = dec_bitbuf >> (32-(N)); \
FILL_BUF_NOEOFCHECK((N)); \
}
/* same as above, but don't check for EOF */
#define GET_BITS17_NOEOFCHECK(N,DEST_VAR) \
{ \
DEST_VAR = dec_bitbuf >> (32-(N)); \
FILL_BUF17_NOEOFCHECK((N)); \
}
/*
* Remove n bits from the input stream
* handles 1 <= n <= 17
*
* FORCE an EOF check ALWAYS, whether or not we read in more
* bytes from memory.
*
* This is used to ensure that we always get an EOF check often enough
* to not overrun the extra bytes in the buffer.
*
* This routine is used ONLY when decoding the main tree element,
* where we know that the code we read in will be 16 bits or less
* in length. Therefore we don't have to check for bitcount going
* less than zero, twice.
*/
#define FILL_BUF_FULLCHECK(N) \
{ \
if (dec_input_curpos >= dec_end_input_pos) \
return -1; \
dec_bitbuf <<= (N); \
dec_bitcount -= (N); \
if (dec_bitcount <= 0) \
{ \
dec_bitbuf |= ((((ulong) *dec_input_curpos | (((ulong) *(dec_input_curpos+1)) << 8))) << (-dec_bitcount)); \
dec_input_curpos += 2; \
dec_bitcount += 16; \
} \
}
/*
* Same as above, but no EOF check
*
* This is used when we know we will not run out of input
*/
#define FILL_BUF_NOEOFCHECK(N) \
{ \
dec_bitbuf <<= (N); \
dec_bitcount -= (N); \
if (dec_bitcount <= 0) \
{ \
dec_bitbuf |= ((((ulong) *dec_input_curpos | (((ulong) *(dec_input_curpos+1)) << 8))) << (-dec_bitcount)); \
dec_input_curpos += 2; \
dec_bitcount += 16; \
} \
}
/*
* Same as above, but handles n=17 bits
*/
#define FILL_BUF17_NOEOFCHECK(N) \
{ \
dec_bitbuf <<= (N); \
dec_bitcount -= (N); \
if (dec_bitcount <= 0) \
{ \
dec_bitbuf |= ((((ulong) *dec_input_curpos | (((ulong) *(dec_input_curpos+1)) << 8))) << (-dec_bitcount)); \
dec_input_curpos += 2; \
dec_bitcount += 16; \
if (dec_bitcount <= 0) \
{ \
dec_bitbuf |= ((((ulong) *dec_input_curpos | (((ulong) *(dec_input_curpos+1)) << 8))) << (-dec_bitcount)); \
dec_input_curpos += 2; \
dec_bitcount += 16; \
} \
} \
}