home *** CD-ROM | disk | FTP | other *** search
- /*********************************************************/
- /* */
- /* 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. */
- /* */
- /*********************************************************/
-
- /* second pistol module, February, 1982 */
-
- #include "bdscio.h"
- #include "pistol.h"
-
- init()
- {int psemcol(),wstore(),times(),plus(),subtract(),
- divmod(),pif(),wat(),abort(),sp(),
- load(),pelse(),wrd(),rp(),drop(),
- puser(),exec(),exitop(),lit(),rpop(),
- swap(),tyi(),tyo(),rpsh(),semicf(),
- rat(),compme(),comphere(),dollarc(),colon(),
- semcol(),ifop(),elseop(),thenop(),doop(),
- loopop(),beginop(),endop(),repet(),geoln(),pdollar(),
- pcolon(),casat(),pdo(),pploop(),plloop(),
- cat(),cstore(),ploop(),gt(),semidol(),
- kernq(),strange(),sat(),findop(),listfil(),
- lat(),ofcas(),ccolon(),semicc(),ndcas(),
- pofcas(),pccol(),psemicc(),getline(),intoken(),
- openr(),openw(),readl(),writl(),cordmp(),
- restor();
-
- farray[PSEMICOL]=psemcol;
- farray[WSTORE]=wstore;
- farray[TIMES]=times;
- farray[PLUS]=plus;
- farray[SUBTRACT]=subtract;
- farray[DIVMOD]=divmod;
- farray[PIF]=pif;
- farray[WAT]=wat;
- farray[ABRT]=abort;
- farray[SP]=sp;
- farray[LOAD]=load;
- farray[PELSE]=pelse;
- farray[WRD]=wrd;
- farray[RP]=rp;
- farray[DROPOP]=drop;
- farray[PUSER]=puser;
- farray[EXEC]=exec;
- farray[EXITOP]=exitop;
- farray[STRLIT]=farray[LIT]=lit;
- farray[RPOP]=rpop;
- farray[SWP]=swap;
- farray[TYI]=tyi;
- farray[TYO]=tyo;
- farray[RPSH]=rpsh;
- farray[SEMICF]=semicf;
- farray[RAT]=rat;
- farray[COMPME]=compme;
- farray[COMPHERE]=comphere;
- farray[DOLLARC]=dollarc;
- farray[COLON]=colon;
- farray[SEMICOLON]=semcol;
- farray[IFOP]=ifop;
- farray[ELSEOP]=elseop;
- farray[THENOP]=thenop;
- farray[DOOP]=doop;
- farray[LOOPOP]=loopop;
- farray[BEGINOP]=beginop;
- farray[ENDOP]=endop;
- farray[REPET]=repet;
- farray[PERCENT]=geoln;
- farray[PDOLLAR]=pdollar;
- farray[PCOLON]=pcolon;
- farray[CASAT]=casat;
- farray[PDOOP]=pdo;
- farray[PPLOOP]=pploop;
- farray[PLLOOP]=plloop;
- farray[CAT]=cat;
- farray[CSTORE]=cstore;
- farray[PLOOP]=ploop;
- farray[GT]=gt;
- farray[SEMIDOL]=semidol;
- farray[KRNQ]=kernq;
- farray[53]=farray[54]=strange;
- farray[SAT]=sat;
- farray[FINDOP]=findop;
- farray[LISTFIL]=listfil;
- farray[58]=strange;
- farray[LAT]=lat;
- farray[OFCAS]=ofcas;
- farray[CCOLON]=ccolon;
- farray[SEMICC]=semicc;
- farray[NDCAS]=ndcas;
- farray[POFCAS]=pofcas;
- farray[PCCOL]=pccol;
- farray[PSEMICC]=psemicc;
- farray[GTLIN]=getline;
- farray[WORD]=intoken();
- farray[OPENR]=openr;
- farray[OPENW]=openw;
- farray[READL]=readl;
- farray[WRITL]=writl;
- farray[CORDMP]=cordmp;
- farray[RESTOR]=restor;
-
- penter(2,"W!",WSTORE);
- penter(1,"*",TIMES);
- penter(1,"+",PLUS);
- penter(1,"-",SUBTRACT);
- penter(4,"/MOD",DIVMOD);
- penter(2,"W@",WAT);
- penter(5,"ABORT",ABRT);
- penter(2,"SP",SP);
- penter(4,"LOAD",LOAD);
- penter(1,"W",WRD);
- penter(2,"RP",RP);
- penter(4,"DROP",DROPOP);
- penter(4,"USER",PUSER);
- penter(4,"EXEC",EXEC);
- penter(4,"EXIT",EXITOP);
- penter(2,"R>",RPOP);
- penter(4,"SWAP",SWP);
- penter(3,"TYI",TYI);
- penter(3,"TYO",TYO);
- penter(2,"<R",RPSH);
- penter(2,";F",SEMICF);
- penter(2,"R@",RAT);
- penter(2,"$:",-DOLLARC);
- penter(1,":",-COLON);
- penter(1,";",-SEMICOLON);
- penter(2,"IF",-IFOP);
- penter(4,"ELSE",-ELSEOP);
- penter(4,"THEN",-THENOP);
- penter(2,"DO",-DOOP);
- penter(4,"LOOP",-LOOPOP);
- penter(5,"BEGIN",-BEGINOP);
- penter(3,"END",-ENDOP);
- penter(6,"REPEAT",-REPET);
- penter(1,"%",-PERCENT);
- penter(5,"CASE@",CASAT);
- penter(5,"+LOOP",-PLLOOP);
- penter(2,"C@",CAT);
- penter(2,"C!",CSTORE);
- penter(2,"GT",GT);
- penter(2,";$",-SEMIDOL);
- penter(7,"KERNEL?",KRNQ);
- penter(2,"S@",SAT);
- penter(4,"FIND",FINDOP);
- penter(8,"LISTFILE",LISTFIL);
- penter(2,"L@",LAT);
- penter(6,"OFCASE",-OFCAS);
- penter(2,"C:",-CCOLON);
- penter(2,";C",-SEMICC);
- penter(7,"ENDCASE",-NDCAS);
- penter(4,"(;C)",PSEMICC);
- penter(7,"GETLINE",GTLIN);
- penter(4,"WORD",WORD);
- penter(5,"OPENR",OPENR);
- penter(5,"OPENW",OPENW);
- penter(8,"READLINE",READL);
- penter(9,"WRITELINE",WRITL);
- penter(8,"COREDUMP",CORDMP);
- penter(7,"RESTORE",RESTOR);
- }
-
-
- tyi() /* inputs a character from the keyboard,buffered line*/
- { if(*ram[-15].pc == NEWLINE) cinline();
- else nextch();
- push(*ram[-15].pc);
- }
-
- psemcol()
- { ip=rstack[rptr--];
- }
-
- wstore()
- { drop(); drop(); Pw=stack[2+stkptr];
- *Pw=stack[1+stkptr];
- }
-
- times()
- { drop(); stack[stkptr] *= stack[1+stkptr];
- }
-
- plus()
- { drop(); stack[stkptr] += stack[1+stkptr];
- }
-
- subtract()
- { drop();stack[stkptr] -= stack[1+stkptr];
- }
-
- divmod()
- { if(stack[stkptr])
- {stack[1+stkptr]=
- stack[stkptr-1]/stack[stkptr];
- stack[stkptr]=
- stack[-1+stkptr]%stack[stkptr];
- stack[stkptr-1]=stack[stkptr+1];
- }
- else merr(divby0);
- }
-
- pif()
- { drop();
- if(stack[1+stkptr]) ip+=W;
- else{Pw=ip;ip+=*Pw;}
- }
-
- wat()
- { Pw=stack[stkptr]; stack[stkptr]=*Pw;
- }
-
- sp()
- { push(stkptr); }
-
- load()
- { drop();
- ram[-11].in=stack[stkptr+1];
- if(ram[-11].in>MAXLINNO)
- {movmem(ram[-11].pc+1,infil1,
- *ram[-11].pc);
- infil1[*ram[-11].pc]='\0';
- if(fopen(infil1,ldfil1) == ERROR)
- {printf("can't open %s\n",
- infil1);
- abort();
- }
- ram[-29].in=0;
- }
- }
-
- pelse()
- { Pw=ip; ip += *Pw;}
-
- wrd()
- { push(W); }
-
- rp()
- { push(rptr); }
-
- puser()
- { push(ram); }
-
- exec()
- { instr=stack[stkptr]; drop();
- if(instr<(RESTOR+1)) (*farray[instr])();
- else {rpush(ip);ip=instr;}
- }
-
- exitop()
- { if(lptr<3) abort();
- else lstack[lptr]=lstack[lptr-1];
- }
-
- lit()
- { Pw=ip; push(*Pw); ip +=W; }
-
- rpop()
- { push(rstack[rptr]);rptr--; }
-
- tyo()
- { drop(); chout(stack[stkptr+1]); }
-
- rpsh()
- { rpush(stack[stkptr]);drop(); }
-
- semicf()
- { if(ram[-24].in) carret();
- if((ram[-11].in<MAXLINNO)&&(ram[-11].in>0))
- {ram[-11].in--;
- printf("\n THROUGH LINE %d(DECIMAL) LOADED\n",
- ram[-11].in);
- if(ram[-12].in)
- fprintf(list,
- "\n THROUGH LINE %d(DECIMAL) LOADED\n",
- ram[-11].in);
- }
- if(ram[-11].in>=MAXLINNO)
- {printf("%s LOADED\n",infil1);
- if(ram[-12].in)
- fprintf(list,"%s LOADED\n",infil1);
- }
- ram[-11].in=0;
- }
-
- rat()
- { drop();
- if(rptr<stack[1+stkptr])merr(undflo);
- push(rstack[rptr-stack[stkptr+1]]);
- }
-
- compme()
- { Pw2=ip;Pw2 -= 4; j=*Pw2; Pw2=ip;
- while(Pw2<j) {compile(*Pw2);Pw2++;}
- ip=rstack[rptr--];
- }
-
- comphere()
- { compile(ip);
- ip=rstack[rptr--];
- }
-
- dollarc()
- { pushck('$');compile(PDOLLAR);
- fwdref();
- }
-
- colon()
- { pushck(':'); compile(PCOLON);
- fwdref();
- }
-
- semcol()
- { if(strings[1+strings[1]]==':')
- {dropck();compile(PSEMICOLON);touchup();}
- else synterr();
- }
-
- ifop()
- { pushck('F');compile(PIF);fwdref(); }
-
- elseop()
- { if(strings[1+strings[1]]=='F')
- {strings[1+strings[1]]='E';
- compile(PELSE);fwdref();
- swap();touchup();
- }
- else synterr();
- }
-
- thenop()
- { Pc= &strings[1]; Pc += *Pc;
- if((*Pc=='F')||(*Pc=='E'))
- {dropck();touchup();}
- else synterr();
- }
-
- doop()
- { pushck('D');compile(PDOOP);fwdref(); }
-
- loopop()
- { if(strings[1+strings[1]]=='D')
- {dropck(); compile(PLOOP);
- compile(stack[stkptr]-ram[-2].in+W);
- touchup();
- }
- else synterr();
- }