Leaked source code of windows server 2003
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.
 
 
 
 
 
 

78 lines
1.5 KiB

//
// infinput.c
//
// Bitwise inputting for inflate (decompressor)
//
#include <stdio.h>
#include <crtdbg.h>
#include "inflate.h"
#include "infmacro.h"
void dumpBits(t_decoder_context *context, int n)
{
context->bitbuf >>= n;
context->bitcount -= n;
}
// retrieve n bits from the bit buffer, and dump them when done
// n can be up to 16
int getBits(t_decoder_context *context, int n)
{
int result;
context->bitcount -= n;
result = (context->bitbuf & g_BitMask[n]);
context->bitbuf >>= n;
return result;
}
//
// Ensure that <num_bits> bits are in the bit buffer
//
// Returns FALSE if there are not and there was insufficient input to make this true
//
BOOL ensureBitsContext(t_decoder_context *context, int num_bits)
{
if (context->bitcount + 16 < num_bits)
{
if (INPUT_EOF())
return FALSE;
context->bitbuf |= ((*context->input_curpos++) << (context->bitcount+16));
context->bitcount += 8;
if (context->bitcount + 16 < num_bits)
{
if (INPUT_EOF())
return FALSE;
context->bitbuf |= ((*context->input_curpos++) << (context->bitcount+16));
context->bitcount += 8;
}
}
return TRUE;
}
// initialise the bit buffer
BOOL initBitBuffer(t_decoder_context *context)
{
if (context->input_curpos < context->end_input_buffer)
{
context->bitbuf = *context->input_curpos++;
context->bitcount = -8;
context->state = STATE_READING_BFINAL;
return TRUE;
}
else
{
context->bitcount = -16;
context->bitbuf = 0;
return FALSE;
}
}