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