/*********************************************************/
/*                                                       */
/* PISTOL-Portably Implemented Stack Oriented Language   */
/*                      Version 1.3                      */
/* (C) 1982 by  Ernest E. Bergmann                       */
/*              Physics, Building #16                    */
/*              Lehigh Univerisity                       */
/*              Bethlehem, Pa. 18015                     */
/*                                                       */
/* Permission is hereby granted for all reproduction and */
/* distribution of this material provided this notice is */
/* is included.                                          */
/*                                                       */
/*********************************************************/

/* fifth module, February, 1982 */

#include "bdscio.h"
#include "pistol.h"

int *find(ptoken) /*returns address of dict'ary word or FALS*/
int *ptoken; /* string to be looked up;"int" more efficient*/
{int *loc,*v;
       for(loc=FALS,v=ram[-32].pw;(v>&ram[VBASE-1])
                                       && !loc ;v--)
               loc=vfind(ptoken,v);
       return(loc);
}

int *vfind(ptoken,v)
int *ptoken,*v;
{/*vloc &vmatch are at end of pist.h*/
       vloc=*v; vloc=*vloc;
       if(vloc) do
       {vmatch=FALS;
       if(Pw=*(vloc-2),*Pw==*ptoken)
               vmatch=pstrcmp(ptoken);
       if(!vmatch)
               vloc=*(vloc-3);
       }
       while(vloc && !vmatch);
       return(vloc);
}

char pstrcmp(str2) /* returns FALS if not a PISTOL string
                               match*/
char *str2;
{/*char pcount,*Pc3; is at end of pist.h*/
       Pc3=Pw;
       pcount=*Pc3; Pc3++ ; str2 ++ ;
       for(; pcount ; --pcount,++Pc3,++str2)
               if(*Pc3 != *str2) break;
       return( !pcount );
}

intoken() /* Feb 13 remove need for ptr,partly ptr2 */
{char count,*ptr2;
       ptr2=ram[-4].pc;
       for(count=0;!white(*ram[-15].pc);nextch())
       {       count++ ; ptr2++ ;
               if(ram[-17].in) *ptr2=toupper(*ram[-15].pc) ;
               else *ptr2 =*ram[-15].pc ;
       }
       *ram[-4].pc=count ;
}

nextch() /* Feb 13 removed Pc crutch */
{if (*ram[-15].pc != NEWLINE) ram[-15].pc++ ; }

ignrblnks() /* Feb 13 removed Pc crutch */
{       while((*ram[-15].pc==9)
               ||(*ram[-15].pc==32)) ram[-15].pc++ ;
}

prompt()
{if(ram[-50].pw) interpret(ram[-50].pw);
else    {if(ram[-24].in) carret();
       if(ram[-14].in) putch(strings[0]);
       message(&strings[1]);
       if(ram[-14].in) puts("> ");
       if(ram[-12].in)fputs("> ",list);
       }
}

int white(c)    /* better than isspace(c) */
char c;
{       if(c==32) return(TRU);
       if(c==9)  return(TRU);
       if(c==NEWLINE)
                 return(TRU);
       return(c==0);
}