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