Research V7 development
[unix-history] / usr / src / cmd / cb.c
CommitLineData
364ae1d2
KT
1#include <stdio.h>
2int slevel[10];
3int clevel = 0;
4int spflg[20][10];
5int sind[20][10];
6int siflev[10];
7int sifflg[10];
8int iflev = 0;
9int ifflg = -1;
10int level = 0;
11int ind[10] = {
12 0,0,0,0,0,0,0,0,0,0 };
13int eflg = 0;
14int paren = 0;
15int pflg[10] = {
16 0,0,0,0,0,0,0,0,0,0 };
17char lchar;
18char pchar;
19int aflg = 0;
20int ct;
21int stabs[20][10];
22int qflg = 0;
23char *wif[] = {
24 "if",0};
25char *welse[] = {
26 "else",0};
27char *wfor[] = {
28 "for",0};
29char *wds[] = {
30 "case","default",0};
31int j = 0;
32char string[200];
33char cc;
34int sflg = 1;
35int peek = -1;
36int tabs = 0;
37int lastchar;
38int c;
39main(argc,argv) int argc;
40char argv[];
41{
42 while((c = getch()) != EOF){
43 switch(c){
44 case ' ':
45 case '\t':
46 if(lookup(welse) == 1){
47 gotelse();
48 if(sflg == 0 || j > 0)string[j++] = c;
49 puts();
50 sflg = 0;
51 if(getnl() == 1){
52 puts();
53 printf("\n");
54 sflg = 1;
55 pflg[level]++;
56 tabs++;
57 }
58 continue;
59 }
60 if(sflg == 0 || j > 0)string[j++] = c;
61 continue;
62 case '\n':
63 if((eflg = lookup(welse)) == 1)gotelse();
64 puts();
65 printf("\n");
66 sflg = 1;
67 if(eflg == 1){
68 pflg[level]++;
69 tabs++;
70 }
71 else
72 if(pchar == lchar)
73 aflg = 1;
74 continue;
75 case '{':
76 if(lookup(welse) == 1)gotelse();
77 siflev[clevel] = iflev;
78 sifflg[clevel] = ifflg;
79 iflev = ifflg = 0;
80 clevel++;
81 if(sflg == 1 && pflg[level] != 0){
82 pflg[level]--;
83 tabs--;
84 }
85 string[j++] = c;
86 puts();
87 getnl();
88 puts();
89 printf("\n");
90 tabs++;
91 sflg = 1;
92 if(pflg[level] > 0){
93 ind[level] = 1;
94 level++;
95 slevel[level] = clevel;
96 }
97 continue;
98 case '}':
99 clevel--;
100 if((iflev = siflev[clevel]-1) < 0)iflev = 0;
101 ifflg = sifflg[clevel];
102 if(pflg[level] >0 && ind[level] == 0){
103 tabs -= pflg[level];
104 pflg[level] = 0;
105 }
106 puts();
107 tabs--;
108 ptabs();
109 if((peek = getch()) == ';'){
110 printf("%c;",c);
111 peek = -1;
112 }
113 else printf("%c",c);
114 getnl();
115 puts();
116 printf("\n");
117 sflg = 1;
118 if(clevel < slevel[level])if(level > 0)level--;
119 if(ind[level] != 0){
120 tabs -= pflg[level];
121 pflg[level] = 0;
122 ind[level] = 0;
123 }
124 continue;
125 case '"':
126 case '\'':
127 string[j++] = c;
128 while((cc = getch()) != c){
129 string[j++] = cc;
130 if(cc == '\\'){
131 string[j++] = getch();
132 }
133 if(cc == '\n'){
134 puts();
135 sflg = 1;
136 }
137 }
138 string[j++] = cc;
139 if(getnl() == 1){
140 lchar = cc;
141 peek = '\n';
142 }
143 continue;
144 case ';':
145 string[j++] = c;
146 puts();
147 if(pflg[level] > 0 && ind[level] == 0){
148 tabs -= pflg[level];
149 pflg[level] = 0;
150 }
151 getnl();
152 puts();
153 printf("\n");
154 sflg = 1;
155 if(iflev > 0)
156 if(ifflg == 1){iflev--;
157 ifflg = 0;
158 }
159 else iflev = 0;
160 continue;
161 case '\\':
162 string[j++] = c;
163 string[j++] = getch();
164 continue;
165 case '?':
166 qflg = 1;
167 string[j++] = c;
168 continue;
169 case ':':
170 string[j++] = c;
171 if(qflg == 1){
172 qflg = 0;
173 continue;
174 }
175 if(lookup(wds) == 0){
176 sflg = 0;
177 puts();
178 }
179 else{
180 tabs--;
181 puts();
182 tabs++;
183 }
184 if((peek = getch()) == ';'){
185 printf(";");
186 peek = -1;
187 }
188 getnl();
189 puts();
190 printf("\n");
191 sflg = 1;
192 continue;
193 case '/':
194 string[j++] = c;
195 if((peek = getch()) != '*')continue;
196 string[j++] = peek;
197 peek = -1;
198 comment();
199 continue;
200 case ')':
201 paren--;
202 string[j++] = c;
203 puts();
204 if(getnl() == 1){
205 peek = '\n';
206 if(paren != 0)aflg = 1;
207 else if(tabs > 0){
208 pflg[level]++;
209 tabs++;
210 ind[level] = 0;
211 }
212 }
213 continue;
214 case '#':
215 string[j++] = c;
216 while((cc = getch()) != '\n')string[j++] = cc;
217 string[j++] = cc;
218 sflg = 0;
219 puts();
220 sflg = 1;
221 continue;
222 case '(':
223 string[j++] = c;
224 paren++;
225 if(lookup(wfor) == 1){
226 while((c = gets()) != ';');
227 ct=0;
228cont:
229 while((c = gets()) != ')'){
230 if(c == '(') ct++;
231 }
232 if(ct != 0){
233 ct--;
234 goto cont;
235 }
236 paren--;
237 puts();
238 if(getnl() == 1){
239 peek = '\n';
240 pflg[level]++;
241 tabs++;
242 ind[level] = 0;
243 }
244 continue;
245 }
246 if(lookup(wif) == 1){
247 puts();
248 stabs[clevel][iflev] = tabs;
249 spflg[clevel][iflev] = pflg[level];
250 sind[clevel][iflev] = ind[level];
251 iflev++;
252 ifflg = 1;
253 }
254 continue;
255 default:
256 string[j++] = c;
257 if(c != ',')lchar = c;
258 }
259 }
260}
261ptabs(){
262 int i;
263 for(i=0; i < tabs; i++)printf("\t");
264}
265getch(){
266 if(peek < 0 && lastchar != ' ' && lastchar != '\t')pchar = lastchar;
267 lastchar = (peek<0) ? getc(stdin):peek;
268 peek = -1;
269 return(lastchar);
270}
271puts(){
272 if(j > 0){
273 if(sflg != 0){
274 ptabs();
275 sflg = 0;
276 if(aflg == 1){
277 aflg = 0;
278 if(tabs > 0)printf(" ");
279 }
280 }
281 string[j] = '\0';
282 printf("%s",string);
283 j = 0;
284 }
285 else{
286 if(sflg != 0){
287 sflg = 0;
288 aflg = 0;
289 }
290 }
291}
292lookup(tab)
293char *tab[];
294{
295 char r;
296 int l,kk,k,i;
297 if(j < 1)return(0);
298 kk=0;
299 while(string[kk] == ' ')kk++;
300 for(i=0; tab[i] != 0; i++){
301 l=0;
302 for(k=kk;(r = tab[i][l++]) == string[k] && r != '\0';k++);
303 if(r == '\0' && (string[k] < 'a' || string[k] > 'z' || k >= j))return(1);
304 }
305 return(0);
306}
307gets(){
308 char ch;
309beg:
310 if((ch = string[j++] = getch()) == '\\'){
311 string[j++] = getch();
312 goto beg;
313 }
314 if(ch == '\'' || ch == '"'){
315 while((cc = string[j++] = getch()) != ch)if(cc == '\\')string[j++] = getch();
316 goto beg;
317 }
318 if(ch == '\n'){
319 puts();
320 aflg = 1;
321 goto beg;
322 }
323 else return(ch);
324}
325gotelse(){
326 tabs = stabs[clevel][iflev];
327 pflg[level] = spflg[clevel][iflev];
328 ind[level] = sind[clevel][iflev];
329 ifflg = 1;
330}
331getnl(){
332 while((peek = getch()) == '\t' || peek == ' '){
333 string[j++] = peek;
334 peek = -1;
335 }
336 if((peek = getch()) == '/'){
337 peek = -1;
338 if((peek = getch()) == '*'){
339 string[j++] = '/';
340 string[j++] = '*';
341 peek = -1;
342 comment();
343 }
344 else string[j++] = '/';
345 }
346 if((peek = getch()) == '\n'){
347 peek = -1;
348 return(1);
349 }
350 return(0);
351}
352comment(){
353rep:
354 while((c = string[j++] = getch()) != '*')
355 if(c == '\n'){
356 puts();
357 sflg = 1;
358 }
359gotstar:
360 if((c = string[j++] = getch()) != '/'){
361 if(c == '*')goto gotstar;
362 goto rep;
363 }
364}