1 /* ------------------------------------------------------------------------ */
3 /* maketree.c -- make Huffman tree */
5 /* Modified Nobutaka Watazaki */
7 /* Ver. 1.14 Source All chagned 1995.01.14 N.Watazaki */
8 /* ------------------------------------------------------------------------ */
12 make_code(nchar, bitlen, code, leaf_num)
14 unsigned char *bitlen;
15 unsigned short *code; /* table */
16 unsigned short *leaf_num;
18 unsigned short weight[17]; /* 0x10000ul >> bitlen */
19 unsigned short start[17]; /* start code */
25 for (i = 1; i <= 16; i++) {
27 weight[i] = 1 << (16 - i);
28 total += weight[i] * leaf_num[i];
30 for (c = 0; c < nchar; c++) {
33 start[i] += weight[i];
38 count_leaf(node, nchar, leaf_num, depth) /* call with node = root */
41 unsigned short leaf_num[];
45 leaf_num[depth < 16 ? depth : 16]++;
47 count_leaf(left[node], nchar, leaf_num, depth + 1);
48 count_leaf(right[node], nchar, leaf_num, depth + 1);
53 make_len(nchar, bitlen, sort, leaf_num)
55 unsigned char *bitlen;
56 unsigned short *sort; /* sorted characters */
57 unsigned short *leaf_num;
63 for (i = 16; i > 0; i--) {
64 cum += leaf_num[i] << (16 - i);
66 #if (UINT_MAX != 0xffff)
71 leaf_num[16] -= cum; /* always leaf_num[16] > cum */
73 for (i = 15; i > 0; i--) {
83 for (i = 16; i > 0; i--) {
92 /* priority queue; send i-th entry down heap */
94 downheap(i, heap, heapsize, freq)
103 while ((j = 2 * i) <= heapsize) {
104 if (j < heapsize && freq[heap[j]] > freq[heap[j + 1]])
106 if (freq[k] <= freq[heap[j]])
114 /* make tree, calculate bitlen[], return root */
116 make_tree(nchar, freq, bitlen, code)
118 unsigned short *freq;
119 unsigned char *bitlen;
120 unsigned short *code;
122 short i, j, avail, root;
123 unsigned short *sort;
125 short heap[NC + 1]; /* NC >= nchar */
131 for (i = 0; i < nchar; i++) {
134 heap[++heapsize] = i;
141 /* make priority queue */
142 for (i = heapsize / 2; i >= 1; i--)
143 downheap(i, heap, heapsize, freq);
145 /* make huffman tree */
147 do { /* while queue has at least two entries */
148 i = heap[1]; /* take out least-freq entry */
151 heap[1] = heap[heapsize--];
152 downheap(1, heap, heapsize, freq);
153 j = heap[1]; /* next least-freq entry */
156 root = avail++; /* generate new node */
157 freq[root] = freq[i] + freq[j];
159 downheap(1, heap, heapsize, freq); /* put into queue */
162 } while (heapsize > 1);
165 unsigned short leaf_num[17];
168 memset(leaf_num, 0, sizeof(leaf_num));
169 count_leaf(root, nchar, leaf_num, 0);
172 make_len(nchar, bitlen, code, leaf_num);
174 /* make code table */
175 make_code(nchar, bitlen, code, leaf_num);