#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]);
}