Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*
* 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; \ } \ } \ }
|