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