Annotation of researchv10no/cmd/cb/cb.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.