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