#define TABSTORL 200
#define SUFSTORL 78
#define sann 1
#define falsk 0
char QaQ[] = "a";
char QQ[] = "";

char *suffixtab[] = {
	"ad",QaQ,
	"ade",QaQ,
	"ades",QaQ,
	"aktig",QQ,
	"an",QaQ,
	"ande",QaQ,
	"anden",        QaQ,
	"andena",       QaQ,
	"andet",        QaQ,
	"ar",QaQ,
	"are",QQ,
	"aren",QaQ,
	"arens",QaQ,
	"ares",QaQ,
	"arna",QQ,
	"arnas",QQ,
	"ast",  QQ,
	"aste", QQ,
	"at",   QaQ,
	"ats",  QaQ,
	"bar",  QaQ,
	"bart", QaQ,
	"sbar", "sbar",
	"sbart", "sbart",
	"de",   QaQ,
	"des",  QaQ,
	"else", QaQ,
	"elsen",QaQ,
	"elser",QaQ,
	"elserna",QaQ,
	"en",   QQ,
	"ens",  QQ,
	"ende", QQ,
	"endet",QQ,
	"er",   QaQ,
	"erat", "era",
	"ers",  QQ,
	"erna", QQ,
	"ernas",QQ,
	"et",   QQ,
	"ets",  QQ,
	"het",  QQ,
	"heten",QQ,
	"hetens",QQ,
	"heter",QQ,
	"heterna",QQ,
	"heternas",QQ,
	"ig",   QQ,
	"iga",  QQ,
	"igare",QQ,
	"igast",QQ,
	"igt",  QQ,
	"ing",  QaQ,
	"ingar",QaQ,
	"ingen",QaQ,
	"isering",QaQ,
	"isk",  QQ,
	"iska", QQ,
	"iskt", QQ,
	"lig",  QQ,
	"liga", QQ,
	"ligare",       QQ,
	"ligast",       QQ,
	"ligaste",      QQ,
	"ligheter",     QQ,
	"ligheterna",   QQ,
	"ligheternas",  QQ,
	"ligt",         QQ,
	"man",          QQ,
	"na",           "en",
	"nad",          "na",
	"nad",          "na",
	"nades",        "na",
	"nde",          "nna",
	"ning",         QaQ,
	"or",           QaQ,
	"orna",         "a",
	"rer",          "r",
	"s",            QQ  };

char tecken[TABSTORL];
int missl[TABSTORL], lyckad[TABSTORL];
char *kod[TABSTORL];
int fri;

initsuf()
    {
	int i;
	for(i=0; i<TABSTORL; i++) {
	    tecken[i] = '?';
	    missl[i] = lyckad[i] = 0;
	    kod[i]= (char *) 0;
	    }
	fri = 1;
    for(i=0; i<SUFSTORL; i++) {
	placeraord(suffixtab[i*2],suffixtab[i*2+1]);
	}
    }

char *letaord(ord,slutpos)
	char *ord;
	int *slutpos;
	{
	int rad, j;
	char *slutkod;
	slutkod = 0;
	rad = 1;
	for(j=strlen(ord)-1; j>=0; j--)
	    {
	    while(ord[j] != tecken[rad] )
		if(missl[rad] != 0)
		    rad = missl[rad];
		else
		    return(slutkod);
	    if(kod[rad] != 0) {
		slutkod = kod[rad];
		*slutpos = j;
		}
	    if(lyckad[rad] != 0)
		rad = lyckad[rad];
	    else
		return(slutkod);
	    }
	return(slutkod);
	}

int suffix(ord,ord2)
    char *ord, *ord2;
    {
    int slutpos;
    char *sufbyte;
    sufbyte = letaord(ord,&slutpos);
    if(sufbyte == 0)
	return(falsk);
    strncpy(ord2,ord,slutpos);  ord2[slutpos] = '\0';
    strcat(ord2,sufbyte);
    return(sann);
    }

placeraord(ord,slutkod)
	char *ord;
	char *slutkod;
	{
	int rad, j, senasterad;
	senasterad = rad = 0;
	for(j=strlen(ord)-1; j>=0; j--)
	    {
	    while(ord[j] != tecken[rad] )
		if(missl[rad] != 0)
		    rad = missl[rad];
		else
		    {
		    missl[rad] = fri;
		    tecken[fri] = ord[j];
		    rad = fri;
		    if(++fri >= TABSTORL) {
			printf("\nsuffix: tabellen full");
			exit(1);
			}
		    j--;
		    for(;j>=0; j--){
			lyckad[rad] = fri;
			tecken[fri] = ord[j];
			rad=fri;
			if(++fri >= TABSTORL) {
			    printf("\nsuffix: tabellen full");
			    exit(1);
			    }
			}
		    kod[rad] = slutkod;
		    return;
		    }
	    if(lyckad[rad] != 0) {
		senasterad = rad;
		rad = lyckad[rad];
		}
	    else {
		j--;
		for(;j>=0; j--){
		    lyckad[rad] = fri;
		    tecken[fri] = ord[j];
		    rad=fri;
		    if(++fri >= TABSTORL) {
			printf("\nsuffix: tabellen full");
			exit(1);
			}
		    }
		kod[rad] = slutkod;
		return;
		}
	    }
	    kod[senasterad] = slutkod;
	}

skrivtabell() {
    int i;
	printf("\nrad  missl lyckad kod tecken");
    for(i=0; i<fri; i++) {
	printf("\n%3d  %3d    %3d   %s    %c",i,missl[i],lyckad[i],kod[i],tecken[i]);
	}
    }