1*17536Skarels static char *sccsid = "@(#)cb.c 4.2 (Berkeley) 12/19/84"; 2966Sbill #include <stdio.h> 3966Sbill int slevel[10]; 4966Sbill int clevel = 0; 5966Sbill int spflg[20][10]; 6966Sbill int sind[20][10]; 7966Sbill int siflev[10]; 8966Sbill int sifflg[10]; 9966Sbill int iflev = 0; 10966Sbill int ifflg = -1; 11966Sbill int level = 0; 12966Sbill int ind[10] = { 13966Sbill 0,0,0,0,0,0,0,0,0,0 }; 14966Sbill int eflg = 0; 15966Sbill int paren = 0; 16966Sbill int pflg[10] = { 17966Sbill 0,0,0,0,0,0,0,0,0,0 }; 18966Sbill char lchar; 19966Sbill char pchar; 20966Sbill int aflg = 0; 21966Sbill int ct; 22966Sbill int stabs[20][10]; 23966Sbill int qflg = 0; 24966Sbill char *wif[] = { 25966Sbill "if",0}; 26966Sbill char *welse[] = { 27966Sbill "else",0}; 28966Sbill char *wfor[] = { 29966Sbill "for",0}; 30966Sbill char *wds[] = { 31966Sbill "case","default",0}; 32966Sbill int j = 0; 33966Sbill char string[200]; 34966Sbill char cc; 35966Sbill int sflg = 1; 36966Sbill int peek = -1; 37966Sbill int tabs = 0; 38966Sbill int lastchar; 39966Sbill int c; 40*17536Skarels int getstr(); 41966Sbill main(argc,argv) int argc; 42966Sbill char argv[]; 43966Sbill { 44966Sbill while((c = getch()) != EOF){ 45966Sbill switch(c){ 46966Sbill case ' ': 47966Sbill case '\t': 48966Sbill if(lookup(welse) == 1){ 49966Sbill gotelse(); 50966Sbill if(sflg == 0 || j > 0)string[j++] = c; 51966Sbill puts(); 52966Sbill sflg = 0; 53966Sbill continue; 54966Sbill } 55966Sbill if(sflg == 0 || j > 0)string[j++] = c; 56966Sbill continue; 57966Sbill case '\n': 58966Sbill if((eflg = lookup(welse)) == 1)gotelse(); 59966Sbill puts(); 60966Sbill printf("\n"); 61966Sbill sflg = 1; 62966Sbill if(eflg == 1){ 63966Sbill pflg[level]++; 64966Sbill tabs++; 65966Sbill } 66966Sbill else 67966Sbill if(pchar == lchar) 68966Sbill aflg = 1; 69966Sbill continue; 70966Sbill case '{': 71966Sbill if(lookup(welse) == 1)gotelse(); 72966Sbill siflev[clevel] = iflev; 73966Sbill sifflg[clevel] = ifflg; 74966Sbill iflev = ifflg = 0; 75966Sbill clevel++; 76966Sbill if(sflg == 1 && pflg[level] != 0){ 77966Sbill pflg[level]--; 78966Sbill tabs--; 79966Sbill } 80966Sbill string[j++] = c; 81966Sbill puts(); 82966Sbill getnl(); 83966Sbill puts(); 84966Sbill printf("\n"); 85966Sbill tabs++; 86966Sbill sflg = 1; 87966Sbill if(pflg[level] > 0){ 88966Sbill ind[level] = 1; 89966Sbill level++; 90966Sbill slevel[level] = clevel; 91966Sbill } 92966Sbill continue; 93966Sbill case '}': 94966Sbill clevel--; 95966Sbill if((iflev = siflev[clevel]-1) < 0)iflev = 0; 96966Sbill ifflg = sifflg[clevel]; 97966Sbill if(pflg[level] >0 && ind[level] == 0){ 98966Sbill tabs -= pflg[level]; 99966Sbill pflg[level] = 0; 100966Sbill } 101966Sbill puts(); 102966Sbill tabs--; 103966Sbill ptabs(); 104966Sbill if((peek = getch()) == ';'){ 105966Sbill printf("%c;",c); 106966Sbill peek = -1; 107966Sbill } 108966Sbill else printf("%c",c); 109966Sbill getnl(); 110966Sbill puts(); 111966Sbill printf("\n"); 112966Sbill sflg = 1; 113966Sbill if(clevel < slevel[level])if(level > 0)level--; 114966Sbill if(ind[level] != 0){ 115966Sbill tabs -= pflg[level]; 116966Sbill pflg[level] = 0; 117966Sbill ind[level] = 0; 118966Sbill } 119966Sbill continue; 120966Sbill case '"': 121966Sbill case '\'': 122966Sbill string[j++] = c; 123966Sbill while((cc = getch()) != c){ 124966Sbill string[j++] = cc; 125966Sbill if(cc == '\\'){ 126966Sbill string[j++] = getch(); 127966Sbill } 128966Sbill if(cc == '\n'){ 129966Sbill puts(); 130966Sbill sflg = 1; 131966Sbill } 132966Sbill } 133966Sbill string[j++] = cc; 134966Sbill if(getnl() == 1){ 135966Sbill lchar = cc; 136966Sbill peek = '\n'; 137966Sbill } 138966Sbill continue; 139966Sbill case ';': 140966Sbill string[j++] = c; 141966Sbill puts(); 142966Sbill if(pflg[level] > 0 && ind[level] == 0){ 143966Sbill tabs -= pflg[level]; 144966Sbill pflg[level] = 0; 145966Sbill } 146966Sbill getnl(); 147966Sbill puts(); 148966Sbill printf("\n"); 149966Sbill sflg = 1; 150966Sbill if(iflev > 0) 151966Sbill if(ifflg == 1){iflev--; 152966Sbill ifflg = 0; 153966Sbill } 154966Sbill else iflev = 0; 155966Sbill continue; 156966Sbill case '\\': 157966Sbill string[j++] = c; 158966Sbill string[j++] = getch(); 159966Sbill continue; 160966Sbill case '?': 161966Sbill qflg = 1; 162966Sbill string[j++] = c; 163966Sbill continue; 164966Sbill case ':': 165966Sbill string[j++] = c; 166966Sbill if(qflg == 1){ 167966Sbill qflg = 0; 168966Sbill continue; 169966Sbill } 170966Sbill if(lookup(wds) == 0){ 171966Sbill sflg = 0; 172966Sbill puts(); 173966Sbill } 174966Sbill else{ 175966Sbill tabs--; 176966Sbill puts(); 177966Sbill tabs++; 178966Sbill } 179966Sbill if((peek = getch()) == ';'){ 180966Sbill printf(";"); 181966Sbill peek = -1; 182966Sbill } 183966Sbill getnl(); 184966Sbill puts(); 185966Sbill printf("\n"); 186966Sbill sflg = 1; 187966Sbill continue; 188966Sbill case '/': 189966Sbill string[j++] = c; 190966Sbill if((peek = getch()) != '*')continue; 191966Sbill string[j++] = peek; 192966Sbill peek = -1; 193966Sbill comment(); 194966Sbill continue; 195966Sbill case ')': 196966Sbill paren--; 197966Sbill string[j++] = c; 198966Sbill puts(); 199966Sbill if(getnl() == 1){ 200966Sbill peek = '\n'; 201966Sbill if(paren != 0)aflg = 1; 202966Sbill else if(tabs > 0){ 203966Sbill pflg[level]++; 204966Sbill tabs++; 205966Sbill ind[level] = 0; 206966Sbill } 207966Sbill } 208966Sbill continue; 209966Sbill case '#': 210966Sbill string[j++] = c; 211966Sbill while((cc = getch()) != '\n')string[j++] = cc; 212966Sbill string[j++] = cc; 213966Sbill sflg = 0; 214966Sbill puts(); 215966Sbill sflg = 1; 216966Sbill continue; 217966Sbill case '(': 218966Sbill string[j++] = c; 219966Sbill paren++; 220966Sbill if(lookup(wfor) == 1){ 221*17536Skarels while((c = getstr()) != ';'); 222966Sbill ct=0; 223966Sbill cont: 224*17536Skarels while((c = getstr()) != ')'){ 225966Sbill if(c == '(') ct++; 226966Sbill } 227966Sbill if(ct != 0){ 228966Sbill ct--; 229966Sbill goto cont; 230966Sbill } 231966Sbill paren--; 232966Sbill puts(); 233966Sbill if(getnl() == 1){ 234966Sbill peek = '\n'; 235966Sbill pflg[level]++; 236966Sbill tabs++; 237966Sbill ind[level] = 0; 238966Sbill } 239966Sbill continue; 240966Sbill } 241966Sbill if(lookup(wif) == 1){ 242966Sbill puts(); 243966Sbill stabs[clevel][iflev] = tabs; 244966Sbill spflg[clevel][iflev] = pflg[level]; 245966Sbill sind[clevel][iflev] = ind[level]; 246966Sbill iflev++; 247966Sbill ifflg = 1; 248966Sbill } 249966Sbill continue; 250966Sbill default: 251966Sbill string[j++] = c; 252966Sbill if(c != ',')lchar = c; 253966Sbill } 254966Sbill } 255966Sbill } 256966Sbill ptabs(){ 257966Sbill int i; 258966Sbill for(i=0; i < tabs; i++)printf("\t"); 259966Sbill } 260966Sbill getch(){ 261966Sbill if(peek < 0 && lastchar != ' ' && lastchar != '\t')pchar = lastchar; 262966Sbill lastchar = (peek<0) ? getc(stdin):peek; 263966Sbill peek = -1; 264966Sbill return(lastchar); 265966Sbill } 266966Sbill puts(){ 267966Sbill if(j > 0){ 268966Sbill if(sflg != 0){ 269966Sbill ptabs(); 270966Sbill sflg = 0; 271966Sbill if(aflg == 1){ 272966Sbill aflg = 0; 273966Sbill if(tabs > 0)printf(" "); 274966Sbill } 275966Sbill } 276966Sbill string[j] = '\0'; 277966Sbill printf("%s",string); 278966Sbill j = 0; 279966Sbill } 280966Sbill else{ 281966Sbill if(sflg != 0){ 282966Sbill sflg = 0; 283966Sbill aflg = 0; 284966Sbill } 285966Sbill } 286966Sbill } 287966Sbill lookup(tab) 288966Sbill char *tab[]; 289966Sbill { 290966Sbill char r; 291966Sbill int l,kk,k,i; 292966Sbill if(j < 1)return(0); 293966Sbill kk=0; 294966Sbill while(string[kk] == ' ')kk++; 295966Sbill for(i=0; tab[i] != 0; i++){ 296966Sbill l=0; 297966Sbill for(k=kk;(r = tab[i][l++]) == string[k] && r != '\0';k++); 298966Sbill if(r == '\0' && (string[k] < 'a' || string[k] > 'z' || k >= j))return(1); 299966Sbill } 300966Sbill return(0); 301966Sbill } 302*17536Skarels getstr(){ 303966Sbill char ch; 304966Sbill beg: 305966Sbill if((ch = string[j++] = getch()) == '\\'){ 306966Sbill string[j++] = getch(); 307966Sbill goto beg; 308966Sbill } 309966Sbill if(ch == '\'' || ch == '"'){ 310966Sbill while((cc = string[j++] = getch()) != ch)if(cc == '\\')string[j++] = getch(); 311966Sbill goto beg; 312966Sbill } 313966Sbill if(ch == '\n'){ 314966Sbill puts(); 315966Sbill aflg = 1; 316966Sbill goto beg; 317966Sbill } 318966Sbill else return(ch); 319966Sbill } 320966Sbill gotelse(){ 321966Sbill tabs = stabs[clevel][iflev]; 322966Sbill pflg[level] = spflg[clevel][iflev]; 323966Sbill ind[level] = sind[clevel][iflev]; 324966Sbill ifflg = 1; 325966Sbill } 326966Sbill getnl(){ 327966Sbill while((peek = getch()) == '\t' || peek == ' '){ 328966Sbill string[j++] = peek; 329966Sbill peek = -1; 330966Sbill } 331966Sbill if((peek = getch()) == '/'){ 332966Sbill peek = -1; 333966Sbill if((peek = getch()) == '*'){ 334966Sbill string[j++] = '/'; 335966Sbill string[j++] = '*'; 336966Sbill peek = -1; 337966Sbill comment(); 338966Sbill } 339966Sbill else string[j++] = '/'; 340966Sbill } 341966Sbill if((peek = getch()) == '\n'){ 342966Sbill peek = -1; 343966Sbill return(1); 344966Sbill } 345966Sbill return(0); 346966Sbill } 347966Sbill comment(){ 348966Sbill rep: 349966Sbill while((c = string[j++] = getch()) != '*') 350966Sbill if(c == '\n'){ 351966Sbill puts(); 352966Sbill sflg = 1; 353966Sbill } 354966Sbill gotstar: 355966Sbill if((c = string[j++] = getch()) != '/'){ 356966Sbill if(c == '*')goto gotstar; 357966Sbill goto rep; 358966Sbill } 359966Sbill } 360