#ifdef __cplusplus
extern "C" {
#endif
typedef unsigned long WK_word;
#define PAGE_SIZE_IN_WORDS 1024
#define PAGE_SIZE_IN_BYTES 4096
#define DICTIONARY_SIZE 16
#define HEADER_SIZE_IN_WORDS 4
#define TAGS_AREA_OFFSET 4
#define TAGS_AREA_SIZE 64
#define SET_QPOS_AREA_START(compr_dest_buf,qpos_start_addr) \
(compr_dest_buf[1] = qpos_start_addr - compr_dest_buf)
#define SET_LOW_BITS_AREA_START(compr_dest_buf,lb_start_addr) \
(compr_dest_buf[2] = lb_start_addr - compr_dest_buf)
#define SET_LOW_BITS_AREA_END(compr_dest_buf,lb_end_addr) \
(compr_dest_buf[3] = lb_end_addr - compr_dest_buf)
#define TAGS_AREA_START(decomp_src_buf) \
(decomp_src_buf + TAGS_AREA_OFFSET)
#define TAGS_AREA_END(decomp_src_buf) \
(TAGS_AREA_START(decomp_src_buf) + TAGS_AREA_SIZE)
#define FULL_WORD_AREA_START(the_buf) TAGS_AREA_END(the_buf)
#define QPOS_AREA_START(decomp_src_buf) \
(decomp_src_buf + decomp_src_buf[1])
#define LOW_BITS_AREA_START(decomp_src_buf) \
(decomp_src_buf + (decomp_src_buf[2]))
#define QPOS_AREA_END(the_buf) LOW_BITS_AREA_START(the_buf)
#define LOW_BITS_AREA_END(decomp_src_buf) \
(decomp_src_buf + (decomp_src_buf[3]))
typedef WK_word DictionaryElement;
#define BITS_PER_WORD 32
#define BYTES_PER_WORD 4
#define NUM_LOW_BITS 10
#define LOW_BITS_MASK 0x3FF
#define ALL_ONES_MASK 0xFFFFFFFF
#define TWO_BITS_PACKING_MASK 0x03030303
#define FOUR_BITS_PACKING_MASK 0x0F0F0F0F
#define TEN_LOW_BITS_MASK 0x000003FF
#define TWENTY_TWO_HIGH_BITS_MASK 0xFFFFFC00
#define ZERO_TAG 0x0
#define PARTIAL_TAG 0x1
#define MISS_TAG 0x2
#define EXACT_TAG 0x3
#define BITS_PER_BYTE 8
#define HIGH_BITS(word_pattern) (word_pattern >> NUM_LOW_BITS)
#define LOW_BITS(word_pattern) (word_pattern & LOW_BITS_MASK)
#if defined DEBUG_WK
#define DEBUG_PRINT_1(string) printf (string)
#define DEBUG_PRINT_2(string,value) printf(string, value)
#else
#define DEBUG_PRINT_1(string)
#define DEBUG_PRINT_2(string, value)
#endif
#define PRELOAD_DICTIONARY { \
dictionary[0] = 1; \
dictionary[1] = 1; \
dictionary[2] = 1; \
dictionary[3] = 1; \
dictionary[4] = 1; \
dictionary[5] = 1; \
dictionary[6] = 1; \
dictionary[7] = 1; \
dictionary[8] = 1; \
dictionary[9] = 1; \
dictionary[10] = 1; \
dictionary[11] = 1; \
dictionary[12] = 1; \
dictionary[13] = 1; \
dictionary[14] = 1; \
dictionary[15] = 1; \
}
#define HASH_LOOKUP_TABLE_CONTENTS { \
0, 52, 8, 56, 16, 12, 28, 20, 4, 36, 48, 24, 44, 40, 32, 60, \
8, 12, 28, 20, 4, 60, 16, 36, 24, 48, 44, 32, 52, 56, 40, 12, \
8, 48, 16, 52, 60, 28, 56, 32, 20, 24, 36, 40, 44, 4, 8, 40, \
60, 32, 20, 44, 4, 36, 52, 24, 16, 56, 48, 12, 28, 16, 8, 40, \
36, 28, 32, 12, 4, 44, 52, 20, 24, 48, 60, 56, 40, 48, 8, 32, \
28, 36, 4, 44, 20, 56, 60, 24, 52, 16, 12, 12, 4, 48, 20, 8, \
52, 16, 60, 24, 36, 44, 28, 56, 40, 32, 36, 20, 24, 60, 40, 44, \
52, 16, 32, 4, 48, 8, 28, 56, 12, 28, 32, 40, 52, 36, 16, 20, \
48, 8, 4, 60, 24, 56, 44, 12, 8, 36, 24, 28, 16, 60, 20, 56, \
32, 40, 48, 12, 4, 44, 52, 44, 40, 12, 56, 8, 36, 24, 60, 28, \
48, 4, 32, 20, 16, 52, 60, 12, 24, 36, 8, 4, 16, 56, 48, 44, \
40, 52, 32, 20, 28, 32, 12, 36, 28, 24, 56, 40, 16, 52, 44, 4, \
20, 60, 8, 48, 48, 52, 12, 20, 32, 44, 36, 28, 4, 40, 24, 8, \
56, 60, 16, 36, 32, 8, 40, 4, 52, 24, 44, 20, 12, 28, 48, 56, \
16, 60, 4, 52, 60, 48, 20, 16, 56, 44, 24, 8, 40, 12, 32, 28, \
36, 24, 32, 12, 4, 20, 16, 60, 36, 28, 8, 52, 40, 48, 44, 56 \
}
#define HASH_TO_DICT_BYTE_OFFSET(pattern) \
(hashLookupTable[((pattern) >> 10) & 0xFF])
extern const char hashLookupTable[];
#define EMIT_BYTE(fill_ptr, byte_value) {*fill_ptr = byte_value; fill_ptr++;}
#define EMIT_WORD(fill_ptr,word_value) {*fill_ptr = word_value; fill_ptr++;}
#define RECORD_ZERO { EMIT_BYTE(next_tag,ZERO_TAG); }
#define RECORD_EXACT(queue_posn) EMIT_BYTE(next_tag,EXACT_TAG); \
EMIT_BYTE(next_qp,(queue_posn));
#define RECORD_PARTIAL(queue_posn,low_bits_pattern) { \
EMIT_BYTE(next_tag,PARTIAL_TAG); \
EMIT_BYTE(next_qp,(queue_posn)); \
EMIT_WORD(next_low_bits,(low_bits_pattern)) }
#define RECORD_MISS(word_pattern) EMIT_BYTE(next_tag,MISS_TAG); \
EMIT_WORD(next_full_patt,(word_pattern));
void
WKdm_decompress (WK_word* src_buf,
WK_word* dest_buf,
unsigned int words);
unsigned int
WKdm_compress (WK_word* src_buf,
WK_word* dest_buf,
unsigned int num_input_words);
#ifdef __cplusplus
}
#endif