huff_code_t * huff_code_build_str(char * const *values, int32 const *frequencies, int nvals) { huff_code_t *hc; huff_node_t *root; heap_t *q; int i; hc = (huff_code_t*)ckd_calloc(1, sizeof(*hc)); hc->refcount = 1; hc->type = HUFF_CODE_STR; /* Initialize the heap with nodes for each symbol. */ q = heap_new(); for (i = 0; i < nvals; ++i) { heap_insert(q, huff_node_new_str(values[i]), frequencies[i]); } /* Now build the tree, which gives us codeword lengths. */ root = huff_code_build_tree(q); heap_destroy(q); if (root == 0 || root->nbits > 32) { E_ERROR("Huffman trees currently limited to 32 bits\n"); huff_node_free_str(root, TRUE); huff_code_free(hc); return 0; } /* Build a canonical codebook. */ hc->maxbits = root->nbits; huff_code_canonicalize(hc, root); /* Tree no longer needed (note we retain pointers to its strings). */ huff_node_free_str(root, FALSE); return hc; }
huff_code_t * huff_code_build_int(int32 const *values, int32 const *frequencies, int nvals) { huff_code_t *hc; huff_node_t *root; heap_t *q; int i; hc = ckd_calloc(1, sizeof(*hc)); hc->refcount = 1; hc->type = HUFF_CODE_INT; /* Initialize the heap with nodes for each symbol. */ q = heap_new(); for (i = 0; i < nvals; ++i) { heap_insert(q, huff_node_new_int(values[i]), frequencies[i]); } /* Now build the tree, which gives us codeword lengths. */ root = huff_code_build_tree(q); heap_destroy(q); if (root == NULL || root->nbits > 64) { E_ERROR("Huffman trees currently limited to 32 bits\n"); huff_node_free_int(root); huff_code_free(hc); return NULL; } /* Build a canonical codebook. */ hc->maxbits = root->nbits; huff_code_canonicalize(hc, root); /* Tree no longer needed. */ huff_node_free_int(root); return hc; }