[comp.sources.unix] v10i024: Logo interpreter for Unix, Part04/06

rs@uunet.UU.NET (Rich Salz) (06/24/87)

Submitted by: Brian Harvey <bh@mit-amt>
Mod.Sources: Volume 10, Number 24
Archive-Name: logo/Part04

#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 4 (of 6)."
# Contents:  logo.y
# Wrapped by rsalz@pineapple.bbn.com on Wed Jun 24 14:26:59 1987
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f logo.y -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"logo.y\"
else
echo shar: Extracting \"logo.y\" \(19535 characters\)
sed "s/^X//" >logo.y <<'END_OF_logo.y'
X
X%nonassoc LOWPREC
X%nonassoc '<' '>' '='
X%left '+' '-'
X%left '*' '/' '\\'
X%left '^'
X%left UNARY
X%token TWOOP ONEOP NOOP ONECOM
X%token CSTRING UINT
X%token LTO IFCOM LEDIT LIFTF LTRACE
X%token LPROC LPEND LAEND LGO
X%token CLIST TWOCOM NOCOM
X%token RUNCOM RNEND REPCOM THREECOM
X%{ 
X#include "logo.h"
X
Xchar popname[NAMELEN+1];
Xint multnum;
Xstruct object *multarg = 0;
X#include <setjmp.h>
Xextern jmp_buf runret;
Xjmp_buf yerrbuf;
Xint catching = 0;
Xint flagquit = 0;
Xextern struct runblock *thisrun;
X#ifndef NOTURTLE
Xextern int turtdes;
Xextern struct display *mydpy;
X#endif
Xint errtold = 0;
Xint yyline =0;
Xchar ibuf[IBUFSIZ] ={0};
Xchar *ibufptr =NULL;
Xchar *getbpt =0;
Xchar titlebuf[100] ={0};
Xchar *titleptr =NULL;
Xextern char *cpystr();
Xint letflag =0;
Xint topf =0;
Xint pflag =0;
Xchar charib =0;
Xint endflag =0, rendflag = 0;
Xint traceflag =0;
Xint currtest = 0;
Xint argno =(-1);
Xint *stkbase =NULL;
Xint stkbi =0;
Xstruct stkframe *fbr =NULL;
Xstruct plist *proclist =NULL;
X#ifdef PAUSE
Xint pauselev = 0;
Xextern int psigflag,errpause;
X#endif
X
Xstruct object *add(), *sub(), *mult(), *div(), *rem(), *and(), *or();
Xstruct object *greatp(), *lessp(), *lmax(), *lmin(), *lis();
Xstruct object *worcat(), *sencat(), *equal(), *lemp(), *comp();
Xstruct object *lnump(), *lsentp(), *lwordp(), *length(), *zerop();
Xstruct object *first(), *butfir(), *last(), *butlas(), *alllk();
Xstruct object *lnamep(), *lrandd(), *rnd(), *sq(), *lpow(), *lsin();
Xstruct object *lcos(), *latan(), *ltime(), *request(), *readlist();
Xstruct object *cmprint(), *cmtype(), *cmoutput(), *lsleep(), *lbreak();
Xstruct object *cmlocal(), *assign(), *cmedit(), *lstop(), *show(), *erase();
Xstruct object *help(), *describe(), *ltrace(), *luntrace(), *lbyecom();
Xstruct object *sometrace();
X#ifndef NOTURTLE
Xstruct object *getturtle(), *forward(), *back();
Xstruct object *left(), *right(), *penup(), *cmpendown(), *clearscreen();
Xstruct object *fullscreen(), *splitscreen(), *showturtle();
Xstruct object *hideturtle(), *textscreen(), *cmpenerase(), *pencolor();
Xstruct object *wipeclean(), *penmode(), *penreverse(), *shownp(), *towardsxy();
Xstruct object *setcolor(), *setxy(), *setheading();
Xstruct object *xcor(), *ycor(), *heading(), *getpen();
Xstruct object *scrunch(), *setscrunch();
X#endif
Xstruct object *ltopl(), *cmfprint(), *cmftype(), *pots(), *fput(), *lput();
Xstruct object *list(), *loread(), *lowrite(), *fileclose(), *cbreak();
Xstruct object *lfread(), *lfword(), *fileprint(), *filefprint();
Xstruct object *filetype(), *fileftype(), *callunix(), *repcount();
X#ifdef DEBUG
Xstruct object *setdebquit(), *setmemtrace(), *setyaccdebug();
X#endif
Xstruct object *readchar(), *keyp(), *intpart(), *round(), *toascii();
Xstruct object *tochar(), *loflush(), *settest(), *memberp(), *item();
X#ifdef PAUSE
Xstruct object *unpause(), *dopause(), *setipause(), *setqpause(); /* PAUSE */
Xstruct object *seterrpause(), *clrerrpause();
X#endif
X#ifdef FLOOR
Xstruct object *hitoot(), *lotoot(), *lampon(), *lampoff();
Xstruct object *ftouch(), *btouch(), *ltouch(), *rtouch();
X#endif
X#ifndef SMALL
Xstruct object *gprop(), *plist(), *pps(), *remprop();
X#endif
X#ifdef SETCURSOR
Xstruct object *clrtxt(), *setcur();
X#endif
X
Xstruct lexstruct keywords[] =
X{
X	"sum",TWOOP,add,NULL,
X	"difference",TWOOP,sub,"diff",
X	"product",TWOOP,mult,NULL,
X	"quotient",TWOOP,div,NULL,
X	"remainder",TWOOP,rem,"mod",
X	"both",TWOOP,and,"and",
X	"either",TWOOP,or,"or",
X	"greaterp",TWOOP,greatp,NULL,
X	"lessp",TWOOP,lessp,NULL,
X	"maximum",TWOOP,lmax,"max",
X	"minimum",TWOOP,lmin,"min",
X	"is",TWOOP,lis,NULL,
X	"word",TWOOP,worcat,NULL,
X	"sentence",TWOOP,sencat,"se",
X	"equalp",TWOOP,equal,NULL,
X	"emptyp",ONEOP,lemp,NULL,
X	"not",ONEOP,comp,NULL,
X	"numberp",ONEOP,lnump,NULL,
X	"sentencep",ONEOP,lsentp,NULL,
X	"wordp",ONEOP,lwordp,NULL,
X	"count",ONEOP,length,NULL,
X	"zerop",ONEOP,zerop,NULL,
X	"first",ONEOP,first,NULL,
X	"butfirst",ONEOP,butfir,"bf",
X	"last",ONEOP,last,NULL,
X	"butlast",ONEOP,butlas,"bl",
X	"thing",ONEOP,alllk,NULL,
X	"namep",ONEOP,lnamep,NULL,
X	"random",ONEOP,rnd,"rnd",
X	"sqrt",ONEOP,sq,NULL,
X	"pow",TWOOP,lpow,NULL,
X	"sin",ONEOP,lsin,NULL,
X	"cos",ONEOP,lcos,NULL,
X	"arctan",ONEOP,latan,"atan",
X	"time",NOOP,ltime,NULL,
X	"request",NOOP,request,NULL,
X	"readlist",NOOP,readlist,"rl",
X	"print",ONECOM,cmprint,"pr",
X	"type",ONECOM,cmtype,NULL,
X	"output",ONECOM,cmoutput,"op",
X	"wait",ONECOM,lsleep,NULL,
X	"local",ONECOM,cmlocal,NULL,
X	"make",TWOCOM,assign,NULL,
X	"if",IFCOM,0,NULL,
X	"to",LTO,0,NULL,
X	"end",LPEND,0,NULL,
X	"stop",NOCOM,lstop,NULL,
X	"break",NOCOM,lbreak,NULL,
X	"edit",LEDIT,cmedit,"ed",
X	"go",LGO,0,NULL,
X	"show",ONECOM,show,"po",
X	"erase",ONECOM,erase,"er",
X	"help",NOCOM,help,NULL,
X	"describe",ONECOM,describe,NULL,
X	"trace",LTRACE,sometrace,NULL,
X	"untrace",NOCOM,luntrace,NULL,
X	"goodbye",NOCOM,lbyecom,"bye",
X#ifndef NOTURTLE
X	"turtle",ONECOM,getturtle,"tur",
X	"forward",ONECOM,forward,"fd",
X	"back",ONECOM,back,"bk",
X	"left",ONECOM,left,"lt",
X	"right",ONECOM,right,"rt",
X#ifdef FLOOR
X	"hitoot",ONECOM,hitoot,"hit",
X	"lotoot",ONECOM,lotoot,"lot",
X	"lampon",NOCOM,lampon,"lon",
X	"lampoff",NOCOM,lampoff,"loff",
X#endif
X	"penup",NOCOM,penup,"pu",
X	"pendown",NOCOM,cmpendown,"pd",
X	"clearscreen",NOCOM,clearscreen,"cs",
X	"fullscreen",NOCOM,fullscreen,"full",
X	"splitscreen",NOCOM,splitscreen,"split",
X	"showturtle",NOCOM,showturtle,"st",
X	"hideturtle",NOCOM,hideturtle,"ht",
X	"textscreen",NOCOM,textscreen,"text",
X	"penerase",NOCOM,cmpenerase,"pe",
X	"pencolor",ONECOM,pencolor,"penc",
X	"setcolor",TWOCOM,setcolor,"setc",
X	"setxy",TWOCOM,setxy,NULL,
X	"setheading",ONECOM,setheading,"seth",
X	"wipeclean",NOCOM,wipeclean,"clean",
X	"penmode",NOOP,penmode,NULL,
X	"penreverse",NOCOM,penreverse,"px",
X	"shownp",NOOP,shownp,NULL,
X	"towardsxy",TWOOP,towardsxy,NULL,
X#ifdef FLOOR
X	"ftouch",NOOP,ftouch,"fto",
X	"btouch",NOOP,btouch,"bto",
X	"ltouch",NOOP,ltouch,"lto",
X	"rtouch",NOOP,rtouch,"rto",
X#endif
X	"xcor",NOOP,xcor,NULL,
X	"ycor",NOOP,ycor,NULL,
X	"heading",NOOP,heading,NULL,
X	"getpen",NOOP,getpen,NULL,
X	"scrunch",NOOP,scrunch,NULL,
X	"setscrunch",ONECOM,setscrunch,"setscrun",
X#endif
X	"toplevel",NOCOM,ltopl,NULL,
X	"fprint",ONECOM,cmfprint,"fp",
X	"ftype",ONECOM,cmftype,"fty",
X	"pots",NOCOM,pots,NULL,
X	"fput",TWOOP,fput,NULL,
X	"lput",TWOOP,lput,NULL,
X	"list",TWOOP,list,NULL,
X	"openread",ONEOP,loread,"openr",
X	"openwrite",ONEOP,lowrite,"openw",
X	"close",ONECOM,fileclose,NULL,
X	"fileread",ONEOP,lfread,"fird",
X	"fileword",ONEOP,lfword,"fiwd",
X	"fileprint",TWOCOM,fileprint,"fip",
X	"filefprint",TWOCOM,filefprint,"fifp",
X	"filetype",TWOCOM,filetype,"fity",
X	"fileftype",TWOCOM,fileftype,"fifty",
X	"unix",ONECOM,callunix,NULL,
X	"run",RUNCOM,0,NULL,
X	"repeat",REPCOM,0,NULL,
X	"repcount",NOOP,repcount,NULL,
X#ifdef DEBUG
X	"debquit",NOCOM,setdebquit,NULL,
X	"memtrace",NOCOM,setmemtrace,NULL,
X	"yaccdebug",NOCOM,setyaccdebug,NULL,
X#endif
X	"cbreak",ONECOM,cbreak,NULL,
X	"readchar",NOOP,readchar,"rc",
X	"keyp",NOOP,keyp,NULL,
X	"int",ONEOP,intpart,NULL,
X	"round",ONEOP,round,NULL,
X	"ascii",ONEOP,toascii,NULL,
X	"char",ONEOP,tochar,NULL,
X	"oflush",NOCOM,loflush,NULL,
X#ifndef SMALL
X	"gprop",TWOOP,gprop,NULL,
X	"plist",ONEOP,plist,NULL,
X	"pprop",THREECOM,0,NULL,
X	"pps",NOCOM,pps,NULL,
X	"remprop",TWOCOM,remprop,NULL,
X#endif
X	"test",ONECOM,settest,NULL,
X	"iftrue",LIFTF,(struct object *(*)())1,"ift",
X	"iffalse",LIFTF,0,"iff",
X	"memberp",TWOOP,memberp,NULL,
X	"item",TWOOP,item,"nth",
X#ifdef PAUSE
X	"continue",NOCOM,unpause,"co",
X	"pause",NOCOM,dopause,NULL,
X	"setipause",NOCOM,setipause,NULL,
X	"setqpause",NOCOM,setqpause,NULL,
X	"errpause",NOCOM,seterrpause,NULL,
X	"errquit",NOCOM,clrerrpause,NULL,
X#endif
X#ifdef SETCURSOR
X	"cleartext",NOCOM,clrtxt,"ct",
X	"setcursorxy",TWOCOM,setcur,"setcxy",
X#endif
X	NULL,NULL,NULL,NULL,
X};
X
X#define uperror {errtold++;YYERROR;}
X
X#ifdef PAUSE
X#define catch(X) {if(!setjmp(yerrbuf)){if(flagquit)errhand();catching++;X;catching=0;}else{catching=0;uperror}}
X#else
X#define catch(X) {X;}
X#endif
X%}
X%%
Xstart_sym :  |
X	 start_sym command  ={
X		popname[0] = '\0';
X#ifdef PAUSE
X		if (psigflag) dopause();
X#endif
X		yyprompt(1);
X	} |
X	start_sym error ={
X		popname[0] = '\0';
X		if (!errtold) {
X			logoyerror();
X		}
X		errtold = 0;
X		errwhere();
X#ifdef PAUSE
X		if ((!errpause&&!pauselev) || !fbr)
X#endif
X			errzap();
X		yyerrok;yyclearin;
X		yyprompt(0);
X	};
Xcommand :
X	LEDIT rnewline ={
X		catch(doedit(););
X		$$ = -1;
X	} |
X	LTRACE rnewline ={
X		catch(ltrace(););
X		$$ = -1;
X	} |
X	onecom valuearg newline ={
X		catch($$=(int)(*keywords[$1].lexval)($2););} |
X	onecom error ={notenf($1);uperror;} |
X	TWOCOM valuearg valuearg newline ={
X		catch((*keywords[$1].lexval)($2,$3);); $$ = -1;} |
X	TWOCOM error ={notenf($1);uperror;} |
X	THREECOM valuearg valuearg valuearg newline ={
X#ifndef SMALL
X		catch(pprop($2,$3,$4););
X#endif
X		$$ = -1;
X	} |
X	THREECOM error ={
X		if (!errtold) {
X			puts("Not enough inputs to pprop.");
X		}
X		uperror;
X	} |
X	rnewline ={ $$= -1; } |
X	NOCOM newline ={
X		catch((*keywords[$1].lexval)();); $$= -1;} |
X	LGO white3 valuearg newline ={
X		catch(go($3););
X		$$= -1;
X		} |
X	LGO error ={notenf($1);uperror;} |
X	ifcall ={
X		if (($1 != -1) && !endflag) {
X			if (!errtold)
X				pf1("You don't say what to do with %l.\n",$1);
X			uperror;
X		}
X		$$ = $1;
X	} |
X	title ={
X		if ($1== -1)
X			uperror
X		else
X			catch(proccreate($1););
X			$$ = -1;
X	} |
X	arg newline {
X		if (thisrun && !pflag) {
X			$$ = $1;
X		} else {
X			if(($1 != -1) && !endflag) {
X				if (!errtold)
X					pf1("You don't say what to do with %l\n",$1);
X				uperror;
X			}
X		}
X	} ;
X
Xonecom : ONECOM | LEDIT | LTRACE ;
X
Xvaluearg:	userarg ={
X			if ($1 == -1) {
X				if (!errtold) {
X					printf("%s didn't output.\n",
X						popname);
X				}
X				uperror;
X			}
X		} |
X		sysarg ;
X
Xlabint : UINT %prec UNARY ={ yyline=((struct object *)$1)->obint; mfree($1); $$ = 0;};
X
Xarg :	userarg | sysarg ;
X
Xuserarg : proccall %prec UNARY |
X	runcall %prec LOWPREC ;
X
Xsysarg : TWOOP valuearg valuearg %prec LOWPREC ={
X		catch($$=(int)(*keywords[$1].lexval)($2,$3););
X	} |
X	TWOOP valuearg error %prec LOWPREC ={op2er1($1,$2);uperror;} |
X	TWOOP error %prec LOWPREC ={notenf($1);uperror;} |
X	ONEOP valuearg %prec LOWPREC ={
X		catch($$=(int)(*keywords[$1].lexval)($2););
X	} |
X	ONEOP error %prec LOWPREC ={notenf($1);uperror;} |
X	NOOP %prec LOWPREC ={
X		catch($$=(int)(*keywords[$1].lexval)(););
X	} |
X	UINT %prec LOWPREC |
X	'\"' CSTRING { $$=$2; } |
X	'[' CLIST ']' { $$=$2; } |
X	':' CSTRING {
X		catch($$=(int)alllk($2););
X		} |
X	valuearg '+' valuearg ={
X		catch($$=(int)add($1,$3););
X	} |
X	valuearg '+' error ={inferr($1,$2);uperror;} |
X	valuearg '-' valuearg ={
X		catch($$=(int)sub($1,$3););
X	} |
X	valuearg '-' error ={inferr($1,$2);uperror;} |
X	'-' valuearg %prec UNARY ={
X		catch($$=(int)opp($2););
X	} |
X	'-' error %prec UNARY ={unerr('-');uperror;} |
X	valuearg '^' valuearg {
X		catch($$=(int)lpow($1,$3););
X	} |
X	valuearg '^' error { inferr($1,$2);uperror; } |
X	valuearg '*' valuearg ={
X		catch($$=(int)mult($1,$3););
X	} |
X	valuearg '*' error ={inferr($1,$2);uperror;} |
X	valuearg '/' valuearg ={
X		catch($$=(int)div($1,$3););
X	} |
X	valuearg '/' error ={inferr($1,$2);uperror;} |
X	valuearg '\\' valuearg ={
X		catch($$=(int)rem($1,$3););
X	} |
X	valuearg '\\' error ={inferr($1,$2);uperror;} |
X	valuearg '=' valuearg ={
X		catch($$=(int)equal($1,$3);)
X	} |
X	valuearg '=' error ={inferr($1,$2);uperror;} |
X	valuearg '<' valuearg ={
X		catch($$=(int)lessp($1,$3););
X	} |
X	valuearg '<' error ={inferr($1,$2);uperror;} |
X	valuearg '>' valuearg ={
X		catch($$=(int)greatp($1,$3););
X	} |
X	valuearg '>' error ={inferr($1,$2);uperror;} |
X	'{' TWOOP oparglist rbrak {
X		catch($$=multiop($2,globcopy(multarg)););
X		lfree(multarg);
X		multarg = 0;
X	}|
X	'(' TWOOP oparglist rbrak {
X		catch($$=multiop($2,globcopy(multarg)););
X		lfree(multarg);
X		multarg = 0;
X	}|
X	'(' valuearg rbrak ={$$=$2;} ;
X
Xoparglist : valuearg ={
X		catch(multarg = globcons($1,0););
X		mfree($1);
X		multnum = 1;
X	} |
X	valuearg oparglist ={
X		catch(multarg = globcons($1,multarg););
X		mfree($1);
X		multnum++;
X	};
Xtitle : tbegin varlist '\n' ={
X		strcpy(titleptr,"\n");
X		$$=$1;
X	} |
X	tbegin '\n' ={
X		strcpy(titleptr,"\n");
X		$$=$1;
X	} |
X	tbegin varlist error ={
X		mfree($1);
X		terr();
X		$$= -1;
X	} |
X	tbegin error ={
X		mfree($1);
X		terr();
X		$$= -1;
X	};
Xtbegin : LTO LPROC ={
X		titleptr=cpystr(titlebuf,"to ",
X			((struct object *)($2))->obstr,NULL);
X		$$=$2;
X	} | 
X	LTO primitive ={
X		if (!errtold) printf("Can't redefine primitive %s\n",
X			keywords[$2].word);
X		uperror;
X	};
Xprimitive : NOOP | ONEOP | TWOOP | NOCOM | ONECOM | TWOCOM | THREECOM
X		| IFCOM | LTO | LEDIT | LIFTF | LGO
X		| RUNCOM | REPCOM | LPEND ;
Xvarlist : varsyn ={titleptr=cpystr(titleptr," :",
X			((struct object *)($1))->obstr,NULL);
X		mfree($1);
X	} |
X	varlist varsyn {titleptr=cpystr(titleptr," :",
X			((struct object *)($2))->obstr,NULL);
X		mfree($2);
X	} ;
Xvarsyn : ':' CSTRING {$$=$2;};
Xproccall : procname args argend commlist procend ={
X		$$=$4;
X		frmpop($4);
X	} |
X	procname error ={
X		if (!errtold) printf("Not enough inputs to %s\n",
X			proclist->procname->obstr);
X		uperror;
X	};
Xargs: |	arglist;
Xarglist : valuearg %prec LOWPREC ={
X		catch(argassign($1););
X	} |
X	arglist valuearg %prec LOWPREC ={
X		catch(argassign($2););
X	} ;
Xargend : LAEND ={procprep();};
Xcommlist : ={yyline=1; $$ = -1;} |
X	commlist labint command ={
X		popname[0] = '\0';
X#ifdef PAUSE
X		if (psigflag) dopause();
X		if (thisrun && thisrun->str == (struct object *)(-1))
X			yyprompt(1);
X#endif
X		$$=$3;
X	} |
X	commlist command ={
X		popname[0] = '\0';
X		if (pflag) yyline++;
X#ifdef PAUSE
X		if (psigflag) dopause();
X		if (thisrun && thisrun->str == (struct object *)(-1))
X			yyprompt(1);
X#endif
X		$$=$2;
X	} |
X	commlist error ={
X		popname[0] = '\0';
X#ifdef PAUSE
X		if ((!errpause&&!pauselev) || !fbr)
X#endif
X			uperror;
X#ifdef PAUSE
X		if (!errtold) {
X			logoyerror();
X		}
X		errtold = 0;
X		errwhere();
X		yyerrok;yyclearin;
X		if (thisrun && thisrun->str == (struct object *)(-1))
X			yyprompt(0);
X#endif
X	};
Xprocend : LPEND |
X	labint LPEND ;
Xprocname : LPROC ={
X		catch(newproc($1););
X	};
Xrcommlist : ={$$ = -1;} |
X	rcommlist command ={
X		popname[0] = '\0';
X#ifdef PAUSE
X		if (psigflag) dopause();
X		if (thisrun && thisrun->str == (struct object *)(-1))
X			yyprompt(1);
X#endif
X		$$=$2;
X	} |
X	rcommlist error ={
X		popname[0] = '\0';
X#ifdef PAUSE
X		if ((!errpause&&!pauselev) || !fbr)
X#endif
X			uperror;
X#ifdef PAUSE
X		if (!errtold) {
X			logoyerror();
X		}
X		errtold = 0;
X		errwhere();
X		yyerrok;yyclearin;
X		if (thisrun && thisrun->str == (struct object *)(-1))
X			yyprompt(0);
X#endif
X	};
Xruncall : realrun | reprun | ifrun ;
Xrealrun : runstart rcommlist runend ={
X		unrun();
X		$$ = $2;
X		strcpy(popname,"run");
X	};
Xreprun : reprstart rcommlist runend ={
X		unrun();
X		$$ = $2;
X		strcpy(popname,"repeat");
X	};
Xifrun : ifrstart rcommlist runend ={
X		unrun();
X		$$ = $2;
X		strcpy(popname,"if");
X	};
Xrunstart : RUNCOM valuearg %prec LOWPREC ={
X		catch(dorun($2,(FIXNUM)0););
X	} ;
Xreprstart : REPCOM valuearg valuearg %prec LOWPREC ={
X		catch(dorep($2,$3););
X	} ;
Xifrstart : IFCOM valuearg valuearg valuearg %prec LOWPREC ={
X		{
X			int i;
X
X			catch(i = truth($2););
X			if (i) {
X				catch(dorun($3,(FIXNUM)0););
X				mfree($4);
X			} else {
X				catch(dorun($4,(FIXNUM)0););
X				mfree($3);
X			}
X		}
X	} |
X	IFCOM error ={
X		if (!errtold) printf("Not enough inputs to if.\n");
X		uperror;
X	} ;
Xrunend : RNEND;
Xifcall : ifstart rcommlist runend ={
X		unrun();
X		$$ = $2;
X	};
Xifstart : IFCOM valuearg valuearg rnewline ={
X		{
X			int i;
X
X			catch(i = truth($2););
X			if (i) {catch(dorun($3,(FIXNUM)0););}
X			else {
X				catch(dorun(0,(FIXNUM)0););
X				mfree($3);
X			}
X		}
X	} |
X	LIFTF valuearg newline ={
X		if ((int)keywords[$1].lexval==currtest) {
X			catch(dorun($2,(FIXNUM)0););
X		} else {
X			catch(dorun(0,(FIXNUM)0););
X			mfree($2);
X		}
X	} ;
Xwhite3 : | LTO ;
Xrbrak : '}' | ')' ;
Xnewline	: '\n' | ';' | ;
Xrnewline : '\n' | ';' ;
X%%
X
Xextern struct object *makelist();
X
X#ifdef PAUSE
Xyylex1()
X#else
Xyylex()
X#endif
X{
X	register char *str;
X	char s[100];
X	char c;
X	register pc;
X	register i;
X	NUMBER dubl;
X	int floatflag;
X	FIXNUM fixn;
X
X	if (yyerrflag) return(1);
X	else if (argno==0 && pflag!=1) {
X		if (fbr->oldyyc==-2) fbr->oldyyc= -1;
X		return(LAEND);
X	} else if (endflag==1 && pflag>1) {
X		endflag=0;
X		return(LPEND);
X	}
X	else if (pflag==2) {
X		pc= *(stkbase+stkbi++);
X		if (stkbi==PSTKSIZ-1) {
X			stkbase= (int *)(*(stkbase+PSTKSIZ-1));
X			stkbi=1;
X		}
X		yylval= *(stkbase+stkbi++);
X		if (pc==LPROC || pc==CSTRING || pc==UINT || pc==CLIST) {
X			yylval=(int)localize((struct object *)yylval);
X		}
X		if (stkbi==PSTKSIZ-1) {
X			stkbase= (int *)(*(stkbase+PSTKSIZ-1));
X			stkbi=1;
X		}
X		if (pc== -1) return(0);
X		else return(pc);
X	} else if (letflag==1) {
X		str=s;
X		while (!index(" \t\n[](){}\";",(c = getchar()))) {
X			if (c == '\\') c = getchar() /* |0200 */ ;
X			else if (c == '%') c = ' ' /* |0200 */ ;
X			*str++ = c;
X		}
X		charib=c;
X		*str='\0';
X		yylval=(int)localize(objcpstr(s));
X		letflag=0;
X		return(CSTRING);
X	} else if (letflag==2) {
X		str = s;
X		while (( (c=getchar())>='a' && c<='z' )
X				|| (c>='A' && c<='Z') || (c>='0' && c<='9')
X				|| (c=='.') || (c=='_') ) {
X			if (c>='A' && c<='Z') c += 040;
X			*str++ = c;
X		}
X		charib = c;
X		*str = '\0';
X		letflag = 0;
X		yylval = (int)localize(objcpstr(s));
X		return(CSTRING);
X	}
X	else if (letflag==3) {
X		yylval = (int)makelist();
X		letflag = 4;
X		return(CLIST);
X	}
X	else if (letflag==4) {
X		letflag = 0;
X		return(yylval = getchar());
X	}
X	while ((c=getchar())==' ' || c=='\t')
X		;
X	if (rendflag) {
X		getbpt = 0;
X		if (rendflag < 3)
X			--rendflag;
X		else if (!thisrun || thisrun->svpflag)
X			rendflag = 0;
X		return(RNEND);
X	}
X
X	if (c == '!')	/* comment feature */
X		while ((c=getchar()) && (c != '\n')) ;
X
X	if ((c<'a' || c>'z') && (c<'A' || c>'Z')
X			&& (c<'0' || c>'9') && c!='.') {
X		yylval=c;
X		if (c=='\"') letflag=1;
X		if (c==':') letflag=2;
X		if (c=='[') letflag=3;
X		return(c);
X	}
X	else if ((c>='0' && c<='9')|| c=='.') {
X		floatflag = (c=='.');
X		str=s;
X		while ((c>='0' && c<='9')||(c=='E')||(c=='e')||(c=='.')) {
X			*str++=c;
X			if (c=='.') floatflag++;
X			if ((c=='e')||(c=='E')) {
X				floatflag++;
X				c = getchar();
X				if ((c=='+')||(c=='-')) {
X					*str++ = c;
X					c = getchar();
X				}
X			} else c=getchar();
X		}
X		charib=c;
X		*str='\0';
X		if (floatflag) {
X			sscanf(s,EFMT,&dubl);
X			yylval=(int)localize(objdub(dubl));
X		} else {
X			sscanf(s,FIXFMT,&fixn);
X			yylval=(int)localize(objint(fixn));
X		}
X		return(UINT);
X	} else {
X		if (c < 'a') c += 040;
X		yylval=(int)(str=s);
X		*str++=c;
X		c=getchar();
X		if (c >= 'A' && c <= 'Z') c += 040;
X		while ((c>='a' && c<='z') || (c>='0' && c<='9')
X				|| (c=='.') || (c=='_')) {
X			*str++=c;
X			c=getchar();
X			if (c >= 'A' && c <= 'Z') c += 040;
X		}
X		charib=c;
X		*str='\0';
X		for (i=0; keywords[i].word; i++) {
X			if (!strcmp(yylval,keywords[i].word) ||
X 			    (keywords[i].abbr && 
X 			     !strcmp(yylval,keywords[i].abbr))) {
X				yylval=i;
X				return(keywords[i].lexret);
X			}
X		}
X		yylval=(int)localize(objcpstr(s));
X		return(LPROC);
X	}
X}
X
X#ifdef PAUSE
Xyylex() {
X	int x;
X
X	if (catching) return(yylex1());
X	if (!setjmp(yerrbuf)) {
X		if (flagquit) errhand();
X		catching++;
X		x = yylex1();
X		catching=0;
X		return(x);
X	} else {
X		catching=0;
X		return(12345);	/* This should cause an error up there */
X	}
X}
X#endif
X
Xint isuint(x)
Xint x;
X{
X	return(x == UINT);
X}
X
Xint isstored(x)
Xint x;
X{
X	return(x==UINT || x==LPROC || x==CSTRING || x==CLIST);
X}
X
Xyyprompt(clear) {
X	register int i;
X
X	if (!ibufptr && !getbpt && !pflag) {
X		flagquit = 0;
X#ifdef PAUSE
X		if (pauselev > 0) {
X			for (i=pauselev; --i >=0; )
X				putchar('-');
X		}
X#endif
X		putchar('?');
X#ifndef NOTURTLE
X		if ((turtdes<0) && clear)
X			(*mydpy->state)('*');
X#endif
X		fflush(stdout);
X	}
X}
X
END_OF_logo.y
if test 19535 -ne `wc -c <logo.y`; then
    echo shar: \"logo.y\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of archive 4 \(of 6\).
cp /dev/null ark4isdone
MISSING=""
for I in 1 2 3 4 5 6 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 6 archives.
    echo "Now see the README"
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0