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