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