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