|
|
} | } |
| |
/* count */ | /* count */ |
for (i = 0; i < nchar; i++) |
for (i = 0; i < nchar; i++) { |
count[bitlen[i]]++; |
if (bitlen[i] > 16) { |
|
error("Bad table (case a)"); |
|
exit(1); |
|
} |
|
else |
|
count[bitlen[i]]++; |
|
} |
| |
/* calculate first code */ | /* calculate first code */ |
total = 0; | total = 0; |
|
|
start[i] = total; | start[i] = total; |
total += weight[i] * count[i]; | total += weight[i] * count[i]; |
} | } |
if ((total & 0xffff) != 0) |
if ((total & 0xffff) != 0 || tablebits > 16) { /* 16 for weight below */ |
error("make_table(): Bad table (5)"); | error("make_table(): Bad table (5)"); |
|
exit(1); |
|
} |
| |
/* shift data for make table. */ | /* shift data for make table. */ |
m = 16 - tablebits; | m = 16 - tablebits; |
|
|
| |
/* initialize */ | /* initialize */ |
j = start[tablebits + 1] >> m; | j = start[tablebits + 1] >> m; |
k = 1 << tablebits; |
k = MIN(1 << tablebits, 4096); |
if (j != 0) | if (j != 0) |
for (i = j; i < k; i++) | for (i = j; i < k; i++) |
table[i] = 0; | table[i] = 0; |
|
|
l = start[k] + weight[k]; | l = start[k] + weight[k]; |
if (k <= tablebits) { | if (k <= tablebits) { |
/* code in table */ | /* code in table */ |
|
l = MIN(l, 4096); |
for (i = start[k]; i < l; i++) | for (i = start[k]; i < l; i++) |
table[i] = j; | table[i] = j; |
} | } |
else { | else { |
/* code not in table */ | /* code not in table */ |
p = &table[(i = start[k]) >> m]; |
i = start[k]; |
|
if ((i >> m) > 4096) { |
|
error("Bad table"); |
|
exit(1); |
|
} |
|
p = &table[i >> m]; |
i <<= tablebits; | i <<= tablebits; |
n = k - tablebits; | n = k - tablebits; |
/* make tree (n length) */ | /* make tree (n length) */ |