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