xref: /csrg-svn/old/cb/cb.c (revision 30459)
1*30459Sbostic static char *sccsid = "@(#)cb.c	4.4 (Berkeley) 02/09/87";
2966Sbill #include <stdio.h>
3966Sbill int	slevel[10];
4966Sbill int	clevel	= 0;
5966Sbill int	spflg[20][10];
6966Sbill int	sind[20][10];
7966Sbill int	siflev[10];
8966Sbill int	sifflg[10];
9966Sbill int	iflev	= 0;
10966Sbill int	ifflg	= -1;
11966Sbill int	level	= 0;
12966Sbill int	ind[10]	= {
13966Sbill 	0,0,0,0,0,0,0,0,0,0 };
14966Sbill int	eflg	= 0;
15966Sbill int	paren	= 0;
16966Sbill int	pflg[10] = {
17966Sbill 	0,0,0,0,0,0,0,0,0,0 };
18966Sbill char	lchar;
19966Sbill char	pchar;
20966Sbill int	aflg	= 0;
21966Sbill int	ct;
22966Sbill int	stabs[20][10];
23966Sbill int	qflg	= 0;
24966Sbill char	*wif[] = {
25966Sbill 	"if",0};
26966Sbill char	*welse[] = {
27966Sbill 	"else",0};
28966Sbill char	*wfor[] = {
29966Sbill 	"for",0};
30966Sbill char	*wds[] = {
31966Sbill 	"case","default",0};
32966Sbill int	j	= 0;
33966Sbill char	string[200];
34966Sbill char	cc;
35966Sbill int	sflg	= 1;
36966Sbill int	peek	= -1;
37966Sbill int	tabs	= 0;
38966Sbill int	lastchar;
39966Sbill int	c;
4017536Skarels int	getstr();
main(argc,argv)41966Sbill main(argc,argv) int argc;
42966Sbill char argv[];
43966Sbill {
44966Sbill 	while((c = getch()) != EOF){
45966Sbill 		switch(c){
46966Sbill 		case ' ':
47966Sbill 		case '\t':
48966Sbill 			if(lookup(welse) == 1){
49966Sbill 				gotelse();
50966Sbill 				if(sflg == 0 || j > 0)string[j++] = c;
51966Sbill 				puts();
52966Sbill 				sflg = 0;
53966Sbill 				continue;
54966Sbill 			}
55966Sbill 			if(sflg == 0 || j > 0)string[j++] = c;
56966Sbill 			continue;
57966Sbill 		case '\n':
58966Sbill 			if((eflg = lookup(welse)) == 1)gotelse();
59966Sbill 			puts();
60966Sbill 			printf("\n");
61966Sbill 			sflg = 1;
62966Sbill 			if(eflg == 1){
63966Sbill 				pflg[level]++;
64966Sbill 				tabs++;
65966Sbill 			}
66966Sbill 			else
67966Sbill 				if(pchar == lchar)
68966Sbill 					aflg = 1;
69966Sbill 			continue;
70966Sbill 		case '{':
71966Sbill 			if(lookup(welse) == 1)gotelse();
72966Sbill 			siflev[clevel] = iflev;
73966Sbill 			sifflg[clevel] = ifflg;
74966Sbill 			iflev = ifflg = 0;
75966Sbill 			clevel++;
76966Sbill 			if(sflg == 1 && pflg[level] != 0){
77966Sbill 				pflg[level]--;
78966Sbill 				tabs--;
79966Sbill 			}
80966Sbill 			string[j++] = c;
81966Sbill 			puts();
82966Sbill 			getnl();
83966Sbill 			puts();
84966Sbill 			printf("\n");
85966Sbill 			tabs++;
86966Sbill 			sflg = 1;
87966Sbill 			if(pflg[level] > 0){
88966Sbill 				ind[level] = 1;
89966Sbill 				level++;
90966Sbill 				slevel[level] = clevel;
91966Sbill 			}
92966Sbill 			continue;
93966Sbill 		case '}':
94966Sbill 			clevel--;
95966Sbill 			if((iflev = siflev[clevel]-1) < 0)iflev = 0;
96966Sbill 			ifflg = sifflg[clevel];
97966Sbill 			if(pflg[level] >0 && ind[level] == 0){
98966Sbill 				tabs -= pflg[level];
99966Sbill 				pflg[level] = 0;
100966Sbill 			}
101966Sbill 			puts();
102966Sbill 			tabs--;
103966Sbill 			ptabs();
104966Sbill 			if((peek = getch()) == ';'){
105966Sbill 				printf("%c;",c);
106966Sbill 				peek = -1;
107966Sbill 			}
108966Sbill 			else printf("%c",c);
109966Sbill 			getnl();
110966Sbill 			puts();
111966Sbill 			printf("\n");
112966Sbill 			sflg = 1;
113966Sbill 			if(clevel < slevel[level])if(level > 0)level--;
114966Sbill 			if(ind[level] != 0){
115966Sbill 				tabs -= pflg[level];
116966Sbill 				pflg[level] = 0;
117966Sbill 				ind[level] = 0;
118966Sbill 			}
119966Sbill 			continue;
120966Sbill 		case '"':
121966Sbill 		case '\'':
122966Sbill 			string[j++] = c;
123966Sbill 			while((cc = getch()) != c){
124966Sbill 				string[j++] = cc;
125966Sbill 				if(cc == '\\'){
126966Sbill 					string[j++] = getch();
127966Sbill 				}
128966Sbill 				if(cc == '\n'){
129966Sbill 					puts();
130966Sbill 					sflg = 1;
131966Sbill 				}
132966Sbill 			}
133966Sbill 			string[j++] = cc;
134966Sbill 			if(getnl() == 1){
135966Sbill 				lchar = cc;
136966Sbill 				peek = '\n';
137966Sbill 			}
138966Sbill 			continue;
139966Sbill 		case ';':
140966Sbill 			string[j++] = c;
141966Sbill 			puts();
142966Sbill 			if(pflg[level] > 0 && ind[level] == 0){
143966Sbill 				tabs -= pflg[level];
144966Sbill 				pflg[level] = 0;
145966Sbill 			}
146966Sbill 			getnl();
147966Sbill 			puts();
148966Sbill 			printf("\n");
149966Sbill 			sflg = 1;
150966Sbill 			if(iflev > 0)
151966Sbill 				if(ifflg == 1){iflev--;
152966Sbill 					ifflg = 0;
153966Sbill 				}
154966Sbill 				else iflev = 0;
155966Sbill 			continue;
156966Sbill 		case '\\':
157966Sbill 			string[j++] = c;
158966Sbill 			string[j++] = getch();
159966Sbill 			continue;
160966Sbill 		case '?':
161966Sbill 			qflg = 1;
162966Sbill 			string[j++] = c;
163966Sbill 			continue;
164966Sbill 		case ':':
165966Sbill 			string[j++] = c;
166966Sbill 			if(qflg == 1){
167966Sbill 				qflg = 0;
168966Sbill 				continue;
169966Sbill 			}
170966Sbill 			if(lookup(wds) == 0){
171966Sbill 				sflg = 0;
172966Sbill 				puts();
173966Sbill 			}
174966Sbill 			else{
175966Sbill 				tabs--;
176966Sbill 				puts();
177966Sbill 				tabs++;
178966Sbill 			}
179966Sbill 			if((peek = getch()) == ';'){
180966Sbill 				printf(";");
181966Sbill 				peek = -1;
182966Sbill 			}
183966Sbill 			getnl();
184966Sbill 			puts();
185966Sbill 			printf("\n");
186966Sbill 			sflg = 1;
187966Sbill 			continue;
188966Sbill 		case '/':
189966Sbill 			string[j++] = c;
190966Sbill 			if((peek = getch()) != '*')continue;
191966Sbill 			string[j++] = peek;
192966Sbill 			peek = -1;
193966Sbill 			comment();
194966Sbill 			continue;
195966Sbill 		case ')':
196966Sbill 			paren--;
197966Sbill 			string[j++] = c;
198966Sbill 			puts();
199966Sbill 			if(getnl() == 1){
200966Sbill 				peek = '\n';
201966Sbill 				if(paren != 0)aflg = 1;
202966Sbill 				else if(tabs > 0){
203966Sbill 					pflg[level]++;
204966Sbill 					tabs++;
205966Sbill 					ind[level] = 0;
206966Sbill 				}
207966Sbill 			}
208966Sbill 			continue;
209966Sbill 		case '#':
210966Sbill 			string[j++] = c;
211966Sbill 			while((cc = getch()) != '\n')string[j++] = cc;
212966Sbill 			string[j++] = cc;
213966Sbill 			sflg = 0;
214966Sbill 			puts();
215966Sbill 			sflg = 1;
216966Sbill 			continue;
217966Sbill 		case '(':
218966Sbill 			string[j++] = c;
219966Sbill 			paren++;
220966Sbill 			if(lookup(wfor) == 1){
22117536Skarels 				while((c = getstr()) != ';');
222966Sbill 				ct=0;
223966Sbill cont:
22417536Skarels 				while((c = getstr()) != ')'){
225966Sbill 					if(c == '(') ct++;
226966Sbill 				}
227966Sbill 				if(ct != 0){
228966Sbill 					ct--;
229966Sbill 					goto cont;
230966Sbill 				}
231966Sbill 				paren--;
232966Sbill 				puts();
233966Sbill 				if(getnl() == 1){
234966Sbill 					peek = '\n';
235966Sbill 					pflg[level]++;
236966Sbill 					tabs++;
237966Sbill 					ind[level] = 0;
238966Sbill 				}
239966Sbill 				continue;
240966Sbill 			}
241966Sbill 			if(lookup(wif) == 1){
242966Sbill 				puts();
243966Sbill 				stabs[clevel][iflev] = tabs;
244966Sbill 				spflg[clevel][iflev] = pflg[level];
245966Sbill 				sind[clevel][iflev] = ind[level];
246966Sbill 				iflev++;
247966Sbill 				ifflg = 1;
248966Sbill 			}
249966Sbill 			continue;
250966Sbill 		default:
251966Sbill 			string[j++] = c;
252966Sbill 			if(c != ',')lchar = c;
253966Sbill 		}
254966Sbill 	}
255966Sbill }
ptabs()256966Sbill ptabs(){
257966Sbill 	int i;
258966Sbill 	for(i=0; i < tabs; i++)printf("\t");
259966Sbill }
getch()260966Sbill getch(){
261966Sbill 	if(peek < 0 && lastchar != ' ' && lastchar != '\t')pchar = lastchar;
262966Sbill 	lastchar = (peek<0) ? getc(stdin):peek;
263966Sbill 	peek = -1;
264966Sbill 	return(lastchar);
265966Sbill }
puts()266966Sbill puts(){
267966Sbill 	if(j > 0){
268966Sbill 		if(sflg != 0){
269966Sbill 			ptabs();
270966Sbill 			sflg = 0;
271966Sbill 			if(aflg == 1){
272966Sbill 				aflg = 0;
273966Sbill 				if(tabs > 0)printf("    ");
274966Sbill 			}
275966Sbill 		}
276966Sbill 		string[j] = '\0';
277966Sbill 		printf("%s",string);
278966Sbill 		j = 0;
279966Sbill 	}
280966Sbill 	else{
281966Sbill 		if(sflg != 0){
282966Sbill 			sflg = 0;
283966Sbill 			aflg = 0;
284966Sbill 		}
285966Sbill 	}
286966Sbill }
lookup(tab)287966Sbill lookup(tab)
288966Sbill char *tab[];
289966Sbill {
290966Sbill 	char r;
291966Sbill 	int l,kk,k,i;
292966Sbill 	if(j < 1)return(0);
293966Sbill 	kk=0;
294966Sbill 	while(string[kk] == ' ')kk++;
295966Sbill 	for(i=0; tab[i] != 0; i++){
296966Sbill 		l=0;
297966Sbill 		for(k=kk;(r = tab[i][l++]) == string[k] && r != '\0';k++);
298966Sbill 		if(r == '\0' && (string[k] < 'a' || string[k] > 'z' || k >= j))return(1);
299966Sbill 	}
300966Sbill 	return(0);
301966Sbill }
getstr()30217536Skarels getstr(){
303966Sbill 	char ch;
304966Sbill beg:
305966Sbill 	if((ch = string[j++] = getch()) == '\\'){
306966Sbill 		string[j++] = getch();
307966Sbill 		goto beg;
308966Sbill 	}
309966Sbill 	if(ch == '\'' || ch == '"'){
310966Sbill 		while((cc = string[j++] = getch()) != ch)if(cc == '\\')string[j++] = getch();
311966Sbill 		goto beg;
312966Sbill 	}
313966Sbill 	if(ch == '\n'){
314966Sbill 		puts();
315966Sbill 		aflg = 1;
316966Sbill 		goto beg;
317966Sbill 	}
318966Sbill 	else return(ch);
319966Sbill }
gotelse()320966Sbill gotelse(){
321966Sbill 	tabs = stabs[clevel][iflev];
322966Sbill 	pflg[level] = spflg[clevel][iflev];
323966Sbill 	ind[level] = sind[clevel][iflev];
324966Sbill 	ifflg = 1;
325966Sbill }
getnl()326966Sbill getnl(){
327966Sbill 	while((peek = getch()) == '\t' || peek == ' '){
328966Sbill 		string[j++] = peek;
329966Sbill 		peek = -1;
330966Sbill 	}
331966Sbill 	if((peek = getch()) == '/'){
332966Sbill 		peek = -1;
333966Sbill 		if((peek = getch()) == '*'){
334966Sbill 			string[j++] = '/';
335966Sbill 			string[j++] = '*';
336966Sbill 			peek = -1;
337966Sbill 			comment();
338966Sbill 		}
339966Sbill 		else string[j++] = '/';
340966Sbill 	}
341966Sbill 	if((peek = getch()) == '\n'){
342966Sbill 		peek = -1;
343966Sbill 		return(1);
344966Sbill 	}
345966Sbill 	return(0);
346966Sbill }
comment()347966Sbill comment(){
34826222Sdonn 	int i = j;
34926222Sdonn 
35026222Sdonn 	while ((c = getch()) != EOF) {
35126222Sdonn 		string[j++] = c;
35226222Sdonn 		switch(c) {
35326222Sdonn 		case '/':
35426222Sdonn 			if (j > i + 1 && string[j-2] == '*')
35526222Sdonn 				return;
35626222Sdonn 			break;
35726222Sdonn 		case '\n':
358966Sbill 			puts();
359*30459Sbostic 			i = 0;
360966Sbill 			sflg = 1;
36126222Sdonn 			break;
362966Sbill 		}
363966Sbill 	}
364966Sbill }
365