xref: /csrg-svn/old/ratfor/rlex.c (revision 9729)
1*9729Sclemc /* @(#)rlex.c	1.1 (Berkeley) 12/15/82 */
2*9729Sclemc # include "r.h"
3*9729Sclemc 
4*9729Sclemc char *keyword [] = {
5*9729Sclemc 	"do",
6*9729Sclemc 	"if",
7*9729Sclemc 	"else",
8*9729Sclemc 	"for",
9*9729Sclemc 	"repeat",
10*9729Sclemc 	"until",
11*9729Sclemc 	"while",
12*9729Sclemc 	"break",
13*9729Sclemc 	"next",
14*9729Sclemc 	"define",
15*9729Sclemc 	"include",
16*9729Sclemc 	"return",
17*9729Sclemc 	"switch",
18*9729Sclemc 	"case",
19*9729Sclemc 	"default",
20*9729Sclemc 	0};
21*9729Sclemc 
22*9729Sclemc int keytran[] = {
23*9729Sclemc 	DO,
24*9729Sclemc 	IF,
25*9729Sclemc 	ELSE,
26*9729Sclemc 	FOR,
27*9729Sclemc 	REPEAT,
28*9729Sclemc 	UNTIL,
29*9729Sclemc 	WHILE,
30*9729Sclemc 	BREAK,
31*9729Sclemc 	NEXT,
32*9729Sclemc 	DEFINE,
33*9729Sclemc 	INCLUDE,
34*9729Sclemc 	RETURN,
35*9729Sclemc 	SWITCH,
36*9729Sclemc 	CASE,
37*9729Sclemc 	DEFAULT,
38*9729Sclemc 	0};
39*9729Sclemc 
40*9729Sclemc char	*fcnloc;	/* spot for "function" */
41*9729Sclemc 
42*9729Sclemc int	svargc;
43*9729Sclemc char	**svargv;
44*9729Sclemc char	*curfile[10]	= { "" };
45*9729Sclemc int	infptr	= 0;
46*9729Sclemc FILE	*outfil	= { stdout };
47*9729Sclemc FILE	*infile[10]	= { stdin };
48*9729Sclemc int	linect[10];
49*9729Sclemc 
50*9729Sclemc int	contfld	= CONTFLD;	/* place to put continuation char */
51*9729Sclemc int	printcom	= 0;	/* print comments if on */
52*9729Sclemc int	hollerith	= 0;	/* convert "..." to 27H... if on */
53*9729Sclemc 
54*9729Sclemc #ifdef	gcos
55*9729Sclemc char	*ratfor	"tssrat";
56*9729Sclemc int	bcdrat[2];
57*9729Sclemc char	*bwkmeter	".           bwkmeter    ";
58*9729Sclemc int	bcdbwk[5];
59*9729Sclemc #endif
60*9729Sclemc 
61*9729Sclemc main(argc,argv) int argc; char **argv; {
62*9729Sclemc 	int i;
63*9729Sclemc 	while(argc>1 && argv[1][0]=='-') {
64*9729Sclemc 		if(argv[1][1]=='6') {
65*9729Sclemc 			contfld=6;
66*9729Sclemc 			if (argv[1][2]!='\0')
67*9729Sclemc 				contchar = argv[1][2];
68*9729Sclemc 		} else if (argv[1][1] == 'C')
69*9729Sclemc 			printcom++;
70*9729Sclemc 		else if (argv[1][1] == 'h')
71*9729Sclemc 			hollerith++;
72*9729Sclemc 		argc--;
73*9729Sclemc 		argv++;
74*9729Sclemc 	}
75*9729Sclemc 
76*9729Sclemc #ifdef	gcos
77*9729Sclemc 	if (!intss()) {
78*9729Sclemc 		_fixup();
79*9729Sclemc 		ratfor = "batrat";
80*9729Sclemc 	}
81*9729Sclemc 	ascbcd(ratfor,bcdrat,6);
82*9729Sclemc 	ascbcd(bwkmeter,bcdbwk,24);
83*9729Sclemc 	acdata(bcdrat[0],1);
84*9729Sclemc 	acupdt(bcdbwk[0]);
85*9729Sclemc 	if (!intss()) {
86*9729Sclemc 		if ((infile[infptr]=fopen("s*", "r")) == NULL)
87*9729Sclemc 			cant("s*");
88*9729Sclemc 		if ((outfil=fopen("*s", "w")) == NULL)
89*9729Sclemc 			cant("*s");
90*9729Sclemc 	}
91*9729Sclemc #endif
92*9729Sclemc 
93*9729Sclemc 	svargc = argc;
94*9729Sclemc 	svargv = argv;
95*9729Sclemc 	if (svargc > 1)
96*9729Sclemc 		putbak('\0');
97*9729Sclemc 	for (i=0; keyword[i]; i++)
98*9729Sclemc 		install(keyword[i], "", keytran[i]);
99*9729Sclemc 	fcnloc = install("function", "", 0);
100*9729Sclemc 	yyparse();
101*9729Sclemc #ifdef	gcos
102*9729Sclemc 	if (!intss())
103*9729Sclemc 		bexit(errorflag);
104*9729Sclemc #endif
105*9729Sclemc 	exit(errorflag);
106*9729Sclemc }
107*9729Sclemc 
108*9729Sclemc #ifdef gcos
109*9729Sclemc bexit(status) {
110*9729Sclemc 	/* this is the batch version of exit for gcos tss */
111*9729Sclemc 	FILE *inf, *outf;
112*9729Sclemc 	char c;
113*9729Sclemc 
114*9729Sclemc 	fclose(stderr);	/* make sure diagnostics get flushed */
115*9729Sclemc 	if (status) /* abort */
116*9729Sclemc 		_nogud();
117*9729Sclemc 
118*9729Sclemc 	/* good: copy output back to s*, call forty */
119*9729Sclemc 
120*9729Sclemc 	fclose(outfil,"r");
121*9729Sclemc 	fclose(infile[0],"r");
122*9729Sclemc 	inf = fopen("*s", "r");
123*9729Sclemc 	outf = fopen("s*", "w");
124*9729Sclemc 	while ((c=getc(inf)) != EOF)
125*9729Sclemc 		putc(c, outf);
126*9729Sclemc 	fclose(inf,"r");
127*9729Sclemc 	fclose(outf,"r");
128*9729Sclemc 	__imok();
129*9729Sclemc }
130*9729Sclemc #endif
131*9729Sclemc 
132*9729Sclemc cant(s) char *s; {
133*9729Sclemc 	linect[infptr] = 0;
134*9729Sclemc 	curfile[infptr] = s;
135*9729Sclemc 	error("can't open");
136*9729Sclemc 	exit(1);
137*9729Sclemc }
138*9729Sclemc 
139*9729Sclemc inclstat() {
140*9729Sclemc 	int c;
141*9729Sclemc 	char *ps;
142*9729Sclemc 	char fname[100];
143*9729Sclemc 	while ((c = getchr()) == ' ' || c == '\t');
144*9729Sclemc 	if (c == '(') {
145*9729Sclemc 		for (ps=fname; (*ps=getchr()) != ')'; ps++);
146*9729Sclemc 		*ps = '\0';
147*9729Sclemc 	} else if (c == '"' || c == '\'') {
148*9729Sclemc 		for (ps=fname; (*ps=getchr()) != c; ps++);
149*9729Sclemc 		*ps = '\0';
150*9729Sclemc 	} else {
151*9729Sclemc 		putbak(c);
152*9729Sclemc 		for (ps=fname; (*ps=getchr()) != ' ' &&*ps!='\t' && *ps!='\n' && *ps!=';'; ps++);
153*9729Sclemc 		*ps = '\0';
154*9729Sclemc 	}
155*9729Sclemc 	if ((infile[++infptr] = fopen(fname,"r")) == NULL) {
156*9729Sclemc 		cant(fname);
157*9729Sclemc 		exit(1);
158*9729Sclemc 	}
159*9729Sclemc 	linect[infptr] = 0;
160*9729Sclemc 	curfile[infptr] = fname;
161*9729Sclemc }
162*9729Sclemc 
163*9729Sclemc char	str[500];
164*9729Sclemc int	nstr;
165*9729Sclemc 
166*9729Sclemc yylex() {
167*9729Sclemc 	int c, t;
168*9729Sclemc 	for (;;) {
169*9729Sclemc 		while ((c=gtok(str))==' ' || c=='\n' || c=='\t')
170*9729Sclemc 			;
171*9729Sclemc 		yylval = c;
172*9729Sclemc 		if (c==';' || c=='{' || c=='}')
173*9729Sclemc 			return(c);
174*9729Sclemc 		if (c==EOF)
175*9729Sclemc 			return(0);
176*9729Sclemc 		yylval = (int) str;
177*9729Sclemc 		if (c == DIG)
178*9729Sclemc 			return(DIGITS);
179*9729Sclemc 		t = lookup(str)->ydef;
180*9729Sclemc 		if (t==DEFINE)
181*9729Sclemc 			defstat();
182*9729Sclemc 		else if (t==INCLUDE)
183*9729Sclemc 			inclstat();
184*9729Sclemc 		else if (t > 0)
185*9729Sclemc 			return(t);
186*9729Sclemc 		else
187*9729Sclemc 			return(GOK);
188*9729Sclemc 	}
189*9729Sclemc }
190*9729Sclemc 
191*9729Sclemc int	dbg	= 0;
192*9729Sclemc 
193*9729Sclemc yyerror(p) char *p; {;}
194*9729Sclemc 
195*9729Sclemc 
196*9729Sclemc defstat() {
197*9729Sclemc 	int c,i,val,t,nlp;
198*9729Sclemc 	extern int nstr;
199*9729Sclemc 	extern char str[];
200*9729Sclemc 	while ((c=getchr())==' ' || c=='\t');
201*9729Sclemc 	if (c == '(') {
202*9729Sclemc 		t = '(';
203*9729Sclemc 		while ((c=getchr())==' ' || c=='\t');
204*9729Sclemc 		putbak(c);
205*9729Sclemc 	}
206*9729Sclemc 	else {
207*9729Sclemc 		t = ' ';
208*9729Sclemc 		putbak(c);
209*9729Sclemc 	}
210*9729Sclemc 	for (nstr=0; c=getchr(); nstr++) {
211*9729Sclemc 		if (type[c] != LET && type[c] != DIG)
212*9729Sclemc 			break;
213*9729Sclemc 		str[nstr] = c;
214*9729Sclemc 	}
215*9729Sclemc 	putbak(c);
216*9729Sclemc 	str[nstr] = '\0';
217*9729Sclemc 	if (c != ' ' && c != '\t' && c != '\n' && c != ',') {
218*9729Sclemc 		error("illegal define statement");
219*9729Sclemc 		return;
220*9729Sclemc 	}
221*9729Sclemc 	val = nstr+1;
222*9729Sclemc 	if (t == ' ') {
223*9729Sclemc 		while ((c=getchr())==' ' || c=='\t');
224*9729Sclemc 		putbak(c);
225*9729Sclemc 		for (i=val; (c=getchr())!='\n' && c!='#' && c!='\0'; i++)
226*9729Sclemc 			str[i] = c;
227*9729Sclemc 		putbak(c);
228*9729Sclemc 	} else {
229*9729Sclemc 		while ((c=getchr())==' ' || c=='\t' || c==',' || c=='\n');
230*9729Sclemc 		putbak(c);
231*9729Sclemc 		nlp  = 0;
232*9729Sclemc 		for (i=val; nlp>=0 && (c=str[i]=getchr()); i++)
233*9729Sclemc 			if (c == '(')
234*9729Sclemc 				nlp++;
235*9729Sclemc 			else if (c == ')')
236*9729Sclemc 				nlp--;
237*9729Sclemc 		i--;
238*9729Sclemc 	}
239*9729Sclemc 	for ( ; i>0; i--)
240*9729Sclemc 		if (str[i-1] != ' ' && str[i-1] != '\t')
241*9729Sclemc 			break;
242*9729Sclemc 	str[i] = '\0';
243*9729Sclemc 	install(str, &str[val], 0);
244*9729Sclemc }
245*9729Sclemc 
246