BSD 4 release
[unix-history] / usr / src / cmd / struct / 1.fort.c
CommitLineData
aaa7ced1
BJ
1#include <stdio.h>
2#include "1.incl.h"
3#include "1.defs.h"
4#include "def.h"
5
6
7act(k,c,bufptr)
8int k,bufptr;
9char c;
10 {
11 long ftemp;
12 struct lablist *makelab();
13 switch(k)
14 /*handle labels */
15 {case 1:
16 if (c != ' ')
17 {
18 ftemp = c - '0';
19 newlab->labelt = 10L * newlab->labelt + ftemp;
20
21 if (newlab->labelt > 99999L)
22 {
23 error("in syntax:\n","","");
24 fprintf(stderr,"line %d: label beginning %D too long\n%s\n",
25 begline,newlab->labelt,buffer);
26 fprintf(stderr,"treating line as straight line code\n");
27 return(ABORT);
28 }
29 }
30 break;
31
32 case 3: nlabs++;
33 newlab = newlab->nxtlab = makelab(0L);
34 break;
35
36 /* handle labsw- switches and labels */
37 /* handle if statements */
38 case 30: counter++; break;
39
40 case 31:
41 counter--;
42 if (counter) return(_if1);
43 else
44 {
45 pred = remtilda(stralloc(&buffer[p1],bufptr - p1));
46 p3 = bufptr + 1; /* p3 pts. to 1st symbol after ) */
47 flag = 1;
48 return(_if2); }
49
50 case 45: /* set p1 to pt.to 1st symbol of pred */
51 p1 = bufptr + 1;
52 act(30,c,bufptr); break;
53
54 /* handle do loops */
55 case 61: p1 = bufptr; break; /* p1 pts. to 1st symbol of increment string */
56
57 case 62: counter ++; break;
58
59 case 63: counter --; break;
60
61 case 64:
62 if (counter != 0) break;
63 act(162,c,bufptr);
64 return(ABORT);
65
66 case 70: if (counter) return(_rwp);
67 r1 = bufptr;
68 return(_rwlab);
69
70 case 72: exp = remtilda( stralloc(&buffer[r1+1],bufptr - r1 - 1)); break;
71
72 case 73: endlab = newlab;
73 break;
74
75 case 74: errlab = newlab;
76 break;
77
78 case 75: reflab = newlab;
79 act(3,c,bufptr);
80 break;
81
82 case 76: r1 = bufptr; break;
83
84 case 77:
85 if (!counter)
86 {
87 act(111,c,bufptr);
88 return(ABORT);
89 }
90 counter--;
91 break;
92 /* generate nodes of all types */
93 case 111: /* st. line code */
94 stcode = remtilda(stralloc(&buffer[p3],endbuf - p3));
95 recognize(STLNVX,flag);
96 return(ABORT);
97
98 case 122: /* uncond. goto */
99 recognize(ungo,flag);
100 break;
101
102 case 123: /* assigned goto */
103 act(72,c,bufptr);
104 faterr("in parsing:\n","assigned goto must have list of labels","");
105
106 case 124: /* ass. goto, labels */
107 recognize(ASGOVX, flag);
108 break;
109
110 case 125: /* computed goto*/
111 exp = remtilda( stralloc(&buffer[r1+1],bufptr - r1 - 1));
112 recognize(COMPVX, flag);
113 return(ABORT);
114
115 case 133: /* if() = is a simple statement, so reset flag to 0 */
116 flag = 0;
117 act(111,c,bufptr);
118 return(ABORT);
119
120 case 141: /* arith. if */
121 recognize(arithif, 0);
122 break;
123
124 case 150: /* label assignment */
125 exp = remtilda( stralloc(&buffer[r1+1],bufptr - r1 - 1));
126 recognize(ASVX, flag);
127 break;
128
129 case 162: /* do node */
130 inc = remtilda(stralloc(&buffer[p1],endbuf - p1));
131 recognize(DOVX, 0);
132 break;
133
134 case 180: /* continue statement */
135 recognize(contst, 0);
136 break;
137
138 case 200: /* function or subroutine statement */
139 progtype = sub;
140 nameline = begline;
141 recognize(STLNVX,0);
142 break;
143
144
145 case 210: /* block data statement */
146 progtype = blockdata;
147 act(111,c,bufptr);
148 return(ABORT);
149
150 case 300: /* return statement */
151 recognize(RETVX,flag);
152 break;
153
154
155 case 350: /* stop statement */
156 recognize(STOPVX, flag);
157 break;
158
159
160 case 400: /* end statement */
161 if (progtype == sub)
162 act(300, c, bufptr);
163 else
164 act(350, c, bufptr);
165 return(endrt);
166
167 case 500:
168 prerw = remtilda(stralloc(&buffer[p3],r1 - p3 + 1));
169 postrw = remtilda(stralloc(&buffer[r2],endbuf - r2));
170 if (reflab || endlab || errlab) recognize(IOVX,flag);
171 else recognize(STLNVX,flag);
172 return(ABORT);
173
174 case 510: r2 = bufptr;
175 act(3,c,bufptr);
176 act(500,c,bufptr);
177 return(ABORT);
178
179 case 520: r2 = bufptr;
180 reflab = newlab;
181 act(3,c,bufptr);
182 act(500,c,bufptr);
183 return(ABORT);
184
185
186 case 600:
187 recognize(FMTVX,0); return(ABORT);
188
189 case 700:
190 stcode = remtilda(stralloc(&buffer[p3],endbuf - p3));
191 recognize(entry,0); return(ABORT);
192 /* error */
193 case 999:
194 printf("error: symbol '%c' should not occur as %d'th symbol of: \n%s\n",
195 c,bufptr, buffer);
196 return(ABORT);
197 }
198 return(nulls);
199 }
200
201
202
203struct lablist *makelab(x)
204long x;
205 {
206 struct lablist *p;
207 p = challoc (sizeof(*p));
208 p->labelt = x;
209 p->nxtlab = 0;
210 return(p);
211 }
212
213
214long label(i)
215int i;
216 {
217 struct lablist *j;
218 for (j = linelabs; i > 0; i--)
219 {
220 if (j == 0) return(0L);
221 j = j->nxtlab;
222 }
223 if (j)
224 return(j->labelt);
225 else
226 return(0L);
227 }
228
229
230freelabs()
231 {
232 struct lablist *j,*k;
233 j = linelabs;
234 while(j != 0)
235 {
236 k = j->nxtlab;
237 chfree(j,sizeof(*j));
238 j = k;
239 }
240 }
241
242
243stralloc(ad,n) /* allocate space, copy n chars from address ad, add '0' */
244int n; char *ad;
245 {
246 char *cp;
247 cp = galloc(n+1);
248 copycs(ad,cp,n);
249 return(cp);
250 }
251
252
253remtilda(s) /* change ~ to blank */
254char *s;
255 {
256 int i;
257 for (i = 0; s[i] != '\0'; i++)
258 if (s[i] == '~') s[i] = ' ';
259 return(s);
260 }