1 static char *sccsid = "@(#)cb.c 4.1 (Berkeley) 10/01/80"; 2 #include <stdio.h> 3 int slevel[10]; 4 int clevel = 0; 5 int spflg[20][10]; 6 int sind[20][10]; 7 int siflev[10]; 8 int sifflg[10]; 9 int iflev = 0; 10 int ifflg = -1; 11 int level = 0; 12 int ind[10] = { 13 0,0,0,0,0,0,0,0,0,0 }; 14 int eflg = 0; 15 int paren = 0; 16 int pflg[10] = { 17 0,0,0,0,0,0,0,0,0,0 }; 18 char lchar; 19 char pchar; 20 int aflg = 0; 21 int ct; 22 int stabs[20][10]; 23 int qflg = 0; 24 char *wif[] = { 25 "if",0}; 26 char *welse[] = { 27 "else",0}; 28 char *wfor[] = { 29 "for",0}; 30 char *wds[] = { 31 "case","default",0}; 32 int j = 0; 33 char string[200]; 34 char cc; 35 int sflg = 1; 36 int peek = -1; 37 int tabs = 0; 38 int lastchar; 39 int c; 40 main(argc,argv) int argc; 41 char 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; 222 cont: 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 } 255 ptabs(){ 256 int i; 257 for(i=0; i < tabs; i++)printf("\t"); 258 } 259 getch(){ 260 if(peek < 0 && lastchar != ' ' && lastchar != '\t')pchar = lastchar; 261 lastchar = (peek<0) ? getc(stdin):peek; 262 peek = -1; 263 return(lastchar); 264 } 265 puts(){ 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 } 286 lookup(tab) 287 char *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 } 301 gets(){ 302 char ch; 303 beg: 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 } 319 gotelse(){ 320 tabs = stabs[clevel][iflev]; 321 pflg[level] = spflg[clevel][iflev]; 322 ind[level] = sind[clevel][iflev]; 323 ifflg = 1; 324 } 325 getnl(){ 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 } 346 comment(){ 347 rep: 348 while((c = string[j++] = getch()) != '*') 349 if(c == '\n'){ 350 puts(); 351 sflg = 1; 352 } 353 gotstar: 354 if((c = string[j++] = getch()) != '/'){ 355 if(c == '*')goto gotstar; 356 goto rep; 357 } 358 } 359