xref: /csrg-svn/old/ratfor/rlex.c (revision 62210)
148064Sbostic /*-
248064Sbostic  * %sccs.include.proprietary.c%
348064Sbostic  */
448064Sbostic 
514503Ssam #ifndef lint
6*62210Sbostic static char sccsid[] = "@(#)rlex.c	8.1 (Berkeley) 06/06/93";
748064Sbostic #endif /* not lint */
814503Ssam 
99729Sclemc # include "r.h"
109729Sclemc 
119729Sclemc char *keyword [] = {
129729Sclemc 	"do",
139729Sclemc 	"if",
149729Sclemc 	"else",
159729Sclemc 	"for",
169729Sclemc 	"repeat",
179729Sclemc 	"until",
189729Sclemc 	"while",
199729Sclemc 	"break",
209729Sclemc 	"next",
219729Sclemc 	"define",
229729Sclemc 	"include",
239729Sclemc 	"return",
249729Sclemc 	"switch",
259729Sclemc 	"case",
269729Sclemc 	"default",
279729Sclemc 	0};
289729Sclemc 
299729Sclemc int keytran[] = {
309729Sclemc 	DO,
319729Sclemc 	IF,
329729Sclemc 	ELSE,
339729Sclemc 	FOR,
349729Sclemc 	REPEAT,
359729Sclemc 	UNTIL,
369729Sclemc 	WHILE,
379729Sclemc 	BREAK,
389729Sclemc 	NEXT,
399729Sclemc 	DEFINE,
409729Sclemc 	INCLUDE,
419729Sclemc 	RETURN,
429729Sclemc 	SWITCH,
439729Sclemc 	CASE,
449729Sclemc 	DEFAULT,
459729Sclemc 	0};
469729Sclemc 
479729Sclemc char	*fcnloc;	/* spot for "function" */
489729Sclemc 
499729Sclemc int	svargc;
509729Sclemc char	**svargv;
519729Sclemc char	*curfile[10]	= { "" };
529729Sclemc int	infptr	= 0;
539729Sclemc FILE	*outfil	= { stdout };
549729Sclemc FILE	*infile[10]	= { stdin };
559729Sclemc int	linect[10];
569729Sclemc 
579729Sclemc int	contfld	= CONTFLD;	/* place to put continuation char */
589729Sclemc int	printcom	= 0;	/* print comments if on */
599729Sclemc int	hollerith	= 0;	/* convert "..." to 27H... if on */
609729Sclemc 
619729Sclemc #ifdef	gcos
629729Sclemc char	*ratfor	"tssrat";
639729Sclemc int	bcdrat[2];
649729Sclemc char	*bwkmeter	".           bwkmeter    ";
659729Sclemc int	bcdbwk[5];
669729Sclemc #endif
679729Sclemc 
main(argc,argv)689729Sclemc main(argc,argv) int argc; char **argv; {
699729Sclemc 	int i;
709729Sclemc 	while(argc>1 && argv[1][0]=='-') {
719729Sclemc 		if(argv[1][1]=='6') {
729729Sclemc 			contfld=6;
739729Sclemc 			if (argv[1][2]!='\0')
749729Sclemc 				contchar = argv[1][2];
759729Sclemc 		} else if (argv[1][1] == 'C')
769729Sclemc 			printcom++;
779729Sclemc 		else if (argv[1][1] == 'h')
789729Sclemc 			hollerith++;
799729Sclemc 		argc--;
809729Sclemc 		argv++;
819729Sclemc 	}
829729Sclemc 
839729Sclemc #ifdef	gcos
849729Sclemc 	if (!intss()) {
859729Sclemc 		_fixup();
869729Sclemc 		ratfor = "batrat";
879729Sclemc 	}
889729Sclemc 	ascbcd(ratfor,bcdrat,6);
899729Sclemc 	ascbcd(bwkmeter,bcdbwk,24);
909729Sclemc 	acdata(bcdrat[0],1);
919729Sclemc 	acupdt(bcdbwk[0]);
929729Sclemc 	if (!intss()) {
939729Sclemc 		if ((infile[infptr]=fopen("s*", "r")) == NULL)
949729Sclemc 			cant("s*");
959729Sclemc 		if ((outfil=fopen("*s", "w")) == NULL)
969729Sclemc 			cant("*s");
979729Sclemc 	}
989729Sclemc #endif
999729Sclemc 
1009729Sclemc 	svargc = argc;
1019729Sclemc 	svargv = argv;
1029729Sclemc 	if (svargc > 1)
1039729Sclemc 		putbak('\0');
1049729Sclemc 	for (i=0; keyword[i]; i++)
1059729Sclemc 		install(keyword[i], "", keytran[i]);
1069729Sclemc 	fcnloc = install("function", "", 0);
1079729Sclemc 	yyparse();
1089729Sclemc #ifdef	gcos
1099729Sclemc 	if (!intss())
1109729Sclemc 		bexit(errorflag);
1119729Sclemc #endif
1129729Sclemc 	exit(errorflag);
1139729Sclemc }
1149729Sclemc 
1159729Sclemc #ifdef gcos
bexit(status)1169729Sclemc bexit(status) {
1179729Sclemc 	/* this is the batch version of exit for gcos tss */
1189729Sclemc 	FILE *inf, *outf;
1199729Sclemc 	char c;
1209729Sclemc 
1219729Sclemc 	fclose(stderr);	/* make sure diagnostics get flushed */
1229729Sclemc 	if (status) /* abort */
1239729Sclemc 		_nogud();
1249729Sclemc 
1259729Sclemc 	/* good: copy output back to s*, call forty */
1269729Sclemc 
1279729Sclemc 	fclose(outfil,"r");
1289729Sclemc 	fclose(infile[0],"r");
1299729Sclemc 	inf = fopen("*s", "r");
1309729Sclemc 	outf = fopen("s*", "w");
1319729Sclemc 	while ((c=getc(inf)) != EOF)
1329729Sclemc 		putc(c, outf);
1339729Sclemc 	fclose(inf,"r");
1349729Sclemc 	fclose(outf,"r");
1359729Sclemc 	__imok();
1369729Sclemc }
1379729Sclemc #endif
1389729Sclemc 
cant(s)1399729Sclemc cant(s) char *s; {
1409729Sclemc 	linect[infptr] = 0;
1419729Sclemc 	curfile[infptr] = s;
1429729Sclemc 	error("can't open");
1439729Sclemc 	exit(1);
1449729Sclemc }
1459729Sclemc 
inclstat()1469729Sclemc inclstat() {
1479729Sclemc 	int c;
1489729Sclemc 	char *ps;
1499729Sclemc 	char fname[100];
1509729Sclemc 	while ((c = getchr()) == ' ' || c == '\t');
1519729Sclemc 	if (c == '(') {
1529729Sclemc 		for (ps=fname; (*ps=getchr()) != ')'; ps++);
1539729Sclemc 		*ps = '\0';
1549729Sclemc 	} else if (c == '"' || c == '\'') {
1559729Sclemc 		for (ps=fname; (*ps=getchr()) != c; ps++);
1569729Sclemc 		*ps = '\0';
1579729Sclemc 	} else {
1589729Sclemc 		putbak(c);
1599729Sclemc 		for (ps=fname; (*ps=getchr()) != ' ' &&*ps!='\t' && *ps!='\n' && *ps!=';'; ps++);
1609729Sclemc 		*ps = '\0';
1619729Sclemc 	}
1629729Sclemc 	if ((infile[++infptr] = fopen(fname,"r")) == NULL) {
1639729Sclemc 		cant(fname);
1649729Sclemc 		exit(1);
1659729Sclemc 	}
1669729Sclemc 	linect[infptr] = 0;
1679729Sclemc 	curfile[infptr] = fname;
1689729Sclemc }
1699729Sclemc 
1709729Sclemc char	str[500];
1719729Sclemc int	nstr;
1729729Sclemc 
yylex()1739729Sclemc yylex() {
1749729Sclemc 	int c, t;
1759729Sclemc 	for (;;) {
1769729Sclemc 		while ((c=gtok(str))==' ' || c=='\n' || c=='\t')
1779729Sclemc 			;
1789729Sclemc 		yylval = c;
1799729Sclemc 		if (c==';' || c=='{' || c=='}')
1809729Sclemc 			return(c);
1819729Sclemc 		if (c==EOF)
1829729Sclemc 			return(0);
1839729Sclemc 		yylval = (int) str;
1849729Sclemc 		if (c == DIG)
1859729Sclemc 			return(DIGITS);
1869729Sclemc 		t = lookup(str)->ydef;
1879729Sclemc 		if (t==DEFINE)
1889729Sclemc 			defstat();
1899729Sclemc 		else if (t==INCLUDE)
1909729Sclemc 			inclstat();
1919729Sclemc 		else if (t > 0)
1929729Sclemc 			return(t);
1939729Sclemc 		else
1949729Sclemc 			return(GOK);
1959729Sclemc 	}
1969729Sclemc }
1979729Sclemc 
1989729Sclemc int	dbg	= 0;
1999729Sclemc 
yyerror(p)2009729Sclemc yyerror(p) char *p; {;}
2019729Sclemc 
2029729Sclemc 
defstat()2039729Sclemc defstat() {
2049729Sclemc 	int c,i,val,t,nlp;
2059729Sclemc 	extern int nstr;
2069729Sclemc 	extern char str[];
2079729Sclemc 	while ((c=getchr())==' ' || c=='\t');
2089729Sclemc 	if (c == '(') {
2099729Sclemc 		t = '(';
2109729Sclemc 		while ((c=getchr())==' ' || c=='\t');
2119729Sclemc 		putbak(c);
2129729Sclemc 	}
2139729Sclemc 	else {
2149729Sclemc 		t = ' ';
2159729Sclemc 		putbak(c);
2169729Sclemc 	}
2179729Sclemc 	for (nstr=0; c=getchr(); nstr++) {
2189729Sclemc 		if (type[c] != LET && type[c] != DIG)
2199729Sclemc 			break;
2209729Sclemc 		str[nstr] = c;
2219729Sclemc 	}
2229729Sclemc 	putbak(c);
2239729Sclemc 	str[nstr] = '\0';
2249729Sclemc 	if (c != ' ' && c != '\t' && c != '\n' && c != ',') {
2259729Sclemc 		error("illegal define statement");
2269729Sclemc 		return;
2279729Sclemc 	}
2289729Sclemc 	val = nstr+1;
2299729Sclemc 	if (t == ' ') {
2309729Sclemc 		while ((c=getchr())==' ' || c=='\t');
2319729Sclemc 		putbak(c);
2329729Sclemc 		for (i=val; (c=getchr())!='\n' && c!='#' && c!='\0'; i++)
2339729Sclemc 			str[i] = c;
2349729Sclemc 		putbak(c);
2359729Sclemc 	} else {
2369729Sclemc 		while ((c=getchr())==' ' || c=='\t' || c==',' || c=='\n');
2379729Sclemc 		putbak(c);
2389729Sclemc 		nlp  = 0;
2399729Sclemc 		for (i=val; nlp>=0 && (c=str[i]=getchr()); i++)
2409729Sclemc 			if (c == '(')
2419729Sclemc 				nlp++;
2429729Sclemc 			else if (c == ')')
2439729Sclemc 				nlp--;
2449729Sclemc 		i--;
2459729Sclemc 	}
2469729Sclemc 	for ( ; i>0; i--)
2479729Sclemc 		if (str[i-1] != ' ' && str[i-1] != '\t')
2489729Sclemc 			break;
2499729Sclemc 	str[i] = '\0';
2509729Sclemc 	install(str, &str[val], 0);
2519729Sclemc }
2529729Sclemc 
253