in source/huffman_generator/generator.c [176:215]
void huffman_node_write_decode(struct huffman_node *node, FILE *file, uint8_t current_bit) {
/* Value nodes should have been inlined into parent branch checks */
assert(!node->value);
assert(node->children[0] || node->children[1]);
static int write_label = 0;
if (write_label) {
/* Write this node's label after the first run */
fprintf(file, "node_");
code_write(&node->code, file);
fprintf(file, ":\n");
}
write_label = 1;
/* Check 1 bit pattern */
uint32_t single_bit_mask = (uint32_t)(1ull << (31 - current_bit));
uint32_t left_aligned_pattern = ((node->code.bits << 1) + 1) << (31 - node->code.num_bits);
uint32_t check_pattern = left_aligned_pattern & single_bit_mask;
fprintf(file, " if (bits & 0x%x) {\n", check_pattern);
huffman_node_write_decode_handle_value(node->children[1], file);
fprintf(file, " } else {\n");
/* Child 0 is valid, go there */
huffman_node_write_decode_handle_value(node->children[0], file);
fprintf(file, " }\n\n");
/* Recursively write child nodes */
for (uint8_t i = 0; i < 2; ++i) {
struct huffman_node *child = node->children[i];
if (child && !child->value) {
huffman_node_write_decode(child, file, current_bit + 1);
}
}
}