128 |
|
exit(1); |
129 |
|
} |
130 |
|
*troot = ht; /* first byte is tree height */ |
131 |
< |
for (i = 256; i--; ) { /* assign bit count table */ |
131 |
> |
for (i = 256; i--; ) { /* assign 0-bit count table */ |
132 |
|
int b; |
133 |
< |
buf[i] = 0; |
133 |
> |
buf[i] = 8; |
134 |
|
for (b = i; b; b >>= 1) |
135 |
< |
buf[i] += b&1; |
135 |
> |
buf[i] -= b&1; |
136 |
|
} |
137 |
|
return(troot); |
138 |
|
} |
161 |
|
{ |
162 |
|
n = tree_br[n].cntr_siz; |
163 |
|
|
164 |
< |
while (n-- > 0) /* LSB first */ |
165 |
< |
if (++(*ctrp++)) |
166 |
< |
break; |
164 |
> |
while (! ++(*ctrp++)) /* LSB first */ |
165 |
> |
if (--n <= 0) { |
166 |
> |
fputs("Shuffle occupancy overflow!\n", stderr); |
167 |
> |
exit(1); /* means we sized something wrong */ |
168 |
> |
} |
169 |
|
} |
170 |
|
|
171 |
|
|
192 |
|
incr_counter(brp, lvl); /* we intend to eat one */ |
193 |
|
brp += tree_br[lvl--].cntr_siz; /* drop a level */ |
194 |
|
} |
195 |
< |
b = 0; /* browse the leaves */ |
194 |
< |
while (ski >= 8-buf[*brp]) { /* buf contains bit counts */ |
195 |
> |
while (ski >= buf[*brp]) { /* browse the leaves */ |
196 |
|
pos += 8; |
197 |
< |
ski -= 8-buf[*brp++]; |
197 |
> |
ski -= buf[*brp++]; /* buf contains 0-bit counts */ |
198 |
|
} |
199 |
< |
while (ski >= 0) { /* target zero leaf bit */ |
199 |
> |
b = 0; /* find target bit in byte */ |
200 |
> |
while ((ski -= !(*brp & 1<<b)) >= 0) { |
201 |
|
pos++; |
202 |
< |
ski -= !(*brp & 1<<b++); |
202 |
> |
b++; |
203 |
|
} |
204 |
< |
*brp |= 1 << --b; /* eat it */ |
205 |
< |
return(--pos); /* & return leaf's slot# */ |
204 |
> |
*brp |= 1<<b; /* eat it */ |
205 |
> |
return(pos); /* & return leaf's slot# */ |
206 |
|
} |
207 |
|
|
208 |
|
|
215 |
|
tree_root = tree_alloc(alen); |
216 |
|
|
217 |
|
while (alen > 0) /* allocate and print random array entries */ |
218 |
< |
print_shuf(n, eat_nth_leaf(tree_root, random() % alen--)); |
218 |
> |
print_shuf(n, eat_nth_leaf(tree_root, irandom(alen--))); |
219 |
|
|
220 |
|
free(tree_root); /* all done */ |
221 |
|
} |
253 |
|
myshuf[i] = i; |
254 |
|
/* perform Fisher-Yates shuffle */ |
255 |
|
for (i = 0; i < alen-1; i++) { |
256 |
< |
int ix = random()%(alen-i) + i; |
256 |
> |
int ix = irandom(alen-i) + i; |
257 |
|
int ndx = myshuf[i]; |
258 |
|
myshuf[i] = myshuf[ix]; |
259 |
|
myshuf[ix] = ndx; |
287 |
|
n[a] = 0; |
288 |
|
if (!a) |
289 |
|
goto userr; |
290 |
< |
|
290 |
> |
#ifdef getc_unlocked |
291 |
> |
flockfile(stdout); /* avoid overhead */ |
292 |
> |
#endif |
293 |
|
if (doshuffle) |
294 |
|
shuffle(n); |
295 |
|
else |