Annotation of researchv10dc/cmd/deroff.c, revision 1.1

1.1     ! root        1: char *xxxvers = "@(#)deroff.c  1.7";
        !             2: 
        !             3: 
        !             4: #include <stdio.h>
        !             5: 
        !             6: /* Deroff command -- strip troff, eqn, and Tbl sequences from
        !             7: a file.  Has three flags argument, -w, to cause output one word per line
        !             8: rather than in the original format.
        !             9: -mm (or -ms) causes the corresponding macro's to be interpreted
        !            10: so that just sentences are output
        !            11: -ml  also gets rid of lists.
        !            12: -i causes deroff to ignore .so and .nx commands.
        !            13: Deroff follows .so and .nx commands, removes contents of macro
        !            14: definitions, equations (both .EQ ... .EN and $...$),
        !            15: Tbl command sequences, and Troff backslash constructions.
        !            16: 
        !            17: All input is through the C macro; the most recently read character is in c.
        !            18: */
        !            19: 
        !            20: #define C ( (c=getc(infile)) == EOF ? eof() : ((c==ldelim)&&(filesp==files) ? skeqn() :( c == '\n'?(linect++,c):c) ))
        !            21: #define C1 ( (c=getc(infile)) == EOF ? eof() : (c == '\n' ? (linect++,c): c))
        !            22: #define SKIP while(C != '\n') 
        !            23: #define SKIP1 while(C1 != '\n')
        !            24: #define SKIP_TO_COM SKIP; SKIP; pc=c; while(C != '.' || pc != '\n' || C > 'Z')pc=c
        !            25: 
        !            26: #define YES 1
        !            27: #define NO 0
        !            28: #define MS 0
        !            29: #define MM 1
        !            30: #define ONE 1
        !            31: #define TWO 2
        !            32: 
        !            33: #define NOCHAR -2
        !            34: #define SPECIAL 0
        !            35: #define APOS 1
        !            36: #define PUNCT 2
        !            37: #define DIGIT 3
        !            38: #define LETTER 4
        !            39: 
        !            40: int linect = 0;
        !            41: int numflag = 0;
        !            42: int wordflag = NO;
        !            43: int msflag = NO;
        !            44: int iflag = NO;
        !            45: int mac = MM;
        !            46: int disp = 0;
        !            47: int parag = 0;
        !            48: int inmacro = NO;
        !            49: int intable = NO;
        !            50: int eqnflag = 0;
        !            51: 
        !            52: char chars[128];  /* SPECIAL, PUNCT, APOS, DIGIT, or LETTER */
        !            53: 
        !            54: char line[512];
        !            55: char *lp;
        !            56: 
        !            57: int c;
        !            58: int pc;
        !            59: int ldelim     = NOCHAR;
        !            60: int rdelim     = NOCHAR;
        !            61: 
        !            62: 
        !            63: int argc;
        !            64: char **argv;
        !            65: 
        !            66: extern int optind;
        !            67: extern char*optarg;
        !            68: char fname[50];
        !            69: FILE *files[15];
        !            70: FILE **filesp;
        !            71: FILE *infile;
        !            72: 
        !            73: main(ac, av)
        !            74: int ac;
        !            75: char **av;
        !            76: {
        !            77:        register int i;
        !            78:        int errflg = 0;
        !            79:        register optchar;
        !            80:        FILE *opn();
        !            81: 
        !            82:        argc = ac;
        !            83:        argv = av;
        !            84:        while ((optchar = getopt(argc, argv, "winpm:")) != EOF) switch(optchar) {
        !            85:        case 'n':
        !            86:                numflag = 1;
        !            87:                break;
        !            88:        case 'w':
        !            89:                wordflag = YES;
        !            90:                break;
        !            91:        case 'm':
        !            92:                msflag = YES;
        !            93:                if (*optarg == 'm')
        !            94:                        mac = MM;
        !            95:                else if (*optarg == 's')
        !            96:                        mac = MS;
        !            97:                else if (*optarg == 'l')
        !            98:                        disp = 1;
        !            99:                else errflg++;
        !           100:                break;
        !           101:        case 'p':
        !           102:                parag=YES;
        !           103:                break;
        !           104:        case 'i':
        !           105:                iflag = YES;
        !           106:                break;
        !           107:        case '?':
        !           108:                errflg++;
        !           109:        }
        !           110:        if (errflg)
        !           111:                fatal("usage: deroff [ -w ] [ -m (m s l) ] [ -i ] [ file ] ... \n", (char *) NULL);
        !           112:        if ( optind == argc )
        !           113:                infile = stdin;
        !           114:        else
        !           115:                infile = opn(argv[optind++]);
        !           116:        files[0] = infile;
        !           117:        filesp = &files[0];
        !           118: 
        !           119:        for(i='a'; i<='z' ; ++i)
        !           120:                chars[i] = LETTER;
        !           121:        for(i='A'; i<='Z'; ++i)
        !           122:                chars[i] = LETTER;
        !           123:        for(i='0'; i<='9'; ++i)
        !           124:                chars[i] = DIGIT;
        !           125:        chars['\''] = APOS;
        !           126:        chars['&'] = APOS;
        !           127:        chars['\b'] = APOS;
        !           128:        chars['.'] = PUNCT;
        !           129:        chars[','] = PUNCT;
        !           130:        chars[';'] = PUNCT;
        !           131:        chars['?'] = PUNCT;
        !           132:        chars[':'] = PUNCT;
        !           133:        work();
        !           134: }
        !           135: char *calloc();
        !           136: 
        !           137: 
        !           138: 
        !           139: 
        !           140: 
        !           141: 
        !           142: skeqn()
        !           143: {
        !           144:        while((c = getc(infile)) != rdelim)
        !           145:                if(c == '\n')linect++;
        !           146:                else if(c == '\\')
        !           147:                        c = getc(infile);
        !           148:                else if(c == EOF)
        !           149:                        c = eof();
        !           150:                else if(c == '"')
        !           151:                        while( (c = getc(infile)) != '"')
        !           152:                                if(c == '\n')linect++;
        !           153:                                else if(c == EOF)
        !           154:                                        c = eof();
        !           155:                                else if(c == '\\'){
        !           156:                                        if((c = getc(infile)) == EOF)
        !           157:                                                c = eof();
        !           158:                                        else if(c == '\n')linect++;
        !           159:                                }
        !           160:        if(msflag)
        !           161:                eqnflag = 1;
        !           162:        return(c = ' ');
        !           163: }
        !           164: 
        !           165: 
        !           166: char *devnull = "/dev/null";
        !           167: FILE *opn(p)
        !           168: register char *p;
        !           169: {
        !           170:        FILE *fd;
        !           171: 
        !           172: again:
        !           173:        if( (fd = fopen(p, "r")) == NULL){
        !           174:                if(msflag || p==devnull)
        !           175:                        fatal("Cannot open file %s - quitting\n", p);
        !           176:                else {
        !           177:                        fprintf(stderr,"Deroff: Cannot open file %s - continuing\n",
        !           178:                                p);
        !           179:                        p = devnull;
        !           180:                        goto again;
        !           181:                }
        !           182:        }
        !           183:        linect = 0;
        !           184:        if(numflag)printf(".F %s\n",p);
        !           185: 
        !           186:        return(fd);
        !           187: }
        !           188: 
        !           189: 
        !           190: 
        !           191: eof()
        !           192: {
        !           193:        if(infile != stdin)
        !           194:                fclose(infile);
        !           195:        if(filesp > files)
        !           196:                infile = *--filesp;
        !           197:        else if(optind < argc)
        !           198:        {
        !           199:                infile = opn(argv[optind++]);
        !           200:        }
        !           201:        else
        !           202:                exit(0);
        !           203: 
        !           204:        return(C);
        !           205: }
        !           206: 
        !           207: 
        !           208: 
        !           209: getfname()
        !           210: {
        !           211:        register char *p;
        !           212:        struct chain { 
        !           213:                struct chain *nextp; 
        !           214:                char *datap; 
        !           215:        } *chainblock;
        !           216:        register struct chain *q;
        !           217:        static struct chain *namechain  = NULL;
        !           218:        char *csskip = "/usr/lib/tmac/tmac.cs";
        !           219:        char *sskip = "/usr/lib/tmac/tmac.s";
        !           220:        char *copys();
        !           221: 
        !           222:        while(C == ' ') ;
        !           223: 
        !           224:        for(p = fname ; (*p=c)!= '\n' && c!=' ' && c!='\t' && c!='\\' ; ++p)
        !           225:                C;
        !           226:        *p = '\0';
        !           227:        while(c != '\n')
        !           228:                C;
        !           229:        if(!strcmp(fname, csskip) || !strcmp(fname, sskip)){
        !           230:                fname[0] = '\0';
        !           231:                return;
        !           232:        }
        !           233:        /* see if this name has already been used */
        !           234: 
        !           235:        for(q = namechain ; q; q = q->nextp)
        !           236:                if( ! strcmp(fname, q->datap))
        !           237:                {
        !           238:                        fname[0] = '\0';
        !           239:                        return;
        !           240:                }
        !           241: 
        !           242:        q = (struct chain *) calloc(1, sizeof(*chainblock));
        !           243:        q->nextp = namechain;
        !           244:        q->datap = copys(fname);
        !           245:        namechain = q;
        !           246: }
        !           247: 
        !           248: 
        !           249: 
        !           250: 
        !           251: fatal(s,p)
        !           252: char *s, *p;
        !           253: {
        !           254:        fprintf(stderr, "Deroff: ");
        !           255:        fprintf(stderr, s, p);
        !           256:        exit(1);
        !           257: }
        !           258: 
        !           259: work()
        !           260: {
        !           261: 
        !           262:        for( ;; )
        !           263:        {
        !           264:                eqnflag = 0;
        !           265:                if(C == '.'  ||  c == '\'')
        !           266:                        comline();
        !           267:                else
        !           268:                        regline(NO,TWO);
        !           269:        }
        !           270: }
        !           271: 
        !           272: 
        !           273: 
        !           274: 
        !           275: regline(macline,const)
        !           276: int macline;
        !           277: int const;
        !           278: {
        !           279:        line[0] = c;
        !           280:        lp = line;
        !           281:        for( ; ; )
        !           282:        {
        !           283:                if(c == '\\')
        !           284:                {
        !           285:                        *lp = ' ';
        !           286:                        backsl();
        !           287:                        if ( c == '%')  /* no blank for hyphenation char */
        !           288:                                lp--;
        !           289:                }
        !           290:                if(c == '\n') break;
        !           291:                if(intable && c=='T')
        !           292:                {
        !           293:                        *++lp = C;
        !           294:                        if(c=='{' || c=='}')
        !           295:                        {
        !           296:                                lp[-1] = ' ';
        !           297:                                *lp = C;
        !           298:                        }
        !           299:                }
        !           300:                else {
        !           301:                        if((msflag == 1) && (eqnflag == 1)){
        !           302:                                eqnflag = 0;
        !           303:                                *++lp = 'x';
        !           304:                        }
        !           305:                        *++lp = C;
        !           306:                }
        !           307:        }
        !           308: 
        !           309:        *lp = '\0';
        !           310: 
        !           311:        if(line[0] != '\0'){
        !           312:                if(wordflag)
        !           313:                        putwords();
        !           314:                else if(macline)
        !           315:                        putmac(line,const);
        !           316:                else
        !           317:                        puts(line);
        !           318:                if(numflag &&(linect%10 == 0))printf(".%d\n",linect);
        !           319:        }
        !           320: }
        !           321: 
        !           322: 
        !           323: 
        !           324: 
        !           325: putmac(s,const)
        !           326: register char *s;
        !           327: int const;
        !           328: {
        !           329:        register char *t;
        !           330:        register found;
        !           331:        int last;
        !           332:        found = 0;
        !           333: 
        !           334:        while(*s)
        !           335:        {
        !           336:                while(*s==' ' || *s=='\t')
        !           337:                        putchar(*s++);
        !           338:                for(t = s ; *t!=' ' && *t!='\t' && *t!='\0' ; ++t)
        !           339:                        ;
        !           340:                if(*s == '\"')s++;
        !           341:                if(t>s+const && chars[ s[0] ]==LETTER && chars[ s[1] ]==LETTER){
        !           342:                        while(s < t)
        !           343:                                if(*s == '\"')s++;
        !           344:                                else
        !           345:                                        putchar(*s++);
        !           346:                        last = *(t-1);
        !           347:                        found++;
        !           348:                }
        !           349:                else if(found && chars[ s[0] ] == PUNCT && s[1] == '\0')
        !           350:                        putchar(*s++);
        !           351:                else{
        !           352:                        last = *(t-1);
        !           353:                        s = t;
        !           354:                }
        !           355:        }
        !           356:        putchar('\n');
        !           357:        if(msflag && chars[last] == PUNCT){
        !           358:                printf(" %c\n",last);
        !           359:        }
        !           360: }
        !           361: 
        !           362: 
        !           363: 
        !           364: putwords()     /* break into words for -w option */
        !           365: {
        !           366:        register char *p, *p1;
        !           367:        int i, nlet;
        !           368: 
        !           369: 
        !           370:        for(p1 = line ; ;)
        !           371:        {
        !           372:                /* skip initial specials ampersands and apostrophes */
        !           373:                while( chars[*p1] < DIGIT)
        !           374:                        if(*p1++ == '\0') return;
        !           375:                nlet = 0;
        !           376:                for(p = p1 ; (i=chars[*p]) != SPECIAL ; ++p)
        !           377:                        if(i == LETTER) ++nlet;
        !           378: 
        !           379:                if(nlet>1)   /* MDM definition of word */
        !           380:                {
        !           381:                        /* delete trailing ampersands and apostrophes */
        !           382:                        while(p[-1]=='\'' || p[-1]=='&'|| chars[ p[-1] ] == PUNCT)
        !           383:                                --p;
        !           384:                        while(p1 < p) putchar(*p1++);
        !           385:                        putchar('\n');
        !           386:                }
        !           387:                else
        !           388:                        p1 = p;
        !           389:        }
        !           390: }
        !           391: 
        !           392: 
        !           393: comline()
        !           394: {
        !           395:        register int c1, c2;
        !           396: 
        !           397: com:
        !           398:        while(C==' ' || c=='\t')
        !           399:                ;
        !           400: comx:
        !           401:        if( (c1=c) == '\n')
        !           402:                return;
        !           403:        c2 = C;
        !           404:        if(c1=='.' && c2!='.')
        !           405:                inmacro = NO;
        !           406:        if(msflag && c1 == '['){
        !           407:                refer(c2);
        !           408:                return;
        !           409:        }
        !           410:        if(parag && mac==MM && c1 == 'P' && c2 == '\n'){
        !           411:                printf(".P\n");
        !           412:                return;
        !           413:        }
        !           414:        if(c2 == '\n')
        !           415:                return;
        !           416: 
        !           417:        if(c1 == '\\' && c2 == '\"')
        !           418:                SKIP;
        !           419:        else if(c1=='E' && c2=='Q' && filesp==files)
        !           420:                eqn();
        !           421:        else if(c1=='T' && (c2=='S' || c2=='C' || c2=='&') && filesp==files){
        !           422:                if(msflag){ 
        !           423:                        stbl(); 
        !           424:                }
        !           425:                else tbl(); 
        !           426:        }
        !           427:        else if(c1=='T' && c2=='E')
        !           428:                intable = NO;
        !           429:        else if(!inmacro && c1=='d' && c2=='e')
        !           430:                macro();
        !           431:        else if(!inmacro && c1=='i' && c2=='g')
        !           432:                macro();
        !           433:        else if(!inmacro && c1=='a' && c2 == 'm')
        !           434:                macro();
        !           435:        else if(c1=='s' && c2=='o')
        !           436:        {
        !           437:                if(iflag)
        !           438:                        SKIP;
        !           439:                else
        !           440:                {
        !           441:                        getfname();
        !           442:                        if( fname[0] ){
        !           443:                                infile = *++filesp = opn( fname );
        !           444:                                if(!infile)
        !           445:                                        infile = *--filesp;
        !           446:                        }
        !           447:                }
        !           448:        }
        !           449:        else if(c1=='n' && c2=='x')
        !           450:                if(iflag)
        !           451:                        SKIP;
        !           452:                else
        !           453:                {
        !           454:                        getfname();
        !           455:                        if(fname[0] == '\0') exit(0);
        !           456:                        if(infile != stdin)
        !           457:                                fclose(infile);
        !           458:                        infile = *filesp = opn(fname);
        !           459:                }
        !           460:        else if(c1 == 't' && c2 == 'm')
        !           461:                SKIP;
        !           462:        else if(c1=='h' && c2=='w')
        !           463:                SKIP; 
        !           464:        else if(msflag && c1 == 'T' && c2 == 'L'){
        !           465:                SKIP_TO_COM;
        !           466:                goto comx; 
        !           467:        }
        !           468:        else if(msflag && c1=='N' && c2 == 'R')SKIP;
        !           469:        else if(parag && msflag && (c1 == 'P' || c1 == 'I' || c1 == 'L') && c2 == 'P'){
        !           470:                printf(".%c%c",c1,c2);
        !           471:                while(C != '\n')putchar(c);
        !           472:                putchar('\n');
        !           473:        }
        !           474:        else if(parag && mac==MM && c1 == 'P' && c2 == ' '){
        !           475:                printf(".%c%c",c1,c2);
        !           476:                while(C != '\n')putchar(c);
        !           477:                putchar('\n');
        !           478:        }
        !           479:        else if(msflag && c1 == 'A' && (c2 == 'U' || c2 == 'I')){
        !           480:                if(mac==MM)SKIP;
        !           481:                else {
        !           482:                        SKIP_TO_COM;
        !           483:                        goto comx; 
        !           484:                }
        !           485:        }
        !           486:        else if(msflag && c1 == 'F' && c2 == 'S'){
        !           487:                SKIP_TO_COM;
        !           488:                goto comx; 
        !           489:        }
        !           490:        else if(msflag && (c1 == 'S' || c1 == 'N') && c2 == 'H'){
        !           491:                if(parag){
        !           492:                        printf(".%c%c",c1,c2);
        !           493:                        while(C != '\n')putchar(c);
        !           494:                        putchar(c);
        !           495:                        putchar('!');
        !           496:                        while(1){
        !           497:                                while(C != '\n')putchar(c);
        !           498:                                putchar('\n');
        !           499:                                if(C == '.')goto com;
        !           500:                                putchar('!');
        !           501:                                putchar(c);
        !           502:                        }
        !           503:                }
        !           504:                else {
        !           505:                        SKIP_TO_COM;
        !           506:                        goto comx; 
        !           507:                }
        !           508:        }
        !           509:        else if(c1 == 'U' && c2 == 'X'){
        !           510:                if(wordflag)printf("UNIX\n");
        !           511:                else printf("UNIX ");
        !           512:        }
        !           513:        else if(msflag && c1 == 'O' && c2 == 'K'){
        !           514:                SKIP_TO_COM;
        !           515:                goto comx; 
        !           516:        }
        !           517:        else if(msflag && c1 == 'N' && c2 == 'D')
        !           518:                SKIP;
        !           519:        else if(msflag && mac==MM && c1=='H' && (c2==' '||c2=='U')){
        !           520:                if(parag){
        !           521:                        printf(".%c%c",c1,c2);
        !           522:                        while(C != '\n')putchar(c);
        !           523:                        putchar('\n');
        !           524:                }
        !           525:                else {
        !           526:                        SKIP;
        !           527:                }
        !           528:        }
        !           529:        else if(msflag && mac==MM && c2=='L'){
        !           530:                if(disp || c1 == 'R')sdis('L','E');
        !           531:                else{
        !           532:                        SKIP;
        !           533:                        printf(" .");
        !           534:                }
        !           535:        }
        !           536:        else if(!msflag &&c1 == 'P' && c2 == 'S'){
        !           537:                inpic();
        !           538:        }
        !           539:        else if(msflag && (c1 == 'D' || c1 == 'N' || c1 == 'K'|| c1=='P') && c2 == 'S')
        !           540:        { 
        !           541:                sdis(c1,'E'); 
        !           542:        }               /* removed RS-RE */
        !           543:        else if(msflag && (c1 == 'K' && c2 == 'F'))
        !           544:        { 
        !           545:                sdis(c1,'E'); 
        !           546:        }
        !           547:        else if(msflag && c1 == 'n' && c2 == 'f')
        !           548:                sdis('f','i');
        !           549:        else if(msflag && c1 == 'c' && c2 == 'e')
        !           550:                sce();
        !           551:        else
        !           552:        {
        !           553:                if(c1=='.' && c2=='.'){
        !           554:                        if(msflag){
        !           555:                                SKIP;
        !           556:                                return;
        !           557:                        }
        !           558:                        while(C == '.')
        !           559:                                ;
        !           560:                }
        !           561:                ++inmacro;
        !           562:                if(c1 <= 'Z' && msflag)regline(YES,ONE);
        !           563:                else {
        !           564:                        if(wordflag)c1=C;
        !           565:                        regline(YES,TWO);
        !           566:                }
        !           567:                --inmacro;
        !           568:        }
        !           569: }
        !           570: 
        !           571: 
        !           572: 
        !           573: macro()
        !           574: {
        !           575:        if(msflag){
        !           576:                do { 
        !           577:                        SKIP1; 
        !           578:                } while(C1!='.' || C1!='.' || C1=='.'); /* look for  .. */
        !           579:                if(c != '\n')SKIP;
        !           580:                return;
        !           581:        }
        !           582:        SKIP;
        !           583:        inmacro = YES;
        !           584: }
        !           585: 
        !           586: 
        !           587: 
        !           588: 
        !           589: sdis(a1,a2)
        !           590: char a1,a2;
        !           591: {
        !           592:        register int c1,c2;
        !           593:        register int eqnf;
        !           594:        int lct;
        !           595:        if(a1 == 'P'){
        !           596:                if(C1 == ' ')
        !           597:                        while(C1 == ' ');
        !           598:                if(c == '<'){
        !           599:                        SKIP1;
        !           600:                        return;
        !           601:                }
        !           602:        }
        !           603:        lct = 0;
        !           604:        eqnf=1;
        !           605:        if(c != '\n')
        !           606:                SKIP1;
        !           607:        while(1){
        !           608:                while(C1 != '.')
        !           609:                        if(c == '\n')continue;
        !           610:                        else SKIP1;
        !           611:                if((c1=C1) == '\n')continue;
        !           612:                if((c2=C1) == '\n'){
        !           613:                        if(a1 == 'f' && (c1 == 'P' || c1 == 'H'))
        !           614:                                return;
        !           615:                        continue;
        !           616:                }
        !           617:                if(c1==a1 && c2 == a2){
        !           618:                        SKIP1;
        !           619:                        if(lct != 0){
        !           620:                                lct--;
        !           621:                                continue;
        !           622:                        }
        !           623:                        if(eqnf)printf(" .");
        !           624:                        putchar('\n');
        !           625:                        return;
        !           626:                }
        !           627:                else if(a1 == 'L' && c2 == 'L'){
        !           628:                        lct++;
        !           629:                        SKIP1;
        !           630:                }
        !           631:                else if(a1 == 'D' && c1 == 'E' && c2 == 'Q'){
        !           632:                        eqn(); 
        !           633:                        eqnf=0;
        !           634:                }
        !           635:                else if(a1 == 'f'){
        !           636:                        if((mac == MS && c2 == 'P') ||
        !           637:                                (mac==MM && c1 == 'H' && c2 == 'U')){
        !           638:                                SKIP1;
        !           639:                                return;
        !           640:                        }
        !           641:                        SKIP1;
        !           642:                }
        !           643:                else SKIP1;
        !           644:        }
        !           645: }
        !           646: tbl()
        !           647: {
        !           648:        while(C != '.');
        !           649:        SKIP;
        !           650:        intable = YES;
        !           651: }
        !           652: stbl()
        !           653: {
        !           654:        while(C != '.');
        !           655:        SKIP_TO_COM;
        !           656:        if(c != 'T' || C != 'E'){
        !           657:                SKIP;
        !           658:                pc=c;
        !           659:                while(C != '.' || pc != '\n' || C != 'T' || C != 'E')pc=c;
        !           660:        }
        !           661: }
        !           662: 
        !           663: eqn()
        !           664: {
        !           665:        register int c1, c2;
        !           666:        register int dflg;
        !           667:        char last;
        !           668: 
        !           669:        last=0;
        !           670:        dflg = 1;
        !           671:        SKIP;
        !           672: 
        !           673:        for( ;;)
        !           674:        {
        !           675:                if(C1 == '.'  || c == '\'')
        !           676:                {
        !           677:                        while(C1==' ' || c=='\t')
        !           678:                                ;
        !           679:                        if(c=='E' && C1=='N')
        !           680:                        {
        !           681:                                SKIP;
        !           682:                                if(msflag && dflg){
        !           683:                                        putchar('x');
        !           684:                                        putchar(' ');
        !           685:                                        if(last){
        !           686:                                                putchar(last); 
        !           687:                                                putchar('\n'); 
        !           688:                                        }
        !           689:                                }
        !           690:                                return;
        !           691:                        }
        !           692:                }
        !           693:                else if(c == 'd')       /* look for delim */
        !           694:                {
        !           695:                        if(C1=='e' && C1=='l')
        !           696:                                if( C1=='i' && C1=='m')
        !           697:                                {
        !           698:                                        while(C1 == ' ');
        !           699:                                        if((c1=c)=='\n' || (c2=C1)=='\n'
        !           700:                                            || (c1=='o' && c2=='f' && C1=='f') )
        !           701:                                        {
        !           702:                                                ldelim = NOCHAR;
        !           703:                                                rdelim = NOCHAR;
        !           704:                                        }
        !           705:                                        else    {
        !           706:                                                ldelim = c1;
        !           707:                                                rdelim = c2;
        !           708:                                        }
        !           709:                                }
        !           710:                        dflg = 0;
        !           711:                }
        !           712: 
        !           713:                if(c != '\n') while(C1 != '\n'){ 
        !           714:                        if(chars[c] == PUNCT)last = c;
        !           715:                        else if(c != ' ')last = 0;
        !           716:                }
        !           717:        }
        !           718: }
        !           719: 
        !           720: 
        !           721: backsl()       /* skip over a complete backslash construction */
        !           722: {
        !           723:        int bdelim;
        !           724: 
        !           725: sw:  
        !           726:        switch(C1)
        !           727:        {
        !           728:        case '"':
        !           729:                SKIP1;
        !           730:                return;
        !           731:        case 's':
        !           732:                if(C1 == '\\') backsl();
        !           733:                else    {
        !           734:                        while(C1>='0' && c<='9') ;
        !           735:                        ungetc(c,infile);
        !           736:                        c = '0';
        !           737:                }
        !           738:                --lp;
        !           739:                return;
        !           740: 
        !           741:        case 'f':
        !           742:        case 'n':
        !           743:        case '*':
        !           744:                if(C1 != '(')
        !           745:                        return;
        !           746: 
        !           747:        case '(':
        !           748:                if(msflag){
        !           749:                        if(C == 'e'){
        !           750:                                if(C1 == 'm'){
        !           751:                                        *lp = '-';
        !           752:                                        return;
        !           753:                                }
        !           754:                        }
        !           755:                        else if(c != '\n')C1;
        !           756:                        return;
        !           757:                }
        !           758:                if(C1 != '\n') C1;
        !           759:                return;
        !           760: 
        !           761:        case '$':
        !           762:                C1;     /* discard argument number */
        !           763:                return;
        !           764: 
        !           765:        case 'b':
        !           766:        case 'x':
        !           767:        case 'v':
        !           768:        case 'h':
        !           769:        case 'w':
        !           770:        case 'o':
        !           771:        case 'l':
        !           772:        case 'L':
        !           773:                if( (bdelim=C1) == '\n')
        !           774:                        return;
        !           775:                while(C1!='\n' && c!=bdelim)
        !           776:                        if(c == '\\') backsl();
        !           777:                return;
        !           778: 
        !           779:        case '\\':
        !           780:                if(inmacro)
        !           781:                        goto sw;
        !           782:        default:
        !           783:                return;
        !           784:        }
        !           785: }
        !           786: 
        !           787: 
        !           788: 
        !           789: 
        !           790: char *copys(s)
        !           791: register char *s;
        !           792: {
        !           793:        register char *t, *t0;
        !           794: 
        !           795:        if( (t0 = t = calloc( (unsigned)(strlen(s)+1), sizeof(*t) ) ) == NULL)
        !           796:                fatal("Cannot allocate memory", (char *) NULL);
        !           797: 
        !           798:        while( *t++ = *s++ )
        !           799:                ;
        !           800:        return(t0);
        !           801: }
        !           802: sce(){
        !           803:        register char *ap;
        !           804:        register int n, i;
        !           805:        char a[10];
        !           806:        for(ap=a;C != '\n';ap++){
        !           807:                *ap = c;
        !           808:                if(ap == &a[9]){
        !           809:                        SKIP;
        !           810:                        ap=a;
        !           811:                        break;
        !           812:                }
        !           813:        }
        !           814:        if(ap != a)n = atoi(a);
        !           815:        else n = 1;
        !           816:        for(i=0;i<n;){
        !           817:                if(C == '.'){
        !           818:                        if(C == 'c'){
        !           819:                                if(C == 'e'){
        !           820:                                        while(C == ' ');
        !           821:                                        if(c == '0'){
        !           822:                                                SKIP;
        !           823:                                                break;
        !           824:                                        }
        !           825:                                        else SKIP;
        !           826:                                }
        !           827:                                else SKIP;
        !           828:                        }
        !           829:                        else if(c == 'P' || C == 'P'){
        !           830:                                if(c != '\n')SKIP;
        !           831:                                break;
        !           832:                        }
        !           833:                        else if(c != '\n')SKIP;
        !           834:                }
        !           835:                else {
        !           836:                        SKIP;
        !           837:                        i++;
        !           838:                }
        !           839:        }
        !           840: }
        !           841: refer(c1)
        !           842: {
        !           843:        register int c2;
        !           844:        if(c1 != '\n')
        !           845:                SKIP;
        !           846:        while(1){
        !           847:                if(C != '.')
        !           848:                        SKIP;
        !           849:                else {
        !           850:                        if(C != ']')
        !           851:                                SKIP;
        !           852:                        else {
        !           853:                                while(C != '\n')
        !           854:                                        c2=c;
        !           855:                                if(chars[c2] == PUNCT)printf(" %c",c2);
        !           856:                                return;
        !           857:                        }
        !           858:                }
        !           859:        }
        !           860: }
        !           861: inpic(){
        !           862:        register int c1;
        !           863:        register char *p1;
        !           864: /*     SKIP1;*/
        !           865:        while(C1 != '\n')
        !           866:                if(c == '<'){
        !           867:                        SKIP1;
        !           868:                        return;
        !           869:                }
        !           870:        p1 = line;
        !           871:        c = '\n';
        !           872:        while(1){
        !           873:                c1 = c;
        !           874:                if(C1 == '.' && c1 == '\n'){
        !           875:                        if(C1 != 'P'){
        !           876:                                if(c == '\n')continue;
        !           877:                                else { SKIP1; c='\n'; continue;}
        !           878:                        }
        !           879:                        if(C1 != 'E'){
        !           880:                                if(c == '\n')continue;
        !           881:                                else { SKIP1; c='\n';continue; }
        !           882:                        }
        !           883:                        SKIP1;
        !           884:                        return;
        !           885:                }
        !           886:                else if(c == '\"'){
        !           887:                        while(C1 != '\"'){
        !           888:                                if(c == '\\'){
        !           889:                                        if(C1 == '\"')continue;
        !           890:                                        ungetc(c,infile);
        !           891:                                        backsl();
        !           892:                                }
        !           893:                                else *p1++ = c;
        !           894:                        }
        !           895:                        *p1++ = ' ';
        !           896:                }
        !           897:                else if(c == '\n' && p1 != line){
        !           898:                        *p1 = '\0';
        !           899:                        if(wordflag)putwords(NO);
        !           900:                        else {
        !           901:                                puts(line);
        !           902:                                putchar('\n');
        !           903:                        }
        !           904:                        p1 = line;
        !           905:                }
        !           906:        }
        !           907: }

unix.superglobalmegacorp.com

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