#include <stdio.h>
#include "globals.h"
#include "trie.h"
unsigned row, column;
unsigned long (*check)[17], *checkrow;
char (*fill)[17], *fillrow;
int (*trans)[17], *transrow;
void prefix(register unsigned long loc, int lim);
void extend (register unsigned int loc, register unsigned int col);
void firstmove(void)
{
check = acheck;
fill = afill;
fillrow = fill[8];
checkrow = check[8];
trans = atrans;
transrow = trans[8];
row = 8;
column = 8;
prefix(root, 6);
}
char currentmovearea[10]={0}, *currentmove=currentmovearea;
void putp (unsigned long (*xcheck)[17], char (*xfill)[17], int (*xtrans)[17])
{
int lastanchor;
check = xcheck;
fill = xfill;
trans = xtrans;
for (row = 1; row <= 15; row++) {
checkrow = check[row];
fillrow = fill[row];
lastanchor = 0;
for (column = 1; column <= 15; column++)
if (!fillrow[column]
&& (fill[row - 1][column] | fill[row + 1][column]
| fillrow[column - 1] | fillrow[column + 1])
) {
if (fillrow[column - 1])
extend (root, lastanchor + 1);
else
prefix (root, column - lastanchor - 1);
lastanchor = column;
}
}
}
void prefix(register unsigned long loc, int lim)
{
register unsigned long *l;
extend(unterm(loc), column);
if (lim && ptr (loc)) {
l = dawg + ptr (loc);
do {register d, c = chr (*l);
if (rack[c])
rack[d = c]--;
else if (rack[BLANK]) {
c |= BLANKBIT;
rack[d = BLANK]--;
}
else continue;
*++currentmove = c;
prefix(*l, lim-1);
currentmove--;
rack[d]++;
} while (!last (*l++));
}
}
void extend (register unsigned int loc, register unsigned int col)
{
register unsigned long *l,
c,
d;
if (fillrow[col] && ptr (loc)) {
l = dawg + ptr (loc);
do
if (chr (*l) >= chr (fillrow[col]))
if (chr (*l) == chr (fillrow[col]))
extend (*l, col + 1);
else
return;
while (!last (*l++));
}
else {
if (term (loc) && !fillrow[col])
eval (fill, trans, row, col);
if (ptr (loc)) {
l = dawg + ptr (loc);
do {
c = chr (*l);
if (checkrow[col] & (1 << c)) {
if (rack[c])
rack[d = c]--;
else if (rack[BLANK]) {
c |= BLANKBIT;
rack[d = BLANK]--;
}
else continue;
*++currentmove = c;
extend (*l, col + 1);
currentmove--;
rack[d]++;
}
} while (!last (*l++));
}
}
}