return(index);
if (prefix_code[index] == hash_prefix &&
append_character[index] == hash_character)
return(index);
index -= offset;
if (index < 0)
index += TABLE_SIZE;
}
}
//输出编码
void output_code(unsigned int code)
{
output_bit_buffer |= (unsigned long) code << (32 - num_bits -
output_bit_count);
output_bit_count += num_bits;
while (output_bit_count >= 8) {
*output++=(unsigned char)(output_bit_buffer >> 24);
output_bit_buffer <<= 8;
output_bit_count -= 8;
bytes_out++; /* ADDED for compression monitoring */
outcounts++;
}
}
//为各表分配内存空间
bool LZWAllocTables()
{
bool flag=true;
__try{
code_value=(int*)GlobalAlloc(GPTR,TABLE_SIZE*sizeof(unsigned int));
prefix_code=(unsigned int *)GlobalAlloc(GPTR,TABLE_SIZE*sizeof(unsigned int));
append_character=(unsigned char*)GlobalAlloc(GPTR,TABLE_SIZE*sizeof(unsigned char));
}
__except(EXCEPTION_EXECUTE_HANDLER){
if(code_value)
code_value=(int*)GlobalFree(code_value);
if(prefix_code)
prefix_code=(unsigned int*)GlobalFree(prefix_code);
if(append_character)
append_character=(unsigned char*)GlobalFree(append_character);
flag=false;
}
return flag;
}
//释放各表所占用的内存
void LZWFreeTables()
{
if(code_value)
code_value=(int*)GlobalFree(code_value);
if(prefix_code)
prefix_code=(unsigned int*)GlobalFree(prefix_code);
if(append_character)
append_character=(unsigned char*)GlobalFree(append_character);
}