1 /* ------------------------------------------------------------------------ */
3 /* dhuf.c -- Dynamic Hufffman routine */
5 /* Modified H.Yoshizaki */
7 /* Ver. 1.14 Source All chagned 1995.01.14 N.Watazaki */
8 /* ------------------------------------------------------------------------ */
11 /* ------------------------------------------------------------------------ */
12 static short child[TREESIZE], parent[TREESIZE], block[TREESIZE], edge[TREESIZE], stock[TREESIZE],
13 s_node[TREESIZE / 2]; /* Changed N.Watazaki */
14 /* node[..] -> s_node[..] */
16 static unsigned short freq[TREESIZE];
18 static unsigned short total_p;
20 static int most_p, nn;
21 static unsigned long nextcount;
22 /* ------------------------------------------------------------------------ */
24 start_c_dyn( /* void */ )
28 n1 = (n_max >= 256 + maxmatch - THRESHOLD + 1) ? 512 : n_max - 1;
29 for (i = 0; i < TREESIZE_C; i++) {
33 for (i = 0, j = n_max * 2 - 2; i < n_max; i++, j--) {
43 f = freq[j] = freq[i] + freq[i - 1];
45 parent[i] = parent[i - 1] = j;
46 if (f == freq[j + 1]) {
47 edge[block[j] = block[j + 1]] = j;
50 edge[block[j] = stock[avail++]] = j;
57 /* ------------------------------------------------------------------------ */
59 start_p_dyn( /* void */ )
62 child[ROOT_P] = ~(N_CHAR);
63 s_node[N_CHAR] = ROOT_P;
64 edge[block[ROOT_P] = stock[avail++]] = ROOT_P;
71 /* ------------------------------------------------------------------------ */
73 decode_start_dyn( /* void */ )
82 /* ------------------------------------------------------------------------ */
91 for (i = j = start; i < end; i++) {
92 if ((k = child[i]) < 0) {
93 freq[j] = (freq[i] + 1) / 2;
97 if (edge[b = block[i]] == i) {
110 f = freq[l] + freq[l + 1];
111 for (k = start; f < freq[k]; k++);
123 for (i = start; i < end; i++) {
124 if ((j = child[i]) < 0)
127 parent[j] = parent[j - 1] = i;
128 if ((g = freq[i]) == f) {
132 edge[b = block[i] = stock[avail++]] = i;
138 /* ------------------------------------------------------------------------ */
146 if ((q = edge[b]) != p) { /* swap for leader */
152 parent[r] = parent[r - 1] = q;
156 parent[s] = parent[s - 1] = p;
162 else if (b == block[p + 1]) {
165 if (++freq[p] == freq[p - 1]) {
166 block[p] = block[p - 1];
169 edge[block[p] = stock[avail++]] = p; /* create block */
172 else if (++freq[p] == freq[p - 1]) {
173 stock[--avail] = b; /* delete block */
174 block[p] = block[p - 1];
179 /* ------------------------------------------------------------------------ */
186 if (freq[ROOT_C] == 0x8000) {
187 reconst(0, n_max * 2 - 1);
193 } while (q != ROOT_C);
196 /* ------------------------------------------------------------------------ */
203 if (total_p == 0x8000) {
204 reconst(ROOT_P, most_p + 1);
205 total_p = freq[ROOT_P];
206 freq[ROOT_P] = 0xffff;
208 q = s_node[p + N_CHAR];
209 while (q != ROOT_P) {
215 /* ------------------------------------------------------------------------ */
224 s_node[~(child[r] = child[most_p])] = r;
225 child[q] = ~(p + N_CHAR);
227 freq[r] = freq[most_p];
229 block[r] = block[most_p];
230 if (most_p == ROOT_P) {
231 freq[ROOT_P] = 0xffff;
232 edge[block[ROOT_P]]++;
234 parent[r] = parent[q] = most_p;
235 edge[block[q] = stock[avail++]] = s_node[p + N_CHAR] = most_p = q;
239 /* ------------------------------------------------------------------------ */
262 } while ((p = parent[p]) != ROOT_C);
269 /* ------------------------------------------------------------------------ */
271 decode_c_dyn( /* void */ )
280 c = child[c - (buf < 0)];
296 /* ------------------------------------------------------------------------ */
298 decode_p_dyn( /* void */ )
303 while (count > nextcount) {
304 make_new_node(nextcount / 64);
305 if ((nextcount += 64) >= nn)
306 nextcount = 0xffffffff;
312 c = child[c - (buf < 0)];
324 return (c << 6) + getbits(6);
327 /* ------------------------------------------------------------------------ */
329 output_dyn(code, pos)
339 /* ------------------------------------------------------------------------ */
341 encode_end_dyn( /* void */ )
346 /* Local Variables: */