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