#include <stdio.h>
#define STORLEK 20000
#define LANGD 50
#define PTAL 11        /* p[] */
#define bokstav(t)     (97<=t&&t<=125||65<=t&&t<=93)
#define liten(t)       ((65<=t&&t<=93)?t+32:t)
#define sann 1
#define falsk 0
#define ETT14 1<<14

char ord[LANGD];
int tabell[STORLEK];
char lexf_namn[20],ordf_namn[20];
FILE *lexf, *ordf;
long pow2[PTAL][LANGD];   /* NP, NW */
long p[] = {
	319993,
	319981,
	319967,
	319927,
	319919,
	319849,
	319831,
	319829,
	319819,
	319817,
	319811};


main() {
	initiera();
	oppna_filer();
	while( tagord(ord) ) {
		printf("%s\n",ord);
		lagra(ord);
		}
	skrivut(tabell,lexf);
	}

int tagord(ord)
	char ord[];
	{
	char t; int i;
	int mer;
	i=0;
	mer = sann;
	while(mer) {
		t = getc(ordf);
		while(!bokstav(t) && t != EOF)
			if(t == '\n') {
			    if((t=getc(ordf)) == '.')
				 while( (t=getc(ordf)) != '\n' && t != EOF)
				     t = getc(ordf);
			    }
			else
			    t=getc(ordf);
		while(bokstav(t)){
			ord[i] = t;  /* ej liten */
			i++;
			t = getc(ordf);
			}
		mer = (t=='-');
		}
	ord[i] = 0;
	return(i>0);
	}

initiera() {
	int i,j;
	long h;
	for(i=0; i<PTAL; i++) {
		h = pow2[i][0] = ETT14;
		for(j=1; j<30; j++) {
			h = (h<<7)%p[i];
			pow2[i][j] = h;
			}
		}
	}

lagra(ord)
	char ord[];
	{
	int i,j; long h;
	for(i=0; i<PTAL; i++) {
		j=0; h=0;
		while( ord[j] != '\0' && j < LANGD) {
			h = h + ord[j] * pow2[i][j];
			j++;
			}
		h = h % p[i];
		tabell[h>>4] |= 1<<((int) h & 017);
		}
	}

oppna_filer() {
	fprintf(stderr,"Ge namnet p} den existerande ordfilen:");
	scanf("%s",ordf_namn);
	while((ordf = fopen(ordf_namn,"r")) == NULL) {
		fprintf(stderr,"Fel hos filen %s, ge nytt filnamn:",ordf_namn);
		scanf("%s",ordf_namn);
		}
	fprintf(stderr,"Ge namnet p} den lexikonfil som skall skapas:");
	scanf("%s",lexf_namn);
	while((lexf = fopen(lexf_namn,"w")) == NULL) {
		fprintf(stderr,"Fel hos filen %s, ge nytt filnamn:",lexf_namn);
		scanf("%s",lexf_namn);
		}
	}

skrivut(tabell,lexf)
	int tabell[]; FILE *lexf;
	{
	fwrite(tabell,(sizeof(int)),STORLEK,lexf);
	}