69 buffer->
w = *((buffer->
p)++);
73 unsigned int bit = buffer->
w & (1u << 31);
100 unsigned int byte = (buffer->
w >> 24) & 0xff;
104 buffer->
w <<= code_length;
105 buffer->
w_bits -= code_length;
119 if (buffer->
w_bits == 0) {
120 buffer->
w = *((buffer->
p)++);
124 unsigned int bit = buffer->
w & (1u << 31);
141 for(
int i = 0;
i < 256;
i++) {
152 }
else if (node->
symbol != -1) {
162 unsigned int bit = w & (1u << 31);
181 return (*node1)->
frequency - (*node2)->frequency;
186 int length,
unsigned int bits)
220 terminals[
i]->
next = terminals[
i + 1];
227 while (root->
next != NULL) {
235 combined->
next = NULL;
247 while (pos != NULL) {
249 combined->
next = pos;
251 prev->
next = combined;
262 combined->
next = NULL;
263 prev->
next = combined;
271 while (pos != NULL) {
273 cm_msg(MERROR,
"huffman_optimize_tree",
"List out of order");
293 cm_msg(MERROR,
"huffman_optimize_tree",
294 "Code length for symbol %d is too long (%d bits)",
i,
309 table->
code_bits =
new unsigned int[num_symbols];
314 for (
int i = 0;
i < num_symbols;
i++) {
323 char key_name[MAX_ODB_PATH];
326 sprintf(key_name,
"%s/code_bits", key_dir);
328 int stat = db_set_value(
hDB, 0, key_name, table->
code_bits, size,
330 if(stat != DB_SUCCESS) {
331 cm_msg(MERROR,
"save_huffman",
"Failed to save ODB key %s", key_name);
335 sprintf(key_name,
"%s/code_length", key_dir);
338 if(stat != DB_SUCCESS) {
339 cm_msg(MERROR,
"save_huffman",
"Failed to save ODB key %s", key_name);
343 sprintf(key_name,
"%s/frequency", key_dir);
344 stat = db_set_value(
hDB, 0, key_name, table->
frequency, size,
346 if(stat != DB_SUCCESS) {
347 cm_msg(MERROR,
"save_huffman",
"Failed to save ODB key %s", key_name);
389 code_bits <<= 32-code_length;
393 for(
int bit_number = 0; bit_number < code_length; bit_number++) {
395 BOOL bit = ((code_bits & (1u << 31)) != 0);
405 if(bit_number == code_length - 1) {
416 if(bit_number == code_length - 1) {
431 char key_name[MAX_ODB_PATH];
438 sprintf(key_name,
"%s/code_bits", key_dir);
440 int stat = db_get_value(
hDB, 0, key_name, table->
code_bits, &size,
443 cm_msg(MERROR,
"load_huffman",
"Failed to load ODB key %s", key_name);
447 sprintf(key_name,
"%s/code_length", key_dir);
451 cm_msg(MERROR,
"load_huffman",
"Failed to load ODB key %s", key_name);