12da9d879SDavid du Colombier #include <u.h> 22da9d879SDavid du Colombier #include <libc.h> 32da9d879SDavid du Colombier #include <bio.h> 42da9d879SDavid du Colombier #include "cb.h" 52da9d879SDavid du Colombier #include "cbtype.h" 62da9d879SDavid du Colombier 72da9d879SDavid du Colombier void 82da9d879SDavid du Colombier main(int argc, char *argv[]) 92da9d879SDavid du Colombier { 102da9d879SDavid du Colombier Biobuf stdin, stdout; 112da9d879SDavid du Colombier 122da9d879SDavid du Colombier while (--argc > 0 && (*++argv)[0] == '-'){ 132da9d879SDavid du Colombier switch ((*argv)[1]){ 142da9d879SDavid du Colombier case 's': 152da9d879SDavid du Colombier strict = 1; 162da9d879SDavid du Colombier continue; 172da9d879SDavid du Colombier case 'j': 182da9d879SDavid du Colombier join = 1; 192da9d879SDavid du Colombier continue; 202da9d879SDavid du Colombier case 'l': 212da9d879SDavid du Colombier if((*argv)[2] != '\0'){ 222da9d879SDavid du Colombier maxleng = atoi( &((*argv)[2]) ); 232da9d879SDavid du Colombier } 242da9d879SDavid du Colombier else{ 252da9d879SDavid du Colombier maxleng = atoi(*++argv); 262da9d879SDavid du Colombier argc--; 272da9d879SDavid du Colombier } 282da9d879SDavid du Colombier maxtabs = maxleng/TABLENG - 2; 292da9d879SDavid du Colombier maxleng -= (maxleng + 5)/10; 302da9d879SDavid du Colombier continue; 312da9d879SDavid du Colombier default: 322da9d879SDavid du Colombier fprint(2, "cb: illegal option %c\n", *argv[1]); 332da9d879SDavid du Colombier exits("boom"); 342da9d879SDavid du Colombier } 352da9d879SDavid du Colombier } 362da9d879SDavid du Colombier Binit(&stdout, 1, OWRITE); 372da9d879SDavid du Colombier output = &stdout; 382da9d879SDavid du Colombier if (argc <= 0){ 392da9d879SDavid du Colombier Binit(&stdin, 0, OREAD); 402da9d879SDavid du Colombier input = &stdin; 412da9d879SDavid du Colombier work(); 422da9d879SDavid du Colombier } else { 432da9d879SDavid du Colombier while (argc-- > 0){ 442da9d879SDavid du Colombier if ((input = Bopen( *argv, OREAD)) == 0){ 452da9d879SDavid du Colombier fprint(2, "cb: cannot open input file %s\n", *argv); 462da9d879SDavid du Colombier exits("boom"); 472da9d879SDavid du Colombier } 482da9d879SDavid du Colombier work(); 492da9d879SDavid du Colombier argv++; 502da9d879SDavid du Colombier } 512da9d879SDavid du Colombier } 522da9d879SDavid du Colombier exits(0); 532da9d879SDavid du Colombier } 542da9d879SDavid du Colombier void 552da9d879SDavid du Colombier work(void){ 562da9d879SDavid du Colombier int c; 572da9d879SDavid du Colombier struct keyw *lptr; 582da9d879SDavid du Colombier char *pt; 592da9d879SDavid du Colombier char cc; 602da9d879SDavid du Colombier int ct; 612da9d879SDavid du Colombier 622da9d879SDavid du Colombier while ((c = getch()) != Beof){ 632da9d879SDavid du Colombier switch (c){ 642da9d879SDavid du Colombier case '{': 652da9d879SDavid du Colombier if ((lptr = lookup(lastlook,p)) != 0){ 662da9d879SDavid du Colombier if (lptr->type == ELSE)gotelse(); 672da9d879SDavid du Colombier else if(lptr->type == DO)gotdo(); 682da9d879SDavid du Colombier else if(lptr->type == STRUCT)structlev++; 692da9d879SDavid du Colombier } 702da9d879SDavid du Colombier if(++clev >= &ind[CLEVEL-1]){ 712da9d879SDavid du Colombier fprint(2,"too many levels of curly brackets\n"); 722da9d879SDavid du Colombier clev = &ind[CLEVEL-1]; 732da9d879SDavid du Colombier } 742da9d879SDavid du Colombier clev->pdepth = 0; 752da9d879SDavid du Colombier clev->tabs = (clev-1)->tabs; 762da9d879SDavid du Colombier clearif(clev); 772da9d879SDavid du Colombier if(strict && clev->tabs > 0) 782da9d879SDavid du Colombier putspace(' ',NO); 792da9d879SDavid du Colombier putch(c,NO); 802da9d879SDavid du Colombier getnl(); 812da9d879SDavid du Colombier if(keyflag == DATADEF){ 822da9d879SDavid du Colombier OUT; 832da9d879SDavid du Colombier } 842da9d879SDavid du Colombier else { 852da9d879SDavid du Colombier OUTK; 862da9d879SDavid du Colombier } 872da9d879SDavid du Colombier clev->tabs++; 882da9d879SDavid du Colombier pt = getnext(0); /* to handle initialized structures */ 892da9d879SDavid du Colombier if(*pt == '{'){ /* hide one level of {} */ 902da9d879SDavid du Colombier while((c=getch()) != '{') 912da9d879SDavid du Colombier if(c == Beof)error("{"); 922da9d879SDavid du Colombier putch(c,NO); 932da9d879SDavid du Colombier if(strict){ 942da9d879SDavid du Colombier putch(' ',NO); 952da9d879SDavid du Colombier eatspace(); 962da9d879SDavid du Colombier } 972da9d879SDavid du Colombier keyflag = SINIT; 982da9d879SDavid du Colombier } 992da9d879SDavid du Colombier continue; 1002da9d879SDavid du Colombier case '}': 1012da9d879SDavid du Colombier pt = getnext(0); /* to handle initialized structures */ 1022da9d879SDavid du Colombier if(*pt == ','){ 1032da9d879SDavid du Colombier if(strict){ 1042da9d879SDavid du Colombier putspace(' ',NO); 1052da9d879SDavid du Colombier eatspace(); 1062da9d879SDavid du Colombier } 1072da9d879SDavid du Colombier putch(c,NO); 1082da9d879SDavid du Colombier putch(*pt,NO); 1092da9d879SDavid du Colombier *pt = '\0'; 1102da9d879SDavid du Colombier ct = getnl(); 1112da9d879SDavid du Colombier pt = getnext(0); 1122da9d879SDavid du Colombier if(*pt == '{'){ 1132da9d879SDavid du Colombier OUT; 1142da9d879SDavid du Colombier while((cc = getch()) != '{') 1152da9d879SDavid du Colombier if(cc == Beof)error("}"); 1162da9d879SDavid du Colombier putch(cc,NO); 1172da9d879SDavid du Colombier if(strict){ 1182da9d879SDavid du Colombier putch(' ',NO); 1192da9d879SDavid du Colombier eatspace(); 1202da9d879SDavid du Colombier } 1212da9d879SDavid du Colombier getnext(0); 1222da9d879SDavid du Colombier continue; 1232da9d879SDavid du Colombier } 1242da9d879SDavid du Colombier else if(strict || ct){ 1252da9d879SDavid du Colombier OUT; 1262da9d879SDavid du Colombier } 1272da9d879SDavid du Colombier continue; 1282da9d879SDavid du Colombier } 1292da9d879SDavid du Colombier else if(keyflag == SINIT && *pt == '}'){ 1302da9d879SDavid du Colombier if(strict) 1312da9d879SDavid du Colombier putspace(' ',NO); 1322da9d879SDavid du Colombier putch(c,NO); 1332da9d879SDavid du Colombier getnl(); 1342da9d879SDavid du Colombier OUT; 1352da9d879SDavid du Colombier keyflag = DATADEF; 1362da9d879SDavid du Colombier *pt = '\0'; 1372da9d879SDavid du Colombier pt = getnext(0); 1382da9d879SDavid du Colombier } 1392da9d879SDavid du Colombier outs(clev->tabs); 1402da9d879SDavid du Colombier if(--clev < ind)clev = ind; 1412da9d879SDavid du Colombier ptabs(clev->tabs); 1422da9d879SDavid du Colombier putch(c,NO); 1432da9d879SDavid du Colombier lbegin = 0; 1442da9d879SDavid du Colombier lptr=lookup(pt,lastplace+1); 1452da9d879SDavid du Colombier c = *pt; 1462da9d879SDavid du Colombier if(*pt == ';' || *pt == ','){ 1472da9d879SDavid du Colombier putch(*pt,NO); 1482da9d879SDavid du Colombier *pt = '\0'; 1492da9d879SDavid du Colombier lastplace=pt; 1502da9d879SDavid du Colombier } 1512da9d879SDavid du Colombier ct = getnl(); 1522da9d879SDavid du Colombier if((dolevel && clev->tabs <= dotabs[dolevel]) || (structlev ) 1532da9d879SDavid du Colombier || (lptr != 0 &&lptr->type == ELSE&& clev->pdepth == 0)){ 1542da9d879SDavid du Colombier if(c == ';'){ 1552da9d879SDavid du Colombier OUTK; 1562da9d879SDavid du Colombier } 1572da9d879SDavid du Colombier else if(strict || (lptr != 0 && lptr->type == ELSE && ct == 0)){ 1582da9d879SDavid du Colombier putspace(' ',NO); 1592da9d879SDavid du Colombier eatspace(); 1602da9d879SDavid du Colombier } 1612da9d879SDavid du Colombier else if(lptr != 0 && lptr->type == ELSE){ 1622da9d879SDavid du Colombier OUTK; 1632da9d879SDavid du Colombier } 1642da9d879SDavid du Colombier if(structlev){ 1652da9d879SDavid du Colombier structlev--; 1662da9d879SDavid du Colombier keyflag = DATADEF; 1672da9d879SDavid du Colombier } 1682da9d879SDavid du Colombier } 1692da9d879SDavid du Colombier else { 1702da9d879SDavid du Colombier OUTK; 1712da9d879SDavid du Colombier if(strict && clev->tabs == 0){ 1722da9d879SDavid du Colombier if((c=getch()) != '\n'){ 1732da9d879SDavid du Colombier Bputc(output, '\n'); 1742da9d879SDavid du Colombier Bputc(output, '\n'); 1752da9d879SDavid du Colombier unget(c); 1762da9d879SDavid du Colombier } 1772da9d879SDavid du Colombier else { 1782da9d879SDavid du Colombier lineno++; 1792da9d879SDavid du Colombier Bputc(output, '\n'); 1802da9d879SDavid du Colombier if((c=getch()) != '\n')unget(c); 1812da9d879SDavid du Colombier else lineno++; 1822da9d879SDavid du Colombier Bputc(output, '\n'); 1832da9d879SDavid du Colombier } 1842da9d879SDavid du Colombier } 1852da9d879SDavid du Colombier } 1862da9d879SDavid du Colombier if(lptr != 0 && lptr->type == ELSE && clev->pdepth != 0){ 1872da9d879SDavid du Colombier UNBUMP; 1882da9d879SDavid du Colombier } 1892da9d879SDavid du Colombier if(lptr == 0 || lptr->type != ELSE){ 1902da9d879SDavid du Colombier clev->iflev = 0; 1912da9d879SDavid du Colombier if(dolevel && docurly[dolevel] == NO && clev->tabs == dotabs[dolevel]+1) 1922da9d879SDavid du Colombier clev->tabs--; 1932da9d879SDavid du Colombier else if(clev->pdepth != 0){ 1942da9d879SDavid du Colombier UNBUMP; 1952da9d879SDavid du Colombier } 1962da9d879SDavid du Colombier } 1972da9d879SDavid du Colombier continue; 1982da9d879SDavid du Colombier case '(': 1992da9d879SDavid du Colombier paren++; 2002da9d879SDavid du Colombier if ((lptr = lookup(lastlook,p)) != 0){ 2012da9d879SDavid du Colombier if(!(lptr->type == TYPE || lptr->type == STRUCT))keyflag=KEYWORD; 2022da9d879SDavid du Colombier if (strict){ 2032da9d879SDavid du Colombier putspace(lptr->punc,NO); 2042da9d879SDavid du Colombier opflag = 1; 2052da9d879SDavid du Colombier } 2062da9d879SDavid du Colombier putch(c,NO); 2072da9d879SDavid du Colombier if (lptr->type == IF)gotif(); 2082da9d879SDavid du Colombier } 2092da9d879SDavid du Colombier else { 2102da9d879SDavid du Colombier putch(c,NO); 2112da9d879SDavid du Colombier lastlook = p; 2122da9d879SDavid du Colombier opflag = 1; 2132da9d879SDavid du Colombier } 2142da9d879SDavid du Colombier continue; 2152da9d879SDavid du Colombier case ')': 2162da9d879SDavid du Colombier if(--paren < 0)paren = 0; 2172da9d879SDavid du Colombier putch(c,NO); 2182da9d879SDavid du Colombier if((lptr = lookup(lastlook,p)) != 0){ 2192da9d879SDavid du Colombier if(lptr->type == TYPE || lptr->type == STRUCT) 2202da9d879SDavid du Colombier opflag = 1; 2212da9d879SDavid du Colombier } 2222da9d879SDavid du Colombier else if(keyflag == DATADEF)opflag = 1; 2232da9d879SDavid du Colombier else opflag = 0; 2242da9d879SDavid du Colombier outs(clev->tabs); 2252da9d879SDavid du Colombier pt = getnext(1); 2262da9d879SDavid du Colombier if ((ct = getnl()) == 1 && !strict){ 2272da9d879SDavid du Colombier if(dolevel && clev->tabs <= dotabs[dolevel]) 2282da9d879SDavid du Colombier resetdo(); 2292da9d879SDavid du Colombier if(clev->tabs > 0 && (paren != 0 || keyflag == 0)){ 2302da9d879SDavid du Colombier if(join){ 2312da9d879SDavid du Colombier eatspace(); 2322da9d879SDavid du Colombier putch(' ',YES); 2332da9d879SDavid du Colombier continue; 2342da9d879SDavid du Colombier } else { 2352da9d879SDavid du Colombier OUT; 2362da9d879SDavid du Colombier split = 1; 2372da9d879SDavid du Colombier continue; 2382da9d879SDavid du Colombier } 2392da9d879SDavid du Colombier } 2402da9d879SDavid du Colombier else if(clev->tabs > 0 && *pt != '{'){ 2412da9d879SDavid du Colombier BUMP; 2422da9d879SDavid du Colombier } 2432da9d879SDavid du Colombier OUTK; 2442da9d879SDavid du Colombier } 2452da9d879SDavid du Colombier else if(strict){ 2462da9d879SDavid du Colombier if(clev->tabs == 0){ 2472da9d879SDavid du Colombier if(*pt != ';' && *pt != ',' && *pt != '(' && *pt != '['){ 2482da9d879SDavid du Colombier OUTK; 2492da9d879SDavid du Colombier } 2502da9d879SDavid du Colombier } 2512da9d879SDavid du Colombier else { 2522da9d879SDavid du Colombier if(keyflag == KEYWORD && paren == 0){ 2532da9d879SDavid du Colombier if(dolevel && clev->tabs <= dotabs[dolevel]){ 2542da9d879SDavid du Colombier resetdo(); 2552da9d879SDavid du Colombier eatspace(); 2562da9d879SDavid du Colombier continue; 2572da9d879SDavid du Colombier } 2582da9d879SDavid du Colombier if(*pt != '{'){ 2592da9d879SDavid du Colombier BUMP; 2602da9d879SDavid du Colombier OUTK; 2612da9d879SDavid du Colombier } 2622da9d879SDavid du Colombier else { 2632da9d879SDavid du Colombier *pt='\0'; 2642da9d879SDavid du Colombier eatspace(); 2652da9d879SDavid du Colombier unget('{'); 2662da9d879SDavid du Colombier } 2672da9d879SDavid du Colombier } 2682da9d879SDavid du Colombier else if(ct){ 2692da9d879SDavid du Colombier if(paren){ 2702da9d879SDavid du Colombier if(join){ 2712da9d879SDavid du Colombier eatspace(); 2722da9d879SDavid du Colombier } else { 2732da9d879SDavid du Colombier split = 1; 2742da9d879SDavid du Colombier OUT; 2752da9d879SDavid du Colombier } 2762da9d879SDavid du Colombier } 2772da9d879SDavid du Colombier else { 2782da9d879SDavid du Colombier OUTK; 2792da9d879SDavid du Colombier } 2802da9d879SDavid du Colombier } 2812da9d879SDavid du Colombier } 2822da9d879SDavid du Colombier } 2832da9d879SDavid du Colombier else if(dolevel && clev->tabs <= dotabs[dolevel]) 2842da9d879SDavid du Colombier resetdo(); 2852da9d879SDavid du Colombier continue; 2862da9d879SDavid du Colombier case ' ': 2872da9d879SDavid du Colombier case '\t': 2882da9d879SDavid du Colombier if ((lptr = lookup(lastlook,p)) != 0){ 2892da9d879SDavid du Colombier if(!(lptr->type==TYPE||lptr->type==STRUCT)) 2902da9d879SDavid du Colombier keyflag = KEYWORD; 2912da9d879SDavid du Colombier else if(paren == 0)keyflag = DATADEF; 2922da9d879SDavid du Colombier if(strict){ 2932da9d879SDavid du Colombier if(lptr->type != ELSE){ 2942da9d879SDavid du Colombier if(lptr->type == TYPE){ 2952da9d879SDavid du Colombier if(paren != 0)putch(' ',YES); 2962da9d879SDavid du Colombier } 2972da9d879SDavid du Colombier else 2982da9d879SDavid du Colombier putch(lptr->punc,NO); 2992da9d879SDavid du Colombier eatspace(); 3002da9d879SDavid du Colombier } 3012da9d879SDavid du Colombier } 3022da9d879SDavid du Colombier else putch(c,YES); 3032da9d879SDavid du Colombier switch(lptr->type){ 3042da9d879SDavid du Colombier case CASE: 3052da9d879SDavid du Colombier outs(clev->tabs-1); 3062da9d879SDavid du Colombier continue; 3072da9d879SDavid du Colombier case ELSE: 3082da9d879SDavid du Colombier pt = getnext(1); 3092da9d879SDavid du Colombier eatspace(); 3102da9d879SDavid du Colombier if((cc = getch()) == '\n' && !strict){ 3112da9d879SDavid du Colombier unget(cc); 3122da9d879SDavid du Colombier } 3132da9d879SDavid du Colombier else { 3142da9d879SDavid du Colombier unget(cc); 3152da9d879SDavid du Colombier if(checkif(pt))continue; 3162da9d879SDavid du Colombier } 3172da9d879SDavid du Colombier gotelse(); 3182da9d879SDavid du Colombier if(strict) unget(c); 3192da9d879SDavid du Colombier if(getnl() == 1 && !strict){ 3202da9d879SDavid du Colombier OUTK; 3212da9d879SDavid du Colombier if(*pt != '{'){ 3222da9d879SDavid du Colombier BUMP; 3232da9d879SDavid du Colombier } 3242da9d879SDavid du Colombier } 3252da9d879SDavid du Colombier else if(strict){ 3262da9d879SDavid du Colombier if(*pt != '{'){ 3272da9d879SDavid du Colombier OUTK; 3282da9d879SDavid du Colombier BUMP; 3292da9d879SDavid du Colombier } 3302da9d879SDavid du Colombier } 3312da9d879SDavid du Colombier continue; 3322da9d879SDavid du Colombier case IF: 3332da9d879SDavid du Colombier gotif(); 3342da9d879SDavid du Colombier continue; 3352da9d879SDavid du Colombier case DO: 3362da9d879SDavid du Colombier gotdo(); 3372da9d879SDavid du Colombier pt = getnext(1); 3382da9d879SDavid du Colombier if(*pt != '{'){ 3392da9d879SDavid du Colombier eatallsp(); 3402da9d879SDavid du Colombier OUTK; 3412da9d879SDavid du Colombier docurly[dolevel] = NO; 3422da9d879SDavid du Colombier dopdepth[dolevel] = clev->pdepth; 3432da9d879SDavid du Colombier clev->pdepth = 0; 3442da9d879SDavid du Colombier clev->tabs++; 3452da9d879SDavid du Colombier } 3462da9d879SDavid du Colombier continue; 3472da9d879SDavid du Colombier case TYPE: 3482da9d879SDavid du Colombier if(paren)continue; 3492da9d879SDavid du Colombier if(!strict)continue; 3502da9d879SDavid du Colombier gottype(lptr); 3512da9d879SDavid du Colombier continue; 3522da9d879SDavid du Colombier case STRUCT: 3532da9d879SDavid du Colombier gotstruct(); 3542da9d879SDavid du Colombier continue; 3552da9d879SDavid du Colombier } 3562da9d879SDavid du Colombier } 3572da9d879SDavid du Colombier else if (lbegin == 0 || p > string) 3582da9d879SDavid du Colombier if(strict) 3592da9d879SDavid du Colombier putch(c,NO); 3602da9d879SDavid du Colombier else putch(c,YES); 3612da9d879SDavid du Colombier continue; 3622da9d879SDavid du Colombier case ';': 3632da9d879SDavid du Colombier putch(c,NO); 3642da9d879SDavid du Colombier if(paren != 0){ 3652da9d879SDavid du Colombier if(strict){ 3662da9d879SDavid du Colombier putch(' ',YES); 3672da9d879SDavid du Colombier eatspace(); 3682da9d879SDavid du Colombier } 3692da9d879SDavid du Colombier opflag = 1; 3702da9d879SDavid du Colombier continue; 3712da9d879SDavid du Colombier } 3722da9d879SDavid du Colombier outs(clev->tabs); 3732da9d879SDavid du Colombier pt = getnext(0); 3742da9d879SDavid du Colombier lptr=lookup(pt,lastplace+1); 3752da9d879SDavid du Colombier if(lptr == 0 || lptr->type != ELSE){ 3762da9d879SDavid du Colombier clev->iflev = 0; 3772da9d879SDavid du Colombier if(clev->pdepth != 0){ 3782da9d879SDavid du Colombier UNBUMP; 3792da9d879SDavid du Colombier } 3802da9d879SDavid du Colombier if(dolevel && docurly[dolevel] == NO && clev->tabs <= dotabs[dolevel]+1) 3812da9d879SDavid du Colombier clev->tabs--; 3822da9d879SDavid du Colombier /* 3832da9d879SDavid du Colombier else if(clev->pdepth != 0){ 3842da9d879SDavid du Colombier UNBUMP; 3852da9d879SDavid du Colombier } 3862da9d879SDavid du Colombier */ 3872da9d879SDavid du Colombier } 3882da9d879SDavid du Colombier getnl(); 3892da9d879SDavid du Colombier OUTK; 3902da9d879SDavid du Colombier continue; 3912da9d879SDavid du Colombier case '\n': 3922da9d879SDavid du Colombier if ((lptr = lookup(lastlook,p)) != 0){ 3932da9d879SDavid du Colombier pt = getnext(1); 3942da9d879SDavid du Colombier if (lptr->type == ELSE){ 3952da9d879SDavid du Colombier if(strict) 3962da9d879SDavid du Colombier if(checkif(pt))continue; 3972da9d879SDavid du Colombier gotelse(); 3982da9d879SDavid du Colombier OUTK; 3992da9d879SDavid du Colombier if(*pt != '{'){ 4002da9d879SDavid du Colombier BUMP; 4012da9d879SDavid du Colombier } 4022da9d879SDavid du Colombier } 4032da9d879SDavid du Colombier else if(lptr->type == DO){ 4042da9d879SDavid du Colombier OUTK; 4052da9d879SDavid du Colombier gotdo(); 4062da9d879SDavid du Colombier if(*pt != '{'){ 4072da9d879SDavid du Colombier docurly[dolevel] = NO; 4082da9d879SDavid du Colombier dopdepth[dolevel] = clev->pdepth; 4092da9d879SDavid du Colombier clev->pdepth = 0; 4102da9d879SDavid du Colombier clev->tabs++; 4112da9d879SDavid du Colombier } 4122da9d879SDavid du Colombier } 4132da9d879SDavid du Colombier else { 4142da9d879SDavid du Colombier OUTK; 4152da9d879SDavid du Colombier if(lptr->type == STRUCT)gotstruct(); 4162da9d879SDavid du Colombier } 4172da9d879SDavid du Colombier } 4182da9d879SDavid du Colombier else if(p == string)Bputc(output, '\n'); 4192da9d879SDavid du Colombier else { 4202da9d879SDavid du Colombier if(clev->tabs > 0 &&(paren != 0 || keyflag == 0)){ 4212da9d879SDavid du Colombier if(join){ 4222da9d879SDavid du Colombier putch(' ',YES); 4232da9d879SDavid du Colombier eatspace(); 4242da9d879SDavid du Colombier continue; 4252da9d879SDavid du Colombier } else { 4262da9d879SDavid du Colombier OUT; 4272da9d879SDavid du Colombier split = 1; 4282da9d879SDavid du Colombier continue; 4292da9d879SDavid du Colombier } 4302da9d879SDavid du Colombier } 4312da9d879SDavid du Colombier else if(keyflag == KEYWORD){ 4322da9d879SDavid du Colombier OUTK; 4332da9d879SDavid du Colombier continue; 4342da9d879SDavid du Colombier } 4352da9d879SDavid du Colombier OUT; 4362da9d879SDavid du Colombier } 4372da9d879SDavid du Colombier continue; 4382da9d879SDavid du Colombier case '"': 4392da9d879SDavid du Colombier case '\'': 4402da9d879SDavid du Colombier putch(c,NO); 4412da9d879SDavid du Colombier while ((cc = getch()) != c){ 4422da9d879SDavid du Colombier if(cc == Beof) 4432da9d879SDavid du Colombier error("\" or '"); 4442da9d879SDavid du Colombier putch(cc,NO); 4452da9d879SDavid du Colombier if (cc == '\\'){ 4462da9d879SDavid du Colombier putch(getch(),NO); 4472da9d879SDavid du Colombier } 4482da9d879SDavid du Colombier if (cc == '\n'){ 4492da9d879SDavid du Colombier outs(clev->tabs); 4502da9d879SDavid du Colombier lbegin = 1; 4512da9d879SDavid du Colombier count = 0; 4522da9d879SDavid du Colombier } 4532da9d879SDavid du Colombier } 4542da9d879SDavid du Colombier putch(cc,NO); 4552da9d879SDavid du Colombier opflag=0; 4562da9d879SDavid du Colombier if (getnl() == 1){ 4572da9d879SDavid du Colombier unget('\n'); 4582da9d879SDavid du Colombier } 4592da9d879SDavid du Colombier continue; 4602da9d879SDavid du Colombier case '\\': 4612da9d879SDavid du Colombier putch(c,NO); 4622da9d879SDavid du Colombier putch(getch(),NO); 4632da9d879SDavid du Colombier continue; 4642da9d879SDavid du Colombier case '?': 4652da9d879SDavid du Colombier question = 1; 4662da9d879SDavid du Colombier gotop(c); 4672da9d879SDavid du Colombier continue; 4682da9d879SDavid du Colombier case ':': 469*ab3dc52fSDavid du Colombier if ((cc = getch()) == ':') { 470*ab3dc52fSDavid du Colombier putch(c,NO); 471*ab3dc52fSDavid du Colombier putch(cc,NO); 472*ab3dc52fSDavid du Colombier continue; 473*ab3dc52fSDavid du Colombier } 4742da9d879SDavid du Colombier if (question == 1){ 4752da9d879SDavid du Colombier question = 0; 4762da9d879SDavid du Colombier gotop(c); 4772da9d879SDavid du Colombier continue; 4782da9d879SDavid du Colombier } 4792da9d879SDavid du Colombier putch(c,NO); 4802da9d879SDavid du Colombier if(structlev)continue; 4812da9d879SDavid du Colombier if ((lptr = lookup(lastlook,p)) != 0){ 4822da9d879SDavid du Colombier if (lptr->type == CASE)outs(clev->tabs - 1); 4832da9d879SDavid du Colombier } 4842da9d879SDavid du Colombier else { 4852da9d879SDavid du Colombier lbegin = 0; 4862da9d879SDavid du Colombier outs(clev->tabs); 4872da9d879SDavid du Colombier } 4882da9d879SDavid du Colombier getnl(); 4892da9d879SDavid du Colombier OUTK; 4902da9d879SDavid du Colombier continue; 4912da9d879SDavid du Colombier case '/': 492aade22e6SDavid du Colombier if ((cc = getch()) == '/') { 493aade22e6SDavid du Colombier putch(c,NO); 494aade22e6SDavid du Colombier putch(cc,NO); 495aade22e6SDavid du Colombier cpp_comment(YES); 496aade22e6SDavid du Colombier OUT; 497aade22e6SDavid du Colombier lastlook = 0; 498aade22e6SDavid du Colombier continue; 499aade22e6SDavid du Colombier } 500aade22e6SDavid du Colombier else if (cc != '*') { 5012da9d879SDavid du Colombier unget(cc); 5022da9d879SDavid du Colombier gotop(c); 5032da9d879SDavid du Colombier continue; 5042da9d879SDavid du Colombier } 5052da9d879SDavid du Colombier putch(c,NO); 5062da9d879SDavid du Colombier putch(cc,NO); 5072da9d879SDavid du Colombier cc = comment(YES); 5082da9d879SDavid du Colombier if(getnl() == 1){ 5092da9d879SDavid du Colombier if(cc == 0){ 5102da9d879SDavid du Colombier OUT; 5112da9d879SDavid du Colombier } 5122da9d879SDavid du Colombier else { 5132da9d879SDavid du Colombier outs(0); 5142da9d879SDavid du Colombier Bputc(output, '\n'); 5152da9d879SDavid du Colombier lbegin = 1; 5162da9d879SDavid du Colombier count = 0; 5172da9d879SDavid du Colombier } 5182da9d879SDavid du Colombier lastlook = 0; 5192da9d879SDavid du Colombier } 5202da9d879SDavid du Colombier continue; 5212da9d879SDavid du Colombier case '[': 5222da9d879SDavid du Colombier putch(c,NO); 5232da9d879SDavid du Colombier ct = 0; 5242da9d879SDavid du Colombier while((c = getch()) != ']' || ct > 0){ 5252da9d879SDavid du Colombier if(c == Beof)error("]"); 5262da9d879SDavid du Colombier putch(c,NO); 5272da9d879SDavid du Colombier if(c == '[')ct++; 5282da9d879SDavid du Colombier if(c == ']')ct--; 5292da9d879SDavid du Colombier } 5302da9d879SDavid du Colombier putch(c,NO); 5312da9d879SDavid du Colombier continue; 5322da9d879SDavid du Colombier case '#': 5332da9d879SDavid du Colombier putch(c,NO); 5342da9d879SDavid du Colombier while ((cc = getch()) != '\n'){ 5352da9d879SDavid du Colombier if(cc == Beof)error("newline"); 5362da9d879SDavid du Colombier if (cc == '\\'){ 5372da9d879SDavid du Colombier putch(cc,NO); 5382da9d879SDavid du Colombier cc = getch(); 5392da9d879SDavid du Colombier } 5402da9d879SDavid du Colombier putch(cc,NO); 5412da9d879SDavid du Colombier } 5422da9d879SDavid du Colombier putch(cc,NO); 5432da9d879SDavid du Colombier lbegin = 0; 5442da9d879SDavid du Colombier outs(clev->tabs); 5452da9d879SDavid du Colombier lbegin = 1; 5462da9d879SDavid du Colombier count = 0; 5472da9d879SDavid du Colombier continue; 5482da9d879SDavid du Colombier default: 5492da9d879SDavid du Colombier if (c == ','){ 5502da9d879SDavid du Colombier opflag = 1; 5512da9d879SDavid du Colombier putch(c,YES); 5522da9d879SDavid du Colombier if (strict){ 5532da9d879SDavid du Colombier if ((cc = getch()) != ' ')unget(cc); 5542da9d879SDavid du Colombier if(cc != '\n')putch(' ',YES); 5552da9d879SDavid du Colombier } 5562da9d879SDavid du Colombier } 5572da9d879SDavid du Colombier else if(isop(c))gotop(c); 5582da9d879SDavid du Colombier else { 5592da9d879SDavid du Colombier if(isalnum(c) && lastlook == 0)lastlook = p; 5602da9d879SDavid du Colombier if(isdigit(c)){ 5612da9d879SDavid du Colombier putch(c,NO); 5622da9d879SDavid du Colombier while(isdigit(c=Bgetc(input))||c == '.')putch(c,NO); 5632da9d879SDavid du Colombier if(c == 'e'){ 5642da9d879SDavid du Colombier putch(c,NO); 5652da9d879SDavid du Colombier c = Bgetc(input); 5662da9d879SDavid du Colombier putch(c, NO); 5672da9d879SDavid du Colombier while(isdigit(c=Bgetc(input)))putch(c,NO); 5682da9d879SDavid du Colombier } 5692da9d879SDavid du Colombier Bungetc(input); 5702da9d879SDavid du Colombier } 5712da9d879SDavid du Colombier else putch(c,NO); 5722da9d879SDavid du Colombier if(keyflag != DATADEF)opflag = 0; 5732da9d879SDavid du Colombier } 5742da9d879SDavid du Colombier } 5752da9d879SDavid du Colombier } 5762da9d879SDavid du Colombier } 5772da9d879SDavid du Colombier void 5782da9d879SDavid du Colombier gotif(void){ 5792da9d879SDavid du Colombier outs(clev->tabs); 5802da9d879SDavid du Colombier if(++clev->iflev >= IFLEVEL-1){ 5812da9d879SDavid du Colombier fprint(2,"too many levels of if %d\n",clev->iflev ); 5822da9d879SDavid du Colombier clev->iflev = IFLEVEL-1; 5832da9d879SDavid du Colombier } 5842da9d879SDavid du Colombier clev->ifc[clev->iflev] = clev->tabs; 5852da9d879SDavid du Colombier clev->spdepth[clev->iflev] = clev->pdepth; 5862da9d879SDavid du Colombier } 5872da9d879SDavid du Colombier void 5882da9d879SDavid du Colombier gotelse(void){ 5892da9d879SDavid du Colombier clev->tabs = clev->ifc[clev->iflev]; 5902da9d879SDavid du Colombier clev->pdepth = clev->spdepth[clev->iflev]; 5912da9d879SDavid du Colombier if(--(clev->iflev) < 0)clev->iflev = 0; 5922da9d879SDavid du Colombier } 5932da9d879SDavid du Colombier int 5942da9d879SDavid du Colombier checkif(char *pt) 5952da9d879SDavid du Colombier { 5962da9d879SDavid du Colombier struct keyw *lptr; 5972da9d879SDavid du Colombier int cc; 5982da9d879SDavid du Colombier if((lptr=lookup(pt,lastplace+1))!= 0){ 5992da9d879SDavid du Colombier if(lptr->type == IF){ 6002da9d879SDavid du Colombier if(strict)putch(' ',YES); 6012da9d879SDavid du Colombier copy(lptr->name); 6022da9d879SDavid du Colombier *pt='\0'; 6032da9d879SDavid du Colombier lastplace = pt; 6042da9d879SDavid du Colombier if(strict){ 6052da9d879SDavid du Colombier putch(lptr->punc,NO); 6062da9d879SDavid du Colombier eatallsp(); 6072da9d879SDavid du Colombier } 6082da9d879SDavid du Colombier clev->tabs = clev->ifc[clev->iflev]; 6092da9d879SDavid du Colombier clev->pdepth = clev->spdepth[clev->iflev]; 6102da9d879SDavid du Colombier keyflag = KEYWORD; 6112da9d879SDavid du Colombier return(1); 6122da9d879SDavid du Colombier } 6132da9d879SDavid du Colombier } 6142da9d879SDavid du Colombier return(0); 6152da9d879SDavid du Colombier } 6162da9d879SDavid du Colombier void 6172da9d879SDavid du Colombier gotdo(void){ 6182da9d879SDavid du Colombier if(++dolevel >= DOLEVEL-1){ 6192da9d879SDavid du Colombier fprint(2,"too many levels of do %d\n",dolevel); 6202da9d879SDavid du Colombier dolevel = DOLEVEL-1; 6212da9d879SDavid du Colombier } 6222da9d879SDavid du Colombier dotabs[dolevel] = clev->tabs; 6232da9d879SDavid du Colombier docurly[dolevel] = YES; 6242da9d879SDavid du Colombier } 6252da9d879SDavid du Colombier void 6262da9d879SDavid du Colombier resetdo(void){ 6272da9d879SDavid du Colombier if(docurly[dolevel] == NO) 6282da9d879SDavid du Colombier clev->pdepth = dopdepth[dolevel]; 6292da9d879SDavid du Colombier if(--dolevel < 0)dolevel = 0; 6302da9d879SDavid du Colombier } 6312da9d879SDavid du Colombier void 6322da9d879SDavid du Colombier gottype(struct keyw *lptr) 6332da9d879SDavid du Colombier { 6342da9d879SDavid du Colombier char *pt; 6352da9d879SDavid du Colombier struct keyw *tlptr; 6362da9d879SDavid du Colombier int c; 6372da9d879SDavid du Colombier while(1){ 6382da9d879SDavid du Colombier pt = getnext(1); 6392da9d879SDavid du Colombier if((tlptr=lookup(pt,lastplace+1))!=0){ 6402da9d879SDavid du Colombier putch(' ',YES); 6412da9d879SDavid du Colombier copy(tlptr->name); 6422da9d879SDavid du Colombier *pt='\0'; 6432da9d879SDavid du Colombier lastplace = pt; 6442da9d879SDavid du Colombier if(tlptr->type == STRUCT){ 6452da9d879SDavid du Colombier putch(tlptr->punc,YES); 6462da9d879SDavid du Colombier gotstruct(); 6472da9d879SDavid du Colombier break; 6482da9d879SDavid du Colombier } 6492da9d879SDavid du Colombier lptr=tlptr; 6502da9d879SDavid du Colombier continue; 6512da9d879SDavid du Colombier } 6522da9d879SDavid du Colombier else{ 6532da9d879SDavid du Colombier putch(lptr->punc,NO); 6542da9d879SDavid du Colombier while((c=getch())== ' ' || c == '\t'); 6552da9d879SDavid du Colombier unget(c); 6562da9d879SDavid du Colombier break; 6572da9d879SDavid du Colombier } 6582da9d879SDavid du Colombier } 6592da9d879SDavid du Colombier } 6602da9d879SDavid du Colombier void 6612da9d879SDavid du Colombier gotstruct(void){ 6622da9d879SDavid du Colombier int c; 6632da9d879SDavid du Colombier int cc; 6642da9d879SDavid du Colombier char *pt; 6652da9d879SDavid du Colombier while((c=getch()) == ' ' || c == '\t') 6662da9d879SDavid du Colombier if(!strict)putch(c,NO); 6672da9d879SDavid du Colombier if(c == '{'){ 6682da9d879SDavid du Colombier structlev++; 6692da9d879SDavid du Colombier unget(c); 6702da9d879SDavid du Colombier return; 6712da9d879SDavid du Colombier } 6722da9d879SDavid du Colombier if(isalpha(c)){ 6732da9d879SDavid du Colombier putch(c,NO); 6742da9d879SDavid du Colombier while(isalnum(c=getch()))putch(c,NO); 6752da9d879SDavid du Colombier } 6762da9d879SDavid du Colombier unget(c); 6772da9d879SDavid du Colombier pt = getnext(1); 6782da9d879SDavid du Colombier if(*pt == '{')structlev++; 6792da9d879SDavid du Colombier if(strict){ 6802da9d879SDavid du Colombier eatallsp(); 6812da9d879SDavid du Colombier putch(' ',NO); 6822da9d879SDavid du Colombier } 6832da9d879SDavid du Colombier } 6842da9d879SDavid du Colombier void 6852da9d879SDavid du Colombier gotop(int c) 6862da9d879SDavid du Colombier { 6872da9d879SDavid du Colombier char optmp[OPLENGTH]; 6882da9d879SDavid du Colombier char *op_ptr; 6892da9d879SDavid du Colombier struct op *s_op; 6902da9d879SDavid du Colombier char *a, *b; 6912da9d879SDavid du Colombier op_ptr = optmp; 6922da9d879SDavid du Colombier *op_ptr++ = c; 6932da9d879SDavid du Colombier while (isop(( *op_ptr = getch())))op_ptr++; 6942da9d879SDavid du Colombier if(!strict)unget(*op_ptr); 6952da9d879SDavid du Colombier else if (*op_ptr != ' ')unget( *op_ptr); 6962da9d879SDavid du Colombier *op_ptr = '\0'; 6972da9d879SDavid du Colombier s_op = op; 6982da9d879SDavid du Colombier b = optmp; 6992da9d879SDavid du Colombier while ((a = s_op->name) != 0){ 7002da9d879SDavid du Colombier op_ptr = b; 7012da9d879SDavid du Colombier while ((*op_ptr == *a) && (*op_ptr != '\0')){ 7022da9d879SDavid du Colombier a++; 7032da9d879SDavid du Colombier op_ptr++; 7042da9d879SDavid du Colombier } 7052da9d879SDavid du Colombier if (*a == '\0'){ 7062da9d879SDavid du Colombier keep(s_op); 7072da9d879SDavid du Colombier opflag = s_op->setop; 7082da9d879SDavid du Colombier if (*op_ptr != '\0'){ 7092da9d879SDavid du Colombier b = op_ptr; 7102da9d879SDavid du Colombier s_op = op; 7112da9d879SDavid du Colombier continue; 7122da9d879SDavid du Colombier } 7132da9d879SDavid du Colombier else break; 7142da9d879SDavid du Colombier } 7152da9d879SDavid du Colombier else s_op++; 7162da9d879SDavid du Colombier } 7172da9d879SDavid du Colombier } 7182da9d879SDavid du Colombier void 7192da9d879SDavid du Colombier keep(struct op *o) 7202da9d879SDavid du Colombier { 7212da9d879SDavid du Colombier char *s; 7222da9d879SDavid du Colombier int ok; 7232da9d879SDavid du Colombier if(o->blanks == NEVER)ok = NO; 7242da9d879SDavid du Colombier else ok = YES; 7252da9d879SDavid du Colombier if (strict && ((o->blanks & ALWAYS) 7262da9d879SDavid du Colombier || ((opflag == 0 && o->blanks & SOMETIMES) && clev->tabs != 0))) 7272da9d879SDavid du Colombier putspace(' ',YES); 7282da9d879SDavid du Colombier for(s=o->name; *s != '\0'; s++){ 7292da9d879SDavid du Colombier if(*(s+1) == '\0')putch(*s,ok); 7302da9d879SDavid du Colombier else 7312da9d879SDavid du Colombier putch(*s,NO); 7322da9d879SDavid du Colombier } 7332da9d879SDavid du Colombier if (strict && ((o->blanks & ALWAYS) 7342da9d879SDavid du Colombier || ((opflag == 0 && o->blanks & SOMETIMES) && clev->tabs != 0))) putch(' ',YES); 7352da9d879SDavid du Colombier } 7362da9d879SDavid du Colombier int 7372da9d879SDavid du Colombier getnl(void){ 7382da9d879SDavid du Colombier int ch; 7392da9d879SDavid du Colombier char *savp; 7402da9d879SDavid du Colombier int gotcmt; 7412da9d879SDavid du Colombier gotcmt = 0; 7422da9d879SDavid du Colombier savp = p; 7432da9d879SDavid du Colombier while ((ch = getch()) == '\t' || ch == ' ')putch(ch,NO); 7442da9d879SDavid du Colombier if (ch == '/'){ 7452da9d879SDavid du Colombier if ((ch = getch()) == '*'){ 7462da9d879SDavid du Colombier putch('/',NO); 7472da9d879SDavid du Colombier putch('*',NO); 7482da9d879SDavid du Colombier comment(NO); 7492da9d879SDavid du Colombier ch = getch(); 7502da9d879SDavid du Colombier gotcmt=1; 7512da9d879SDavid du Colombier } 752aade22e6SDavid du Colombier else if (ch == '/') { 753aade22e6SDavid du Colombier putch('/',NO); 754aade22e6SDavid du Colombier putch('/',NO); 755aade22e6SDavid du Colombier cpp_comment(NO); 756aade22e6SDavid du Colombier ch = getch(); 757aade22e6SDavid du Colombier gotcmt = 1; 758aade22e6SDavid du Colombier } 7592da9d879SDavid du Colombier else { 7602da9d879SDavid du Colombier if(inswitch)*(++lastplace) = ch; 7612da9d879SDavid du Colombier else { 7622da9d879SDavid du Colombier inswitch = 1; 7632da9d879SDavid du Colombier *lastplace = ch; 7642da9d879SDavid du Colombier } 7652da9d879SDavid du Colombier unget('/'); 7662da9d879SDavid du Colombier return(0); 7672da9d879SDavid du Colombier } 7682da9d879SDavid du Colombier } 7692da9d879SDavid du Colombier if(ch == '\n'){ 7702da9d879SDavid du Colombier if(gotcmt == 0)p=savp; 7712da9d879SDavid du Colombier return(1); 7722da9d879SDavid du Colombier } 7732da9d879SDavid du Colombier unget(ch); 7742da9d879SDavid du Colombier return(0); 7752da9d879SDavid du Colombier } 7762da9d879SDavid du Colombier void 7772da9d879SDavid du Colombier ptabs(int n){ 7782da9d879SDavid du Colombier int i; 7792da9d879SDavid du Colombier int num; 7802da9d879SDavid du Colombier if(n > maxtabs){ 7812da9d879SDavid du Colombier if(!folded){ 7822da9d879SDavid du Colombier Bprint(output, "/* code folded from here */\n"); 7832da9d879SDavid du Colombier folded = 1; 7842da9d879SDavid du Colombier } 7852da9d879SDavid du Colombier num = n-maxtabs; 7862da9d879SDavid du Colombier } 7872da9d879SDavid du Colombier else { 7882da9d879SDavid du Colombier num = n; 7892da9d879SDavid du Colombier if(folded){ 7902da9d879SDavid du Colombier folded = 0; 7912da9d879SDavid du Colombier Bprint(output, "/* unfolding */\n"); 7922da9d879SDavid du Colombier } 7932da9d879SDavid du Colombier } 7942da9d879SDavid du Colombier for (i = 0; i < num; i++)Bputc(output, '\t'); 7952da9d879SDavid du Colombier } 7962da9d879SDavid du Colombier void 7972da9d879SDavid du Colombier outs(int n){ 7982da9d879SDavid du Colombier if (p > string){ 7992da9d879SDavid du Colombier if (lbegin){ 8002da9d879SDavid du Colombier ptabs(n); 8012da9d879SDavid du Colombier lbegin = 0; 8022da9d879SDavid du Colombier if (split == 1){ 8032da9d879SDavid du Colombier split = 0; 804*ab3dc52fSDavid du Colombier if (clev->tabs > 0)Bprint(output, "\t"); 8052da9d879SDavid du Colombier } 8062da9d879SDavid du Colombier } 8072da9d879SDavid du Colombier *p = '\0'; 8082da9d879SDavid du Colombier Bprint(output, "%s", string); 8092da9d879SDavid du Colombier lastlook = p = string; 8102da9d879SDavid du Colombier } 8112da9d879SDavid du Colombier else { 8122da9d879SDavid du Colombier if (lbegin != 0){ 8132da9d879SDavid du Colombier lbegin = 0; 8142da9d879SDavid du Colombier split = 0; 8152da9d879SDavid du Colombier } 8162da9d879SDavid du Colombier } 8172da9d879SDavid du Colombier } 8182da9d879SDavid du Colombier void 8192da9d879SDavid du Colombier putch(char c,int ok) 8202da9d879SDavid du Colombier { 8212da9d879SDavid du Colombier int cc; 8222da9d879SDavid du Colombier if(p < &string[LINE-1]){ 8232da9d879SDavid du Colombier if(count+TABLENG*clev->tabs >= maxleng && ok && !folded){ 8242da9d879SDavid du Colombier if(c != ' ')*p++ = c; 8252da9d879SDavid du Colombier OUT; 8262da9d879SDavid du Colombier split = 1; 8272da9d879SDavid du Colombier if((cc=getch()) != '\n')unget(cc); 8282da9d879SDavid du Colombier } 8292da9d879SDavid du Colombier else { 8302da9d879SDavid du Colombier *p++ = c; 8312da9d879SDavid du Colombier count++; 8322da9d879SDavid du Colombier } 8332da9d879SDavid du Colombier } 8342da9d879SDavid du Colombier else { 8352da9d879SDavid du Colombier outs(clev->tabs); 8362da9d879SDavid du Colombier *p++ = c; 8372da9d879SDavid du Colombier count = 0; 8382da9d879SDavid du Colombier } 8392da9d879SDavid du Colombier } 8402da9d879SDavid du Colombier struct keyw * 8412da9d879SDavid du Colombier lookup(char *first, char *last) 8422da9d879SDavid du Colombier { 8432da9d879SDavid du Colombier struct keyw *ptr; 8442da9d879SDavid du Colombier char *cptr, *ckey, *k; 8452da9d879SDavid du Colombier 8462da9d879SDavid du Colombier if(first == last || first == 0)return(0); 8472da9d879SDavid du Colombier cptr = first; 8482da9d879SDavid du Colombier while (*cptr == ' ' || *cptr == '\t')cptr++; 8492da9d879SDavid du Colombier if(cptr >= last)return(0); 8502da9d879SDavid du Colombier ptr = key; 8512da9d879SDavid du Colombier while ((ckey = ptr->name) != 0){ 8522da9d879SDavid du Colombier for (k = cptr; (*ckey == *k && *ckey != '\0'); k++, ckey++); 8532da9d879SDavid du Colombier if(*ckey=='\0' && (k==last|| (k<last && !isalnum(*k)))){ 8542da9d879SDavid du Colombier opflag = 1; 8552da9d879SDavid du Colombier lastlook = 0; 8562da9d879SDavid du Colombier return(ptr); 8572da9d879SDavid du Colombier } 8582da9d879SDavid du Colombier ptr++; 8592da9d879SDavid du Colombier } 8602da9d879SDavid du Colombier return(0); 8612da9d879SDavid du Colombier } 8622da9d879SDavid du Colombier int 8632da9d879SDavid du Colombier comment(int ok) 8642da9d879SDavid du Colombier { 8652da9d879SDavid du Colombier int ch; 8662da9d879SDavid du Colombier int hitnl; 8672da9d879SDavid du Colombier 8682da9d879SDavid du Colombier hitnl = 0; 8692da9d879SDavid du Colombier while ((ch = getch()) != Beof){ 8702da9d879SDavid du Colombier putch(ch, NO); 8712da9d879SDavid du Colombier if (ch == '*'){ 8722da9d879SDavid du Colombier gotstar: 8732da9d879SDavid du Colombier if ((ch = getch()) == '/'){ 8742da9d879SDavid du Colombier putch(ch,NO); 8752da9d879SDavid du Colombier return(hitnl); 8762da9d879SDavid du Colombier } 8772da9d879SDavid du Colombier putch(ch,NO); 8782da9d879SDavid du Colombier if (ch == '*')goto gotstar; 8792da9d879SDavid du Colombier } 8802da9d879SDavid du Colombier if (ch == '\n'){ 8812da9d879SDavid du Colombier if(ok && !hitnl){ 8822da9d879SDavid du Colombier outs(clev->tabs); 8832da9d879SDavid du Colombier } 8842da9d879SDavid du Colombier else { 8852da9d879SDavid du Colombier outs(0); 8862da9d879SDavid du Colombier } 8872da9d879SDavid du Colombier lbegin = 1; 8882da9d879SDavid du Colombier count = 0; 8892da9d879SDavid du Colombier hitnl = 1; 8902da9d879SDavid du Colombier } 8912da9d879SDavid du Colombier } 8922da9d879SDavid du Colombier return(hitnl); 8932da9d879SDavid du Colombier } 894aade22e6SDavid du Colombier int 895aade22e6SDavid du Colombier cpp_comment(int ok) 896aade22e6SDavid du Colombier { 897aade22e6SDavid du Colombier int ch; 898aade22e6SDavid du Colombier int hitnl; 899aade22e6SDavid du Colombier 900aade22e6SDavid du Colombier hitnl = 0; 901aade22e6SDavid du Colombier while ((ch = getch()) != -1) { 902aade22e6SDavid du Colombier if (ch == '\n') { 903aade22e6SDavid du Colombier if (ok && !hitnl) 904aade22e6SDavid du Colombier outs(clev->tabs); 905aade22e6SDavid du Colombier else 906aade22e6SDavid du Colombier outs(0); 907aade22e6SDavid du Colombier lbegin = 1; 908aade22e6SDavid du Colombier count = 0; 909aade22e6SDavid du Colombier hitnl = 1; 910aade22e6SDavid du Colombier break; 911aade22e6SDavid du Colombier } 912aade22e6SDavid du Colombier putch(ch, NO); 913aade22e6SDavid du Colombier } 914aade22e6SDavid du Colombier return hitnl; 915aade22e6SDavid du Colombier } 9162da9d879SDavid du Colombier void 9172da9d879SDavid du Colombier putspace(char ch, int ok) 9182da9d879SDavid du Colombier { 9192da9d879SDavid du Colombier if(p == string)putch(ch,ok); 9202da9d879SDavid du Colombier else if (*(p - 1) != ch) putch(ch,ok); 9212da9d879SDavid du Colombier } 9222da9d879SDavid du Colombier int 9232da9d879SDavid du Colombier getch(void){ 9242da9d879SDavid du Colombier char c; 9252da9d879SDavid du Colombier if(inswitch){ 9262da9d879SDavid du Colombier if(next != '\0'){ 9272da9d879SDavid du Colombier c=next; 9282da9d879SDavid du Colombier next = '\0'; 9292da9d879SDavid du Colombier return(c); 9302da9d879SDavid du Colombier } 9312da9d879SDavid du Colombier if(tptr <= lastplace){ 9322da9d879SDavid du Colombier if(*tptr != '\0')return(*tptr++); 9332da9d879SDavid du Colombier else if(++tptr <= lastplace)return(*tptr++); 9342da9d879SDavid du Colombier } 9352da9d879SDavid du Colombier inswitch=0; 9362da9d879SDavid du Colombier lastplace = tptr = temp; 9372da9d879SDavid du Colombier } 9382da9d879SDavid du Colombier return(Bgetc(input)); 9392da9d879SDavid du Colombier } 9402da9d879SDavid du Colombier void 9412da9d879SDavid du Colombier unget(char c) 9422da9d879SDavid du Colombier { 9432da9d879SDavid du Colombier if(inswitch){ 9442da9d879SDavid du Colombier if(tptr != temp) 9452da9d879SDavid du Colombier *(--tptr) = c; 9462da9d879SDavid du Colombier else next = c; 9472da9d879SDavid du Colombier } 9482da9d879SDavid du Colombier else Bungetc(input); 9492da9d879SDavid du Colombier } 9502da9d879SDavid du Colombier char * 9512da9d879SDavid du Colombier getnext(int must){ 9522da9d879SDavid du Colombier int c; 9532da9d879SDavid du Colombier char *beg; 9542da9d879SDavid du Colombier int prect,nlct; 9552da9d879SDavid du Colombier prect = nlct = 0; 9562da9d879SDavid du Colombier if(tptr > lastplace){ 9572da9d879SDavid du Colombier tptr = lastplace = temp; 9582da9d879SDavid du Colombier err = 0; 9592da9d879SDavid du Colombier inswitch = 0; 9602da9d879SDavid du Colombier } 9612da9d879SDavid du Colombier tp = lastplace; 9622da9d879SDavid du Colombier if(inswitch && tptr <= lastplace) 9632da9d879SDavid du Colombier if (isalnum(*lastplace)||ispunct(*lastplace)||isop(*lastplace))return(lastplace); 9642da9d879SDavid du Colombier space: 9652da9d879SDavid du Colombier while(isspace(c=Bgetc(input)))puttmp(c,1); 9662da9d879SDavid du Colombier beg = tp; 9672da9d879SDavid du Colombier puttmp(c,1); 9682da9d879SDavid du Colombier if(c == '/'){ 9692da9d879SDavid du Colombier if(puttmp(Bgetc(input),1) == '*'){ 9702da9d879SDavid du Colombier cont: 9712da9d879SDavid du Colombier while((c=Bgetc(input)) != '*'){ 9722da9d879SDavid du Colombier puttmp(c,0); 9732da9d879SDavid du Colombier if(must == 0 && c == '\n') 9742da9d879SDavid du Colombier if(nlct++ > 2)goto done; 9752da9d879SDavid du Colombier } 9762da9d879SDavid du Colombier puttmp(c,1); 9772da9d879SDavid du Colombier star: 9782da9d879SDavid du Colombier if(puttmp((c=Bgetc(input)),1) == '/'){ 9792da9d879SDavid du Colombier beg = tp; 9802da9d879SDavid du Colombier puttmp((c=Bgetc(input)),1); 9812da9d879SDavid du Colombier } 9822da9d879SDavid du Colombier else if(c == '*')goto star; 9832da9d879SDavid du Colombier else goto cont; 9842da9d879SDavid du Colombier } 9852da9d879SDavid du Colombier else goto done; 9862da9d879SDavid du Colombier } 9872da9d879SDavid du Colombier if(isspace(c))goto space; 9882da9d879SDavid du Colombier if(c == '#' && tp > temp+1 && *(tp-2) == '\n'){ 9892da9d879SDavid du Colombier if(prect++ > 2)goto done; 9902da9d879SDavid du Colombier while(puttmp((c=Bgetc(input)),1) != '\n') 9912da9d879SDavid du Colombier if(c == '\\')puttmp(Bgetc(input),1); 9922da9d879SDavid du Colombier goto space; 9932da9d879SDavid du Colombier } 9942da9d879SDavid du Colombier if(isalnum(c)){ 9952da9d879SDavid du Colombier while(isalnum(c = Bgetc(input)))puttmp(c,1); 9962da9d879SDavid du Colombier Bungetc(input); 9972da9d879SDavid du Colombier } 9982da9d879SDavid du Colombier done: 9992da9d879SDavid du Colombier puttmp('\0',1); 10002da9d879SDavid du Colombier lastplace = tp-1; 10012da9d879SDavid du Colombier inswitch = 1; 10022da9d879SDavid du Colombier return(beg); 10032da9d879SDavid du Colombier } 10042da9d879SDavid du Colombier void 10052da9d879SDavid du Colombier copy(char *s) 10062da9d879SDavid du Colombier { 10072da9d879SDavid du Colombier while(*s != '\0')putch(*s++,NO); 10082da9d879SDavid du Colombier } 10092da9d879SDavid du Colombier void 10102da9d879SDavid du Colombier clearif(struct indent *cl) 10112da9d879SDavid du Colombier { 10122da9d879SDavid du Colombier int i; 10132da9d879SDavid du Colombier for(i=0;i<IFLEVEL-1;i++)cl->ifc[i] = 0; 10142da9d879SDavid du Colombier } 10152da9d879SDavid du Colombier char 10162da9d879SDavid du Colombier puttmp(char c, int keep) 10172da9d879SDavid du Colombier { 10182da9d879SDavid du Colombier if(tp < &temp[TEMP-120]) 10192da9d879SDavid du Colombier *tp++ = c; 10202da9d879SDavid du Colombier else { 10212da9d879SDavid du Colombier if(keep){ 10222da9d879SDavid du Colombier if(tp >= &temp[TEMP-1]){ 10232da9d879SDavid du Colombier fprint(2,"can't look past huge comment - quiting\n"); 10242da9d879SDavid du Colombier exits("boom"); 10252da9d879SDavid du Colombier } 10262da9d879SDavid du Colombier *tp++ = c; 10272da9d879SDavid du Colombier } 10282da9d879SDavid du Colombier else if(err == 0){ 10292da9d879SDavid du Colombier err++; 10302da9d879SDavid du Colombier fprint(2,"truncating long comment\n"); 10312da9d879SDavid du Colombier } 10322da9d879SDavid du Colombier } 10332da9d879SDavid du Colombier return(c); 10342da9d879SDavid du Colombier } 10352da9d879SDavid du Colombier void 10362da9d879SDavid du Colombier error(char *s) 10372da9d879SDavid du Colombier { 10382da9d879SDavid du Colombier fprint(2,"saw EOF while looking for %s\n",s); 10392da9d879SDavid du Colombier exits("boom"); 10402da9d879SDavid du Colombier } 1041