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