home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Interactive Guide
/
c-cplusplus-interactive-guide.iso
/
c_ref
/
csource3
/
122_01
/
pistol.c
< prev
next >
Wrap
Text File
|
1984-03-07
|
4KB
|
188 lines
/*********************************************************/
/* */
/* PISTOL-Portably Implemented Stack Oriented Language */
/* Version 2.0 */
/* (C) 1983 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 */
/* included. */
/* */
/*********************************************************/
/* main PISTOL v2.0 module for BDS 'C' v1.45a */
/* September 5, 1982 */
#include "bdscio.h"
#include "pistol.h"
/* CONSTANTS:
ram[..rammin-1]=future constants
ram[-21]=MININT
ram[-20]=MAXLINNO
ram[-19]=CHKLMT
ram[-18]=RAMMIN
ram[-17]=STRINGSMIN
ram[-16]=STRINGSMAX
ram[-15]=VBASE
ram[-14]=VSIZE
ram[-13]=CSIZE
ram[-12]=LSIZE
ram[-11]=RSIZE
ram[-10]=SSIZE
ram[-9]=LINEBUF
ram[-8]=COMPBUF
ram[-7]=RAMMAX
ram[-6]=MAXORD
ram[-5]=MAXINT
ram[-4]=VERSION
ram[-3]=NEWLINE
ram[-2]=READ PROTECTION BOOLEAN
ram[-1]=WRITE PROTECTION BOOLEAN
VARIABLES:
ram[0]=RADIX
ram[1]=.C
ram[2]=.D
ram[3]=CURRENT END OF STRINGS
ram[4]=OLD END OF STRINGS
ram[5]=CURRENT
ram[6]=PREV(VFIND)
ram[7]=INPUT FILE
ram[8]=LIST OUT BOOLEAN
ram[9]=ECHO OUT BOOLEAN
ram[10]=CONSOLE OUT BOOLEAN
ram[11]=NEXTCHAR POINTER
ram[12]=LINELENGTH
ram[13]=RAISE BOOLEAN lc -> UC
ram[14]=HEAD OF TOKEN IN LINE
ram[15]=TRACE BOOLEAN AND LEVEL
ram[16]=COMPILE END PATCH
ram[17]=TERMINAL PAGE LENGTH
ram[18]=#LINE OUTPUT TO CONSOLE
ram[19]=TERMINAL WIDTH
ram[20]=COLUMN
ram[21]=ENDCASE PATCH ADDRESS
ram[22]=TRACE PATCH ADDRESS
ram[23]=TABSIZE
ram[24]=#GETLINE PATCH ADDRESS
ram[25]=FILE STATUS FOR LDFIL
ram[26]=FILE STATUS FOR EDIN
ram[27]=FILE STATUS FOR EDOUT
ram[28]=^ VSTACK
ram[29]=^PISTOL<
ram[30]=NIL,TERMINATES VLIST
ram[31]=SESSION DONE BOOLEAN
ram[32]=PROMPT PATCH ADDRESS
ram[33]=CONVERSION PATCH
ram[34]=ABORT PATCH
ram[35..VBASE+1]=FUTURE VARIABLES EXPANSION
ram[VBASE..VBASE+VSIZE]=VSTACK
*/
main()
{
/*??? doc the uses of ram[-20..?] */
init(); /*contains penter and fills farray */
setjmp(jbuf); /* initialize return point */
/*reseting stacks returns i/o to tty: produces signon*/
ip=&ram; /*so ram[ip] is in range*/
ram[15].in=ram[7].in=ram[31].in=FALS;
ram[28].pw=&ram[VBASE];
ram[5].pw=ram[VBASE].pw=&ram[29];
stkptr=cptr=lptr=0;
rptr=-1;
strings[1]='\0';
ram[10].in=TRU;
if (listname[0]=='\0') ram[8].in=FALS;
/*turns off listing if no listfile is open*/
message(id);
/* ifcr */
if (ram[20].in) carret();
if (ram[34].pw) {instr=ram[34].un;interpret();}
/* user supplied supplement to ABORT */
goto L99;
do{ ram[1].pw=&ram[COMPBUF];
do compline();
while(strings[1]);
compile(PSEMICOLON);
if(ram[16].pw) {instr=ram[16].un;interpret();}
if(ram[10].in&&(!ram[7].in||ram[9].in))
ram[20].in=ram[18].in=FALS;
instr=&ram[COMPBUF];
interpret();
L99: ram[3].pc=ram[4].pc;
}
while( !ram[31].in );
printf("\nPISTOL NORMAL EXIT\n");
if(ram[8].in) fprintf(list,"\nPISTOL NORMAL EXIT\n");
if(listname[0]) closout(list);
if(namout[0]) closout(edout);
exit(); /*files need to be flushed and closed */
}
closout(iobuf)
char *iobuf;
{ putc(CPMEOF,iobuf);
fflush(iobuf); fclose(iobuf);
}
abort()
{ longjmp(jbuf); }
compline()
{/* static int inf,*pad; */
inf=ram[7].in;
if((!inf)||ram[9].in) prompt();
if((inf>0)&&(inf<MAXLINNO))
{push(inf);
instr=ram[24].un;
interpret();
ram[7].in++;
}
else getline();
ignrblnks();
while(*ram[11].pc != NEWLINE)
{ram[14].pc=ram[11].pc;
intoken();
push(ram[3].pc);
find(); pad=pop();
if(pad) {instr=pad-1;interpret();}
else {if(convert(ram[3].in,ram[0].in,&val))
{compile(LIT);compile(val);}
else {if(Pc=ram[3].pc+1,*Pc=='\'')
{pad=slit();compile(STRLIT);
compile(pad);}
else if(*Pc=='"')
{pad=longstring();
compile(STRLIT);compile(pad);}
else if(ram[33].in)
{instr=ram[33].un;interpret();}
else{/*token couldn't be deciphered*/
ram[10].in=TRU;
if(ram[7].in&&(!ram[9].in))
{if(ram[20].in) carret();
message(&strings[LINEBUF]);
}
message(ram[3].in);
printf(" ?\n");
if(ram[8].in)
fprintf(list," ?\n");
abort();
}
}
}
ignrblnks();
}
}
t()
{ longjmp(jbuf); }
compline()
{/* sta