#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "struct.h"

extern char **Messages;	/* System messages - for U0/U1/U2 */

/*
 *	Parse one word
 */
 
char *GetWord(str,buf)
char *str,*buf;
{
	while(*str)
	{
		if(*str==' '||*str=='.')
			str++;
		else
			break;
	}
	if(!*str)
		return(NULL);
	if(*str=='"')	/* THIS HACK NOT NEEDED - REMOVE */
	{
		strcpy(buf,"say");
		return(++str);
	}
	while(*str)
	{
		if(*str==' '||*str=='.')
			break;
		else
			*buf++= *str++;
	}
	*buf=0;
	return(str);
}

/*
 *	Look up word and return code
 */
 
tag FindCWord(a,b)
char *a;
int b;
{
	extern struct Word *FindWord();
	struct Word *z=FindWord(a,b);
	if(z)
		return(z->wd_Code);
	return(-1);
}

/*
 *	Perform a parse. 
 *	Its a lousy parser at the moment. I should write a real one
 */
 
Parser(x)
char *x;
{
	char buf[256];
	int tsf;
	tag qnoun;
	int qc;
	tag backadj;
	int fm1=0;
	free(Messages[0]);
	Messages[0]=(char *)estralloc(stpblk(x));
	x=GetWord(x,buf);
	if(x==NULL)
		return(0);
	SysFlags[3]=ISNUM(FindCWord(buf,1));
	if(NUM(SysFlags[3])== -1)
	{
		SysFlags[3]= ISNUM(-2);
	}
	free(Messages[1]);
	Messages[1]=(char *)estralloc(stpblk(x));
	if(NUM(SysFlags[3])!=(-2))
		x=GetWord(x,buf);
	SysFlags[4]= ISNUM(-1);
	qnoun= -1;
	backadj= -1;
l1:	if(x==NULL)
	{
		SysFlags[1]= ISNUM(-1);
		SysFlags[2]= ISNUM(-1);
		SysFlags[4]= ISNUM(-1);
		SysFlags[5]= ISNUM(-1);
		SysFlags[6]= ISNUM(-1);
		if(qnoun!= -1)
		{
			SysFlags[1]=ISNUM(qnoun);
			SysFlags[4]=ISNUM(backadj);
		}
/*		free(Messages[1]); */
		free(Messages[2]);
/*		Messages[1]=(char *)estralloc(""); */
		Messages[2]=(char *)estralloc("");
		return(1);
	}
	tsf=FindCWord(buf,2);
	if(tsf!= -1)
	{
		qc=FindCWord(buf,3);
		if(qc!=-1)
		{
			qnoun=qc;
			backadj=NUM(SysFlags[4]);
			fm1=1;
		}
		SysFlags[4]=tsf;
		free(Messages[2]);
		Messages[2]=(char *)estralloc(stpblk(x));
		x=GetWord(x,buf);
		goto l1;
	}
	if(fm1&&FindCWord(buf,4)!=-1)
	{
		SysFlags[4]=ISNUM(backadj);
		SysFlags[1]=ISNUM(qnoun);
		goto asmprep;	/* Assume it was adj no prep not adj adj no */
	}
	SysFlags[1]=ISNUM(FindCWord(buf,3));
	if(NUM(SysFlags[1])== -1 && qnoun!= -1)
	{
		SysFlags[1]=ISNUM(qnoun);
		SysFlags[4]=ISNUM(backadj);
	}
	if(NUM(SysFlags[1])!= -1)
	{
		free(Messages[2]);
		Messages[2]=(char *)estralloc(stpblk(x));
		x=GetWord(x,buf);
		if(x==NULL)
		{
			SysFlags[2]= ISNUM(-1);
			SysFlags[5]= ISNUM(-1);
			SysFlags[6]= ISNUM(-1);
			free(Messages[2]);
			Messages[2]=estralloc("");
			return(1);
		}
	}
asmprep:SysFlags[5]=ISNUM(FindCWord(buf,4));
	if(NUM(SysFlags[5])!= -1)
	{
		x=GetWord(x,buf);
		if(!x)
		{
			SysFlags[6]= ISNUM(-1);
			SysFlags[2]= ISNUM(-1);
			return(1);
		}
	}
	SysFlags[6]= ISNUM(-1);
	qnoun= -1;
	backadj= -1;
l2:	if(x==NULL)
	{
		if(qnoun!=-1)
		{
			SysFlags[2]=ISNUM(qnoun);
			SysFlags[6]=ISNUM(backadj);
		}
		else
		{
			SysFlags[2]= ISNUM(-1);
			SysFlags[6]= ISNUM(-1);
		}
		return(1);
	}
	tsf=FindCWord(buf,2);
	if(tsf!= -1)
	{
		qc=FindCWord(buf,3);
		if(qc!=-1)
		{
			qnoun=qc;
			backadj=NUM(SysFlags[6]);
		}
		SysFlags[6]=ISNUM(tsf);
		x=GetWord(x,buf);
		goto l2;
	}	
	SysFlags[2]=ISNUM(FindCWord(buf,3));
	if(NUM(SysFlags[2])== -1 && qnoun!= -1)
	{
		SysFlags[6]=ISNUM(backadj);
		SysFlags[2]=ISNUM(qnoun);
	}
	return(1);
}

/*
 *	Look up items and set flags accordingly
 */
 
void WhatThings()
{
	SysFlags[7]=FindIn(Me(),SysFlags[4],SysFlags[1]);
	SysFlags[8]=FindIn(LOC(Me()),SysFlags[4],SysFlags[1]);
	SysFlags[9]=SysFlags[7]!= -1?SysFlags[7]:SysFlags[8];
	SysFlags[10]=FindIn(Me(),SysFlags[6],SysFlags[2]);
	SysFlags[11]=FindIn(LOC(Me()),SysFlags[6],SysFlags[2]);
	SysFlags[12]=SysFlags[10]!= -1?SysFlags[10]:SysFlags[11];
	SysFlags[13]=FindAny(SysFlags[4],SysFlags[1]);
	SysFlags[14]=FindAny(SysFlags[6],SysFlags[2]);
}