#include <stdio.h>
#include "dict.h"

#define sgn(x) ((x)<0 ? -1 : ((x)>0 ? 1 : 0))
#define BLANK '?'

char to[16];
char from[16];
int deep1,deep2;
char opt;
int blanks=0;
int interactive=1;

main(argc,argv)
int argc;
char *argv[];
{
	int arg;

	if (argc>1) interactive=0;

	loaddict();

	if (interactive) printf("loaded dictionary.\n");

	if (interactive) {
		prompt();
		while (EOF!=scanf("%s",from)) {
			processword();
			prompt();
		}
	} else {
		for (arg=1; arg<argc; arg++) {
			if (arg>1) printf("\n");
			strcpy(from,argv[arg]);
			processword();
		}
	}
}

processword()
{
	if (from[1] && from[0]!='+')
		opt=' ';
	else
		opt=from[0];

	switch (opt) {
		case '+':	AddWord(&from[1],0);
	break;	case '-':	RemoveWord(&from[1],0);
	break;	case 'b':	blanks=1;
	break;	case 'B':	blanks=2;
	break;	case 'n':	blanks=0;
	break;	case ' ':	findanagrams();
	}
}

prompt(){printf("<from> = ");}

char word[2][16384][8];
int	windex;
int	wset;
int	fulldepth;
int	found;
int	occurrences[128];

findanagrams()
{
	int i;
	char ch;

	for (ch='a'; ch<='z'; ch++) {
		occurrences[ch]=0;
	}

	occurrences[BLANK]=blanks;
	for (i=0; from[i]; i++) {
		occurrences[from[i]]++;
	}

	seekanagrams(0,0);
}

char	traceword[9];

seekanagrams(node,letter)
long node;
int letter;
{
	long to;
	char ch;
	int lastarc;

	do {
		lastarc=IsLastArc(node);
		ch=Letter(node);
		traceword[letter++]=ch;

		if (!occurrences[ch]) ch=BLANK;

		if (occurrences[ch]) {
			occurrences[ch]--;

			traceword[letter]=0;

			if (IsWord(node) && !from[letter]) {
				printf("%s\n",traceword);
			} else {
				to=Arc(node);
				if (to) {
					seekanagrams(to,letter);
				}
			}

			occurrences[ch]++;
		}

		letter--;
		node++;
	} while (!lastarc);
}
