70{
71
72
73
74
75 Int32 nNodes, nHeap, n1, n2, i, j, k;
77
81
82 for (i = 0; i < alphaSize; i++)
83 weight[i+1] = (freq[i] == 0 ? 1 : freq[i]) << 8;
84
86
87 nNodes = alphaSize;
88 nHeap = 0;
89
91 weight[0] = 0;
92 parent[0] = -2;
93
94 for (i = 1; i <= alphaSize; i++) {
95 parent[i] = -1;
96 nHeap++;
99 }
100
102
103 while (nHeap > 1) {
106 nNodes++;
107 parent[n1] = parent[n2] = nNodes;
108 weight[nNodes] =
ADDWEIGHTS(weight[n1], weight[n2]);
109 parent[nNodes] = -1;
110 nHeap++;
111 heap[nHeap] = nNodes;
113 }
114
116
118 for (i = 1; i <= alphaSize; i++) {
119 j = 0;
120 k = i;
121 while (parent[k] >= 0) { k = parent[k]; j++; }
122 len[i-1] = j;
123 if (j > maxLen) tooLong =
True;
124 }
125
126 if (! tooLong) break;
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145 for (i = 1; i <= alphaSize; i++) {
146 j = weight[i] >> 8;
147 j = 1 + (j / 2);
148 weight[i] = j << 8;
149 }
150 }
151}
#define AssertH(cond, errcode)
#define BZ_MAX_ALPHA_SIZE
#define ADDWEIGHTS(zw1, zw2)