|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include "cbtype.h" ! 3: #include "cbtype.c" ! 4: ! 5: #define IF 1 ! 6: #define ELSE 2 ! 7: #define CASE 3 ! 8: #define TYPE 4 ! 9: #define DO 5 ! 10: #define STRUCT 6 ! 11: #define OTHER 7 ! 12: ! 13: #define ALWAYS 01 ! 14: #define NEVER 02 ! 15: #define SOMETIMES 04 ! 16: ! 17: #define YES 1 ! 18: #define NO 0 ! 19: ! 20: #define KEYWORD 1 ! 21: #define DATADEF 2 ! 22: #define SINIT 3 ! 23: ! 24: #define CLEVEL 20 ! 25: #define IFLEVEL 10 ! 26: #define DOLEVEL 10 ! 27: #define OPLENGTH 10 ! 28: #define LINE 256 ! 29: #define LINELENG 120 ! 30: #define MAXTABS 8 ! 31: #define TABLENG 8 ! 32: #define TEMP 1024 ! 33: ! 34: #define OUT outs(clev->tabs); putchar('\n');opflag = lbegin = 1; count = 0 ! 35: #define OUTK OUT; keyflag = 0; ! 36: #define BUMP clev->tabs++; clev->pdepth++ ! 37: #define UNBUMP clev->tabs -= clev->pdepth; clev->pdepth = 0 ! 38: #define eatspace() while((cc=getch()) == ' ' || cc == '\t'); unget(cc) ! 39: #define eatallsp() while((cc=getch()) == ' ' || cc == '\t' || cc == '\n'); unget(cc) ! 40: ! 41: struct indent { /* one for each level of { } */ ! 42: int tabs; ! 43: int pdepth; ! 44: int iflev; ! 45: int ifc[IFLEVEL]; ! 46: int spdepth[IFLEVEL]; ! 47: } ind[CLEVEL]; ! 48: struct indent *clev = ind; ! 49: struct keyw { ! 50: char *name; ! 51: char punc; ! 52: char type; ! 53: } key[] = { ! 54: "switch", ' ', OTHER, ! 55: "do", ' ', DO, ! 56: "while", ' ', OTHER, ! 57: "if", ' ', IF, ! 58: "for", ' ', OTHER, ! 59: "else", ' ', ELSE, ! 60: "case", ' ', CASE, ! 61: "default", ' ', CASE, ! 62: "char", '\t', TYPE, ! 63: "int", '\t', TYPE, ! 64: "short", '\t', TYPE, ! 65: "long", '\t', TYPE, ! 66: "unsigned", '\t', TYPE, ! 67: "float", '\t', TYPE, ! 68: "double", '\t', TYPE, ! 69: "struct", ' ', STRUCT, ! 70: "union", ' ', STRUCT, ! 71: "extern", ' ', TYPE, ! 72: "register", ' ', TYPE, ! 73: "static", ' ', TYPE, ! 74: "typedef", ' ', TYPE, ! 75: 0, 0, 0 ! 76: }; ! 77: struct keyw *lookup(); ! 78: struct op { ! 79: char *name; ! 80: char blanks; ! 81: char setop; ! 82: } op[] = { ! 83: "+=", ALWAYS, YES, ! 84: "-=", ALWAYS, YES, ! 85: "*=", ALWAYS, YES, ! 86: "/=", ALWAYS, YES, ! 87: "%=", ALWAYS, YES, ! 88: ">>=", ALWAYS, YES, ! 89: "<<=", ALWAYS, YES, ! 90: "&=", ALWAYS, YES, ! 91: "^=", ALWAYS, YES, ! 92: "|=", ALWAYS, YES, ! 93: ">>", ALWAYS, YES, ! 94: "<<", ALWAYS, YES, ! 95: "<=", ALWAYS, YES, ! 96: ">=", ALWAYS, YES, ! 97: "==", ALWAYS, YES, ! 98: "!=", ALWAYS, YES, ! 99: "=", ALWAYS, YES, ! 100: "&&", ALWAYS, YES, ! 101: "||", ALWAYS, YES, ! 102: "++", NEVER, NO, ! 103: "--", NEVER, NO, ! 104: "->", NEVER, NO, ! 105: "<", ALWAYS, YES, ! 106: ">", ALWAYS, YES, ! 107: "+", ALWAYS, YES, ! 108: "/", ALWAYS, YES, ! 109: "%", ALWAYS, YES, ! 110: "^", ALWAYS, YES, ! 111: "|", ALWAYS, YES, ! 112: "!", NEVER, YES, ! 113: "~", NEVER, YES, ! 114: "*", SOMETIMES, YES, ! 115: "&", SOMETIMES, YES, ! 116: "-", SOMETIMES, YES, ! 117: "?", ALWAYS,YES, ! 118: ":", ALWAYS,YES, ! 119: 0, 0,0 ! 120: }; ! 121: FILE *input = stdin; ! 122: char *getnext(); ! 123: char puttmp(); ! 124: int strict = 0; ! 125: int join = 0; ! 126: int opflag = 1; ! 127: int keyflag = 0; ! 128: int paren = 0; ! 129: int split = 0; ! 130: int folded = 0; ! 131: int dolevel =0; ! 132: int dotabs[DOLEVEL]; ! 133: int docurly[DOLEVEL]; ! 134: int dopdepth[DOLEVEL]; ! 135: int structlev = 0; ! 136: int question = 0; ! 137: char string[LINE]; ! 138: char *lastlook; ! 139: char *p = string; ! 140: char temp[TEMP]; ! 141: char *tp; ! 142: int err = 0; ! 143: char *lastplace = temp; ! 144: char *tptr = temp; ! 145: int maxleng = LINELENG; ! 146: int maxtabs = MAXTABS; ! 147: int count = 0; ! 148: char next = '\0'; ! 149: int inswitch =0; ! 150: int lbegin = 1; ! 151: main(argc, argv) int argc; ! 152: char *argv[]; ! 153: { ! 154: while (--argc > 0 && (*++argv)[0] == '-'){ ! 155: switch ((*argv)[1]){ ! 156: case 's': ! 157: strict = 1; ! 158: continue; ! 159: case 'j': ! 160: join = 1; ! 161: continue; ! 162: case 'l': ! 163: if((*argv)[2] != '\0'){ ! 164: maxleng = atoi( &((*argv)[2]) ); ! 165: } ! 166: else{ ! 167: maxleng = atoi(*++argv); ! 168: argc--; ! 169: } ! 170: maxtabs = maxleng/TABLENG - 2; ! 171: maxleng -= .1 * maxleng; ! 172: continue; ! 173: default: ! 174: fprintf(stderr, "cb: illegal option %c\n", *argv[1]); ! 175: exit(1); ! 176: } ! 177: } ! 178: if (argc <= 0)work(); ! 179: else { ! 180: while (argc-- > 0){ ! 181: if ((input = fopen( *argv, "r")) == NULL){ ! 182: fprintf(stderr, "cb: cannot open input file %s\n", *argv); ! 183: exit(1); ! 184: } ! 185: work(); ! 186: argv++; ! 187: } ! 188: } ! 189: return(0); ! 190: } ! 191: work(){ ! 192: register int c; ! 193: register struct keyw *lptr; ! 194: char *pt; ! 195: char cc; ! 196: int ct; ! 197: ! 198: while ((c = getch()) != EOF){ ! 199: switch (c){ ! 200: case '{': ! 201: if ((lptr = lookup(lastlook,p)) != 0){ ! 202: if (lptr->type == ELSE)gotelse(); ! 203: else if(lptr->type == DO)gotdo(); ! 204: else if(lptr->type == STRUCT)structlev++; ! 205: } ! 206: if(++clev >= &ind[CLEVEL-1]){ ! 207: fprintf(stderr,"too many levels of curly brackets\n"); ! 208: clev = &ind[CLEVEL-1]; ! 209: } ! 210: clev->pdepth = 0; ! 211: clev->tabs = (clev-1)->tabs; ! 212: clearif(clev); ! 213: if(strict && clev->tabs > 0) ! 214: putspace(' ',NO); ! 215: putch(c,NO); ! 216: getnl(); ! 217: if(keyflag == DATADEF){ ! 218: OUT; ! 219: } ! 220: else { ! 221: OUTK; ! 222: } ! 223: clev->tabs++; ! 224: pt = getnext(0); /* to handle initialized structures */ ! 225: if(*pt == '{'){ /* hide one level of {} */ ! 226: while((c=getch()) != '{'); ! 227: putch(c,NO); ! 228: if(strict){ ! 229: putch(' ',NO); ! 230: eatspace(); ! 231: } ! 232: keyflag = SINIT; ! 233: } ! 234: continue; ! 235: case '}': ! 236: pt = getnext(0); /* to handle initialized structures */ ! 237: if(*pt == ','){ ! 238: if(strict){ ! 239: putspace(' ',NO); ! 240: eatspace(); ! 241: } ! 242: putch(c,NO); ! 243: putch(*pt,NO); ! 244: *pt = '\0'; ! 245: ct = getnl(); ! 246: pt = getnext(0); ! 247: if(*pt == '{'){ ! 248: OUT; ! 249: while((cc = getch()) != '{'); ! 250: putch(cc,NO); ! 251: if(strict){ ! 252: putch(' ',NO); ! 253: eatspace(); ! 254: } ! 255: pt = getnext(0); ! 256: continue; ! 257: } ! 258: else if(strict || ct){ ! 259: OUT; ! 260: } ! 261: continue; ! 262: } ! 263: else if(keyflag == SINIT && *pt == '}'){ ! 264: if(strict) ! 265: putspace(' ',NO); ! 266: putch(c,NO); ! 267: getnl(); ! 268: OUT; ! 269: keyflag = DATADEF; ! 270: *pt = '\0'; ! 271: pt = getnext(0); ! 272: } ! 273: outs(clev->tabs); ! 274: if(--clev < ind)clev = ind; ! 275: ptabs(clev->tabs); ! 276: putch(c,NO); ! 277: lbegin = 0; ! 278: lptr=lookup(pt,lastplace+1); ! 279: c = *pt; ! 280: if(*pt == ';' || *pt == ','){ ! 281: putch(*pt,NO); ! 282: *pt = '\0'; ! 283: lastplace=pt; ! 284: } ! 285: ct = getnl(); ! 286: if((dolevel && clev->tabs <= dotabs[dolevel]) || (structlev ) ! 287: || (lptr != 0 &&lptr->type == ELSE&& clev->pdepth == 0)){ ! 288: if(c == ';'){ ! 289: OUTK; ! 290: } ! 291: else if(strict || (lptr != 0 && lptr->type == ELSE && ct == 0)){ ! 292: putspace(' ',NO); ! 293: eatspace(); ! 294: } ! 295: else if(lptr != 0 && lptr->type == ELSE){ ! 296: OUTK; ! 297: } ! 298: if(structlev){ ! 299: structlev--; ! 300: keyflag = DATADEF; ! 301: } ! 302: } ! 303: else { ! 304: OUTK; ! 305: if(strict && clev->tabs == 0){ ! 306: if((c=getch()) != '\n'){ ! 307: putchar('\n'); ! 308: putchar('\n'); ! 309: unget(c); ! 310: } ! 311: else { ! 312: putchar('\n'); ! 313: if((c=getch()) != '\n')unget(c); ! 314: putchar('\n'); ! 315: } ! 316: } ! 317: } ! 318: if(lptr != 0 && lptr->type == ELSE && clev->pdepth != 0){ ! 319: UNBUMP; ! 320: } ! 321: if(lptr == 0 || lptr->type != ELSE){ ! 322: clev->iflev = 0; ! 323: if(dolevel && docurly[dolevel] == NO && clev->tabs == dotabs[dolevel]+1) ! 324: clev->tabs--; ! 325: else if(clev->pdepth != 0){ ! 326: UNBUMP; ! 327: } ! 328: } ! 329: continue; ! 330: case '(': ! 331: paren++; ! 332: if ((lptr = lookup(lastlook,p)) != 0){ ! 333: if(!(lptr->type == TYPE || lptr->type == STRUCT))keyflag=KEYWORD; ! 334: if (strict){ ! 335: putspace(lptr->punc,NO); ! 336: opflag = 1; ! 337: } ! 338: putch(c,NO); ! 339: if (lptr->type == IF)gotif(); ! 340: } ! 341: else { ! 342: putch(c,NO); ! 343: lastlook = p; ! 344: opflag = 1; ! 345: } ! 346: continue; ! 347: case ')': ! 348: if(--paren < 0)paren = 0; ! 349: putch(c,NO); ! 350: if((lptr = lookup(lastlook,p)) != 0){ ! 351: if(lptr->type == TYPE || lptr->type == STRUCT) ! 352: opflag = 1; ! 353: } ! 354: else if(keyflag == DATADEF)opflag = 1; ! 355: else opflag = 0; ! 356: outs(clev->tabs); ! 357: pt = getnext(1); ! 358: if ((ct = getnl()) == 1 && !strict){ ! 359: if(dolevel && clev->tabs <= dotabs[dolevel]) ! 360: resetdo(); ! 361: if(clev->tabs > 0 && (paren != 0 || keyflag == 0)){ ! 362: if(join){ ! 363: eatspace(); ! 364: putch(' ',YES); ! 365: continue; ! 366: } else { ! 367: OUT; ! 368: split = 1; ! 369: continue; ! 370: } ! 371: } ! 372: else if(clev->tabs > 0 && *pt != '{'){ ! 373: BUMP; ! 374: } ! 375: OUTK; ! 376: } ! 377: else if(strict){ ! 378: if(clev->tabs == 0){ ! 379: if(*pt != ';' && *pt != ',' && *pt != '(' && *pt != '['){ ! 380: OUTK; ! 381: } ! 382: } ! 383: else { ! 384: if(keyflag == KEYWORD && paren == 0){ ! 385: if(dolevel && clev->tabs <= dotabs[dolevel]){ ! 386: resetdo(); ! 387: eatspace(); ! 388: continue; ! 389: } ! 390: if(*pt != '{'){ ! 391: BUMP; ! 392: OUTK; ! 393: } ! 394: else { ! 395: *pt='\0'; ! 396: eatspace(); ! 397: unget('{'); ! 398: } ! 399: } ! 400: else if(ct){ ! 401: if(paren){ ! 402: if(join){ ! 403: eatspace(); ! 404: } else { ! 405: split = 1; ! 406: OUT; ! 407: } ! 408: } ! 409: else { ! 410: OUTK; ! 411: } ! 412: } ! 413: } ! 414: } ! 415: else if(dolevel && clev->tabs <= dotabs[dolevel]) ! 416: resetdo(); ! 417: continue; ! 418: case ' ': ! 419: case '\t': ! 420: if ((lptr = lookup(lastlook,p)) != 0){ ! 421: if(!(lptr->type==TYPE||lptr->type==STRUCT)) ! 422: keyflag = KEYWORD; ! 423: else if(paren == 0)keyflag = DATADEF; ! 424: if(strict){ ! 425: if(lptr->type != ELSE){ ! 426: if(lptr->type == TYPE){ ! 427: if(paren != 0)putch(' ',YES); ! 428: } ! 429: else ! 430: putch(lptr->punc,NO); ! 431: eatspace(); ! 432: } ! 433: } ! 434: else putch(c,YES); ! 435: switch(lptr->type){ ! 436: case CASE: ! 437: outs(clev->tabs-1); ! 438: continue; ! 439: case ELSE: ! 440: pt = getnext(1); ! 441: eatspace(); ! 442: if((cc = getch()) == '\n' && !strict){ ! 443: unget(cc); ! 444: } ! 445: else { ! 446: unget(cc); ! 447: if(checkif(pt))continue; ! 448: } ! 449: gotelse(); ! 450: if(strict) unget(c); ! 451: if(getnl() == 1 && !strict){ ! 452: OUTK; ! 453: if(*pt != '{'){ ! 454: BUMP; ! 455: } ! 456: } ! 457: else if(strict){ ! 458: if(*pt != '{'){ ! 459: OUTK; ! 460: BUMP; ! 461: } ! 462: } ! 463: continue; ! 464: case IF: ! 465: gotif(); ! 466: continue; ! 467: case DO: ! 468: gotdo(); ! 469: pt = getnext(1); ! 470: if(*pt != '{'){ ! 471: eatallsp(); ! 472: OUTK; ! 473: docurly[dolevel] = NO; ! 474: dopdepth[dolevel] = clev->pdepth; ! 475: clev->pdepth = 0; ! 476: clev->tabs++; ! 477: } ! 478: continue; ! 479: case TYPE: ! 480: if(paren)continue; ! 481: if(!strict)continue; ! 482: gottype(lptr); ! 483: continue; ! 484: case STRUCT: ! 485: gotstruct(); ! 486: continue; ! 487: } ! 488: } ! 489: else if (lbegin == 0 || p > string) ! 490: if(strict) ! 491: putch(c,NO); ! 492: else putch(c,YES); ! 493: continue; ! 494: case ';': ! 495: putch(c,NO); ! 496: if(paren != 0){ ! 497: if(strict){ ! 498: putch(' ',YES); ! 499: eatspace(); ! 500: } ! 501: opflag = 1; ! 502: continue; ! 503: } ! 504: outs(clev->tabs); ! 505: pt = getnext(0); ! 506: lptr=lookup(pt,lastplace+1); ! 507: if(lptr == 0 || lptr->type != ELSE){ ! 508: clev->iflev = 0; ! 509: if(clev->pdepth != 0){ ! 510: UNBUMP; ! 511: } ! 512: if(dolevel && docurly[dolevel] == NO && clev->tabs <= dotabs[dolevel]+1) ! 513: clev->tabs--; ! 514: /* ! 515: else if(clev->pdepth != 0){ ! 516: UNBUMP; ! 517: } ! 518: */ ! 519: } ! 520: getnl(); ! 521: OUTK; ! 522: continue; ! 523: case '\n': ! 524: if ((lptr = lookup(lastlook,p)) != 0){ ! 525: pt = getnext(1); ! 526: if (lptr->type == ELSE){ ! 527: if(strict) ! 528: if(checkif(pt))continue; ! 529: gotelse(); ! 530: OUTK; ! 531: if(*pt != '{'){ ! 532: BUMP; ! 533: } ! 534: } ! 535: else if(lptr->type == DO){ ! 536: OUTK; ! 537: gotdo(); ! 538: if(*pt != '{'){ ! 539: docurly[dolevel] = NO; ! 540: dopdepth[dolevel] = clev->pdepth; ! 541: clev->pdepth = 0; ! 542: clev->tabs++; ! 543: } ! 544: } ! 545: else { ! 546: OUTK; ! 547: if(lptr->type == STRUCT)gotstruct(); ! 548: } ! 549: } ! 550: else if(p == string)putchar('\n'); ! 551: else { ! 552: if(clev->tabs > 0 &&(paren != 0 || keyflag == 0)){ ! 553: if(join){ ! 554: putch(' ',YES); ! 555: eatspace(); ! 556: continue; ! 557: } else { ! 558: OUT; ! 559: split = 1; ! 560: continue; ! 561: } ! 562: } ! 563: else if(keyflag == KEYWORD){ ! 564: OUTK; ! 565: continue; ! 566: } ! 567: OUT; ! 568: } ! 569: continue; ! 570: case '"': ! 571: case '\'': ! 572: putch(c,NO); ! 573: while ((cc = getch()) != c){ ! 574: putch(cc,NO); ! 575: if (cc == '\\'){ ! 576: putch(getch(),NO); ! 577: } ! 578: if (cc == '\n'){ ! 579: outs(clev->tabs); ! 580: lbegin = 1; ! 581: count = 0; ! 582: } ! 583: } ! 584: putch(cc,NO); ! 585: opflag=0; ! 586: if (getnl() == 1){ ! 587: unget('\n'); ! 588: } ! 589: continue; ! 590: case '\\': ! 591: putch(c,NO); ! 592: putch(getch(),NO); ! 593: continue; ! 594: case '?': ! 595: question = 1; ! 596: gotop(c); ! 597: continue; ! 598: case ':': ! 599: if (question == 1){ ! 600: question = 0; ! 601: gotop(c); ! 602: continue; ! 603: } ! 604: putch(c,NO); ! 605: if(structlev)continue; ! 606: if ((lptr = lookup(lastlook,p)) != 0){ ! 607: if (lptr->type == CASE)outs(clev->tabs - 1); ! 608: } ! 609: else { ! 610: lbegin = 0; ! 611: outs(clev->tabs); ! 612: } ! 613: getnl(); ! 614: OUTK; ! 615: continue; ! 616: case '/': ! 617: if ((cc = getch()) != '*'){ ! 618: unget(cc); ! 619: gotop(c); ! 620: continue; ! 621: } ! 622: putch(c,NO); ! 623: putch(cc,NO); ! 624: cc = comment(YES); ! 625: if(getnl() == 1){ ! 626: if(cc == 0){ ! 627: OUT; ! 628: } ! 629: else { ! 630: outs(0); ! 631: putchar('\n'); ! 632: lbegin = 1; ! 633: count = 0; ! 634: } ! 635: lastlook = 0; ! 636: } ! 637: continue; ! 638: case '[': ! 639: putch(c,NO); ! 640: ct = 0; ! 641: while((c = getch()) != ']' || ct > 0){ ! 642: putch(c,NO); ! 643: if(c == '[')ct++; ! 644: if(c == ']')ct--; ! 645: } ! 646: putch(c,NO); ! 647: continue; ! 648: case '#': ! 649: putch(c,NO); ! 650: while ((cc = getch()) != '\n'){ ! 651: if (cc == '\\'){ ! 652: putch(cc,NO); ! 653: cc = getch(); ! 654: } ! 655: putch(cc,NO); ! 656: } ! 657: putch(cc,NO); ! 658: lbegin = 0; ! 659: outs(clev->tabs); ! 660: lbegin = 1; ! 661: count = 0; ! 662: continue; ! 663: default: ! 664: if (c == ','){ ! 665: opflag = 1; ! 666: putch(c,YES); ! 667: if (strict){ ! 668: if ((cc = getch()) != ' ')unget(cc); ! 669: if(cc != '\n')putch(' ',YES); ! 670: } ! 671: } ! 672: else if(isop(c))gotop(c); ! 673: else { ! 674: if(isalnum(c) && lastlook == 0)lastlook = p; ! 675: putch(c,NO); ! 676: if(keyflag != DATADEF)opflag = 0; ! 677: } ! 678: } ! 679: } ! 680: } ! 681: ! 682: gotif(){ ! 683: outs(clev->tabs); ! 684: if(++clev->iflev >= IFLEVEL-1){ ! 685: fprintf(stderr,"too many levels of if\n"); ! 686: clev->iflev = IFLEVEL-1; ! 687: } ! 688: clev->ifc[clev->iflev] = clev->tabs; ! 689: clev->spdepth[clev->iflev] = clev->pdepth; ! 690: } ! 691: ! 692: gotelse(){ ! 693: clev->tabs = clev->ifc[clev->iflev]; ! 694: clev->pdepth = clev->spdepth[clev->iflev]; ! 695: if(--(clev->iflev) < 0)clev->iflev = 0; ! 696: } ! 697: ! 698: checkif(pt) ! 699: char *pt; ! 700: { ! 701: register struct keyw *lptr; ! 702: int cc; ! 703: if((lptr=lookup(pt,lastplace+1))!= 0){ ! 704: if(lptr->type == IF){ ! 705: if(strict)putch(' ',YES); ! 706: copy(lptr->name); ! 707: *pt='\0'; ! 708: lastplace = pt; ! 709: if(strict){ ! 710: putch(lptr->punc,NO); ! 711: eatallsp(); ! 712: } ! 713: clev->tabs = clev->ifc[clev->iflev]; ! 714: clev->pdepth = clev->spdepth[clev->iflev]; ! 715: keyflag = KEYWORD; ! 716: return(1); ! 717: } ! 718: } ! 719: return(0); ! 720: } ! 721: gotdo(){ ! 722: if(++dolevel >= DOLEVEL-1){ ! 723: fprintf(stderr,"too many levels of do\n"); ! 724: dolevel = DOLEVEL-1; ! 725: } ! 726: dotabs[dolevel] = clev->tabs; ! 727: docurly[dolevel] = YES; ! 728: } ! 729: resetdo(){ ! 730: if(docurly[dolevel] == NO) ! 731: clev->pdepth = dopdepth[dolevel]; ! 732: if(--dolevel < 0)dolevel = 0; ! 733: } ! 734: gottype(lptr) ! 735: struct keyw *lptr; ! 736: { ! 737: char *pt; ! 738: struct keyw *tlptr; ! 739: int c; ! 740: while(1){ ! 741: pt = getnext(1); ! 742: if((tlptr=lookup(pt,lastplace+1))!=0){ ! 743: putch(' ',YES); ! 744: copy(tlptr->name); ! 745: *pt='\0'; ! 746: lastplace = pt; ! 747: if(tlptr->type == STRUCT){ ! 748: putch(tlptr->punc,YES); ! 749: gotstruct(); ! 750: break; ! 751: } ! 752: lptr=tlptr; ! 753: continue; ! 754: } ! 755: else{ ! 756: putch(lptr->punc,NO); ! 757: while((c=getch())== ' ' || c == '\t'); ! 758: unget(c); ! 759: break; ! 760: } ! 761: } ! 762: } ! 763: gotstruct(){ ! 764: int c; ! 765: int cc; ! 766: char *pt; ! 767: while((c=getch()) == ' ' || c == '\t') ! 768: if(!strict)putch(c,NO); ! 769: if(c == '{'){ ! 770: structlev++; ! 771: unget(c); ! 772: return; ! 773: } ! 774: if(isalpha(c)){ ! 775: putch(c,NO); ! 776: while(isalnum(c=getch()))putch(c,NO); ! 777: } ! 778: unget(c); ! 779: pt = getnext(1); ! 780: if(*pt == '{')structlev++; ! 781: if(strict){ ! 782: eatallsp(); ! 783: putch(' ',NO); ! 784: } ! 785: } ! 786: gotop(c) ! 787: { ! 788: char optmp[OPLENGTH]; ! 789: char *op_ptr; ! 790: struct op *s_op; ! 791: char *a, *b; ! 792: op_ptr = optmp; ! 793: *op_ptr++ = c; ! 794: while (isop(( *op_ptr = getch())))op_ptr++; ! 795: if(!strict)unget(*op_ptr); ! 796: else if (*op_ptr != ' ')unget( *op_ptr); ! 797: *op_ptr = '\0'; ! 798: s_op = op; ! 799: b = optmp; ! 800: while ((a = s_op->name) != 0){ ! 801: op_ptr = b; ! 802: while ((*op_ptr == *a) && (*op_ptr != '\0')){ ! 803: a++; ! 804: op_ptr++; ! 805: } ! 806: if (*a == '\0'){ ! 807: keep(s_op); ! 808: opflag = s_op->setop; ! 809: if (*op_ptr != '\0'){ ! 810: b = op_ptr; ! 811: s_op = op; ! 812: continue; ! 813: } ! 814: else break; ! 815: } ! 816: else s_op++; ! 817: } ! 818: } ! 819: keep(o) ! 820: struct op *o; ! 821: { ! 822: char *s; ! 823: int ok; ! 824: if(o->blanks == NEVER)ok = NO; ! 825: else ok = YES; ! 826: if (strict && ((o->blanks & ALWAYS) ! 827: || ((opflag == 0 && o->blanks & SOMETIMES) && clev->tabs != 0))) ! 828: putspace(' ',YES); ! 829: for(s=o->name; *s != '\0'; s++){ ! 830: if(*(s+1) == '\0')putch(*s,ok); ! 831: else ! 832: putch(*s,NO); ! 833: } ! 834: if (strict && ((o->blanks & ALWAYS) ! 835: || ((opflag == 0 && o->blanks & SOMETIMES) && clev->tabs != 0))) putch(' ',YES); ! 836: } ! 837: getnl(){ ! 838: register int ch; ! 839: char *savp; ! 840: int gotcmt; ! 841: gotcmt = 0; ! 842: savp = p; ! 843: while ((ch = getch()) == '\t' || ch == ' ')putch(ch,NO); ! 844: if (ch == '/'){ ! 845: if ((ch = getch()) == '*'){ ! 846: putch('/',NO); ! 847: putch('*',NO); ! 848: comment(NO); ! 849: ch = getch(); ! 850: gotcmt=1; ! 851: } ! 852: else { ! 853: if(inswitch)*(++lastplace) = ch; ! 854: else { ! 855: inswitch = 1; ! 856: *lastplace = ch; ! 857: } ! 858: unget('/'); ! 859: return(0); ! 860: } ! 861: } ! 862: if(ch == '\n'){ ! 863: if(gotcmt == 0)p=savp; ! 864: return(1); ! 865: } ! 866: unget(ch); ! 867: return(0); ! 868: } ! 869: ptabs(n){ ! 870: int i; ! 871: int num; ! 872: if(n > maxtabs){ ! 873: if(!folded){ ! 874: printf("/* code folded from here */\n"); ! 875: folded = 1; ! 876: } ! 877: num = n-maxtabs; ! 878: } ! 879: else { ! 880: num = n; ! 881: if(folded){ ! 882: folded = 0; ! 883: printf("/* unfolding */\n"); ! 884: } ! 885: } ! 886: for (i = 0; i < num; i++)putchar('\t'); ! 887: } ! 888: outs(n){ ! 889: if (p > string){ ! 890: if (lbegin){ ! 891: ptabs(n); ! 892: lbegin = 0; ! 893: if (split == 1){ ! 894: split = 0; ! 895: if (clev->tabs > 0)printf(" "); ! 896: } ! 897: } ! 898: *p = '\0'; ! 899: printf("%s", string); ! 900: lastlook = p = string; ! 901: } ! 902: else { ! 903: if (lbegin != 0){ ! 904: lbegin = 0; ! 905: split = 0; ! 906: } ! 907: } ! 908: } ! 909: putch(c,ok) ! 910: char c; ! 911: { ! 912: register int cc; ! 913: if(p < &string[LINE-1]){ ! 914: if(count+TABLENG*clev->tabs >= maxleng && ok && !folded){ ! 915: if(c != ' ')*p++ = c; ! 916: OUT; ! 917: split = 1; ! 918: if((cc=getch()) != '\n')unget(cc); ! 919: } ! 920: else { ! 921: *p++ = c; ! 922: count++; ! 923: } ! 924: } ! 925: else { ! 926: outs(clev->tabs); ! 927: *p++ = c; ! 928: count = 0; ! 929: } ! 930: } ! 931: struct keyw * ! 932: lookup(first, last) ! 933: char *first, *last; ! 934: { ! 935: struct keyw *ptr; ! 936: char *cptr, *ckey, *k; ! 937: ! 938: if(first == last || first == 0)return(0); ! 939: cptr = first; ! 940: while (*cptr == ' ' || *cptr == '\t')cptr++; ! 941: if(cptr >= last)return(0); ! 942: ptr = key; ! 943: while ((ckey = ptr->name) != 0){ ! 944: for (k = cptr; (*ckey == *k && *ckey != '\0'); k++, ckey++); ! 945: if(*ckey=='\0' && (k==last|| (k<last && !isalnum(*k)))){ ! 946: opflag = 1; ! 947: lastlook = 0; ! 948: return(ptr); ! 949: } ! 950: ptr++; ! 951: } ! 952: return(0); ! 953: } ! 954: comment(ok) ! 955: { ! 956: register int ch; ! 957: int hitnl; ! 958: ! 959: hitnl = 0; ! 960: while ((ch = getch()) != EOF){ ! 961: putch(ch, NO); ! 962: if (ch == '*'){ ! 963: gotstar: ! 964: if ((ch = getch()) == '/'){ ! 965: putch(ch,NO); ! 966: return(hitnl); ! 967: } ! 968: putch(ch,NO); ! 969: if (ch == '*')goto gotstar; ! 970: } ! 971: if (ch == '\n'){ ! 972: if(ok && !hitnl){ ! 973: outs(clev->tabs); ! 974: } ! 975: else { ! 976: outs(0); ! 977: } ! 978: lbegin = 1; ! 979: count = 0; ! 980: hitnl = 1; ! 981: } ! 982: } ! 983: return(hitnl); ! 984: } ! 985: putspace(ch,ok) ! 986: char ch; ! 987: { ! 988: if(p == string)putch(ch,ok); ! 989: else if (*(p - 1) != ch) putch(ch,ok); ! 990: } ! 991: getch(){ ! 992: register char c; ! 993: if(inswitch){ ! 994: if(next != '\0'){ ! 995: c=next; ! 996: next = '\0'; ! 997: return(c); ! 998: } ! 999: if(tptr <= lastplace){ ! 1000: if(*tptr != '\0')return(*tptr++); ! 1001: else if(++tptr <= lastplace)return(*tptr++); ! 1002: } ! 1003: inswitch=0; ! 1004: lastplace = tptr = temp; ! 1005: } ! 1006: return(getc(input)); ! 1007: } ! 1008: unget(c) ! 1009: { ! 1010: if(inswitch){ ! 1011: if(tptr != temp) ! 1012: *(--tptr) = c; ! 1013: else next = c; ! 1014: } ! 1015: else ungetc(c,input); ! 1016: } ! 1017: char * ! 1018: getnext(must){ ! 1019: int c; ! 1020: char *beg; ! 1021: int prect,nlct; ! 1022: prect = nlct = 0; ! 1023: if(tptr > lastplace){ ! 1024: tptr = lastplace = temp; ! 1025: err = 0; ! 1026: inswitch = 0; ! 1027: } ! 1028: tp = beg = lastplace; ! 1029: if(inswitch && tptr <= lastplace) ! 1030: if (isalnum(*lastplace)||ispunct(*lastplace)||isop(*lastplace))return(lastplace); ! 1031: space: ! 1032: while(isspace(c=getc(input)))puttmp(c,1); ! 1033: beg = tp; ! 1034: puttmp(c,1); ! 1035: if(c == '/'){ ! 1036: if(puttmp((c=getc(input)),1) == '*'){ ! 1037: cont: ! 1038: while((c=getc(input)) != '*'){ ! 1039: puttmp(c,0); ! 1040: if(must == 0 && c == '\n') ! 1041: if(nlct++ > 2)goto done; ! 1042: } ! 1043: puttmp(c,1); ! 1044: star: ! 1045: if(puttmp((c=getc(input)),1) == '/'){ ! 1046: beg = tp; ! 1047: puttmp((c=getc(input)),1); ! 1048: } ! 1049: else if(c == '*')goto star; ! 1050: else goto cont; ! 1051: } ! 1052: else goto done; ! 1053: } ! 1054: if(isspace(c))goto space; ! 1055: if(c == '#' && tp > temp+1 && *(tp-2) == '\n'){ ! 1056: if(prect++ > 2)goto done; ! 1057: while(puttmp((c=getc(input)),1) != '\n') ! 1058: if(c == '\\')puttmp(getc(input),1); ! 1059: goto space; ! 1060: } ! 1061: if(isalnum(c)){ ! 1062: while(isalnum(c = getc(input)))puttmp(c,1); ! 1063: ungetc(c,input); ! 1064: } ! 1065: done: ! 1066: puttmp('\0',1); ! 1067: lastplace = tp-1; ! 1068: inswitch = 1; ! 1069: return(beg); ! 1070: } ! 1071: copy(s) ! 1072: char *s; ! 1073: { ! 1074: while(*s != '\0')putch(*s++,NO); ! 1075: } ! 1076: clearif(cl) ! 1077: struct indent *cl; ! 1078: { ! 1079: int i; ! 1080: for(i=0;i<IFLEVEL-1;i++)cl->ifc[i] = 0; ! 1081: } ! 1082: char puttmp(c,keep) ! 1083: char c; ! 1084: { ! 1085: if(tp < &temp[TEMP-120]) ! 1086: *tp++ = c; ! 1087: else { ! 1088: if(keep){ ! 1089: if(tp >= &temp[TEMP-1]){ ! 1090: fprintf(stderr,"can't look past huge comment - quiting\n"); ! 1091: exit(1); ! 1092: } ! 1093: *tp++ = c; ! 1094: } ! 1095: else if(err == 0){ ! 1096: err++; ! 1097: fprintf(stderr,"truncating long comment\n"); ! 1098: } ! 1099: } ! 1100: return(c); ! 1101: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.