Annotation of coherent/d/bin/scat.c, revision 1.1

1.1     ! root        1: 
        !             2: 
        !             3: 
        !             4: 
        !             5: #include       "stdio.h"
        !             6: #include       <sgtty.h>
        !             7: 
        !             8: /*
        !             9:  * tunables
        !            10:  */
        !            11: #define        NAV     20
        !            12: #define        NINVOKE 5
        !            13: #define        LBSIZE  256
        !            14: #define        HOTZONE 10
        !            15: /*
        !            16:  */
        !            17: 
        !            18: #define        SCAT    0
        !            19: #define        NOSCAT  (!SCAT)
        !            20: #define        not_a_tty       (!is_a_tty)
        !            21: 
        !            22: #define        NUL     '\0'
        !            23: #define        EOT     '\4'
        !            24: #define        BS      '\b'
        !            25: #define        HT      '\t'
        !            26: #define        NL      '\n'
        !            27: #define        FF      '\f'
        !            28: #define        CR      '\r'
        !            29: #define        ESC     '\33'
        !            30: #define        SP      ' '
        !            31: #define        DEL     '\177'
        !            32: #define        ASC     0177
        !            33: 
        !            34: /*
        !            35:  * Kludge around a bug in
        !            36:  * sgtty.h file
        !            37:  */
        !            38: #define        CR2     0
        !            39: #define        FF1     0
        !            40: 
        !            41: 
        !            42: typedef char   *arg_t;                 /* argument string */
        !            43: typedef char   **argp_t;               /* pointer to the above */
        !            44: 
        !            45: 
        !            46: /*
        !            47:  * The flags structure that stores the command options.
        !            48:  */
        !            49: struct flags {
        !            50:        int             f_modes;        /* mode bits */
        !            51:        long            f_seekoff;      /* seek into file before scatting */
        !            52:        unsigned        f_length,       /* page length */
        !            53:                        f_width;        /* page width */
        !            54:        int             f_lineoff,      /* starting scatting at this line */
        !            55:                        f_inset;        /* shift display window right */
        !            56: };
        !            57: 
        !            58: /* f_modes
        !            59:  */
        !            60: #define        M_TRUNC         01              /* truncate lines */
        !            61: #define        M_CTL           02              /* display unambiguously: */
        !            62: #define        M_CTLSP         04              /*      map spaces to '_' */
        !            63: #define        M_CTLHT         010             /*      print literal tabs, not ^I */
        !            64: #define        M_SQUASH        020             /* squash empty lines */
        !            65: #define        M_XPAND         040             /* expand tabs */
        !            66: #define        M_REMOTE        0100            /* don't hold pages */
        !            67: #define        M_NUMBER        0200            /* number input lines */
        !            68: #define        M_ONEFILE       0400            /* If one file, don't stop at EOF */
        !            69: 
        !            70: 
        !            71: extern struct flags    flags;
        !            72: 
        !            73: /*
        !            74:  * The invoke structure defines what filenames invoke what options.
        !            75:  */
        !            76: struct invoke {
        !            77:        char    *i_suffix;
        !            78:        argp_t  i_arglist;
        !            79: };
        !            80: /* Fix me */
        !            81: extern struct invoke   invoke[NINVOKE];
        !            82: extern struct invoke   *pinvoke;
        !            83: 
        !            84: argp_t process( );
        !            85: char   *getenv( );
        !            86: long   atol( );
        !            87: 
        !            88: extern struct sgttyb   tty;                    /* saved state of tty */
        !            89: extern struct sgttyb   tty2;
        !            90: extern struct sgttyb   ttytek;
        !            91: extern unsigned        line;                   /* input line in current file */
        !            92: extern unsigned        column;
        !            93: extern unsigned        xcolumn;
        !            94: extern int     is_a_tty;               /* 1 if output is_a_tty, else 0 */
        !            95: extern int     ttyzapped;              /* !0 if tty modes were changed */
        !            96: #include       <signal.h>
        !            97: 
        !            98: 
        !            99: extern char    *getenv( );
        !           100: 
        !           101: struct invoke  *pinvoke        = invoke;
        !           102: struct invoke  invoke[NINVOKE];
        !           103: struct flags   flags;
        !           104: struct sgttyb  tty;
        !           105: struct sgttyb  tty2;
        !           106: struct sgttyb  ttytek;
        !           107: unsigned       line;
        !           108: unsigned       column;
        !           109: unsigned       xcolumn;
        !           110: int            is_a_tty;
        !           111: int            ttyzapped;
        !           112: 
        !           113: int            filecount = 0;
        !           114: 
        !           115: char           *firstfile = NULL;
        !           116: struct flags   firstflags;
        !           117: 
        !           118: main( argc, argv)
        !           119: argp_t argv;
        !           120: {
        !           121:        static struct flags     flgs;
        !           122:        arg_t   av[NAV];
        !           123:        char    ibuf[BUFSIZ],
        !           124:                obuf[BUFSIZ];
        !           125: 
        !           126:        setbuf( stdin, ibuf);
        !           127:        setbuf( stdout, obuf);
        !           128:        init( &flgs);
        !           129:        envargs( av);
        !           130: 
        !           131:        process( av, &flgs, SCAT);
        !           132:        process( &argv[1], &flgs, SCAT);
        !           133:        if (filecount <= 1)
        !           134:                scat( NULL, &flgs);
        !           135:        fflush( stdout);
        !           136:        finis( 0);
        !           137: }
        !           138: 
        !           139: 
        !           140: init( fp)
        !           141: register struct flags  *fp;
        !           142: {
        !           143:        int     finis( );
        !           144:        register char *p;
        !           145: 
        !           146:        fp->f_length = 24;
        !           147:        fp->f_width = 80;
        !           148:        if (ioctl( 1, TIOCGETP, &tty) == 0) {
        !           149:                ++is_a_tty;
        !           150:                tty2 = tty;
        !           151:                tty2.sg_flags |= CBREAK;
        !           152:                tty2.sg_flags &= ~ECHO;
        !           153:                p = getenv("TERM");
        !           154:                if (p!=NULL && strcmp("4012", p)==0) {
        !           155:                        ttytek = tty;
        !           156:                        ttytek.sg_flags |= CR2;
        !           157:                        ttytek.sg_flags &= ~FF1;
        !           158:                        fp->f_length = 34;
        !           159:                        fp->f_width = 72;
        !           160:                }
        !           161:        }
        !           162:        if (signal( SIGINT, SIG_IGN) == SIG_DFL)
        !           163:                signal( SIGINT, finis);
        !           164: }
        !           165: 
        !           166: 
        !           167: envargs( av)
        !           168: argp_t av;
        !           169: {
        !           170:        register        fl;
        !           171:        register char   *p;
        !           172:        register argp_t ap;
        !           173: 
        !           174:        ap = av;
        !           175:        *ap = NULL;
        !           176:        if ((p=getenv( "SCAT")) == NULL)
        !           177:                return;
        !           178: 
        !           179:        fl = 0;
        !           180:        while (*p)
        !           181:                switch (*p++) {
        !           182:                case HT:
        !           183:                case NL:
        !           184:                case SP:
        !           185:                        fl = 0;
        !           186:                        p[-1] = NUL;
        !           187:                        break;
        !           188:                default:
        !           189:                        if (fl)
        !           190:                                break;
        !           191:                        if (ap >= &av[NAV-1])
        !           192:                                fatal( "too many env args", NULL);
        !           193:                        *ap++ = &p[-1];
        !           194:                        ++fl;
        !           195:                        break;
        !           196:                }
        !           197: 
        !           198:        *ap = NULL;
        !           199: }
        !           200: 
        !           201: 
        !           202: argp_t
        !           203: process( av, fp, fl)
        !           204: register argp_t        av;
        !           205: register struct flags  *fp;
        !           206: {
        !           207:        register char   *p;
        !           208:        struct flags    junkflags;
        !           209: 
        !           210:        while (av[0]) {
        !           211:                if (av[0][0] != '-') {
        !           212:                        if (fl != SCAT)
        !           213:                                return (av);
        !           214:                        scat( av++[0], fp);
        !           215:                        ++filecount;
        !           216:                        continue;
        !           217:                }
        !           218:                switch (av[0][1]) {
        !           219:                case 't':
        !           220:                        fp->f_modes |= M_TRUNC;
        !           221:                        break;
        !           222:                case 'c':
        !           223:                        p = av[0]+2;
        !           224:                        for (; ; ) {
        !           225:                                switch (*p++) {
        !           226:                                case NUL:
        !           227:                                        fp->f_modes |= M_CTL;
        !           228:                                        break;
        !           229:                                case 't':
        !           230:                                        fp->f_modes |= M_CTLHT;
        !           231:                                        continue;
        !           232:                                case 's':
        !           233:                                        fp->f_modes |= M_CTLSP;
        !           234:                                        continue;
        !           235:                                default:
        !           236:                                        fatal( "no such sub-options ", av[0]);
        !           237:                                }
        !           238:                                break;
        !           239:                        }
        !           240:                        break;
        !           241:                case 's':
        !           242:                        fp->f_modes |= M_SQUASH;
        !           243:                        break;
        !           244:                case 'x':
        !           245:                        fp->f_modes |= M_XPAND;
        !           246:                        break;
        !           247:                case 'n':
        !           248:                        fp->f_modes |= M_NUMBER;
        !           249:                        break;
        !           250:                case '1':
        !           251:                        fp->f_modes |= M_ONEFILE;
        !           252:                        break;
        !           253:                case 'l':
        !           254:                        fp->f_length = atol( &av[0][2]);
        !           255:                        break;
        !           256:                case 'w':
        !           257:                        fp->f_width = atol( &av[0][2]);
        !           258:                        break;
        !           259:                case 'S':
        !           260:                        fp->f_seekoff = atol( &av[0][2]);
        !           261:                        break;
        !           262:                case 'b':
        !           263:                        fp->f_lineoff = atol( &av[0][2]);
        !           264:                        break;
        !           265:                case 'i':
        !           266:                        fp->f_inset = atol( &av[0][2]);
        !           267:                        break;
        !           268:                case 'r':
        !           269:                        fp->f_modes |= M_REMOTE;
        !           270:                        break;
        !           271:                case '.':
        !           272:                        if (fl != SCAT)
        !           273:                                return (av);
        !           274:                        if (pinvoke == &invoke[NINVOKE])
        !           275:                                fatal( "too many invokes", NULL);
        !           276:                        pinvoke->i_suffix = &av[0][1];
        !           277:                        pinvoke->i_arglist = &av[1];
        !           278:                        ++pinvoke;
        !           279:                        av = process( &av[1], &junkflags, NOSCAT);
        !           280:                        continue;
        !           281:                case '-':
        !           282:                        return (&av[1]);
        !           283:                default:
        !           284:                        fatal( "no such switch ", av[0]);
        !           285:                }
        !           286:                ++av;
        !           287:        }
        !           288:        return (av);
        !           289: }
        !           290: 
        !           291: 
        !           292: fatal( arg1, arg2)
        !           293: char   *arg1,
        !           294:        *arg2;
        !           295: {
        !           296: 
        !           297:        fflush( stdout);
        !           298:        prs( "scat: ");
        !           299:        prs( arg1);
        !           300:        prs( arg2);
        !           301:        prs( "\n");
        !           302:        finis( 1);
        !           303: }
        !           304: 
        !           305: 
        !           306: finis( status)
        !           307: {
        !           308: 
        !           309:        signal( SIGINT, SIG_IGN);
        !           310:        if (ttyzapped)
        !           311:                ioctl( 1, TIOCSETP, &tty);
        !           312:        _exit( status);
        !           313: }
        !           314: 
        !           315: 
        !           316: #include       <errno.h>
        !           317: 
        !           318: 
        !           319: char   newline[]       = "\n";
        !           320: 
        !           321: int    (*getline)( ),
        !           322:        getl1( ), getl2( ), getl3( );
        !           323:        puts1( ), puts2( );
        !           324: 
        !           325: scat( file, fp)
        !           326: register char  *file;
        !           327: struct flags   *fp;
        !           328: {
        !           329:        register        i;
        !           330:        register char   *p;
        !           331:        struct invoke   *ip;
        !           332:        FILE    *creopen( );
        !           333:        char    *nconv( );
        !           334:        extern  errno;
        !           335:        int     (*puts)( );
        !           336:        char    c;
        !           337:        int     len;
        !           338:        static int norecurs = 0;
        !           339: 
        !           340:        if ( (filecount == 0) && (file != NULL) ) {
        !           341:                firstfile = file;
        !           342:                firstflags = *fp;
        !           343:                return;
        !           344:        } else if ( (filecount == 1) && (norecurs == 0) ) {
        !           345:                norecurs = 1;
        !           346:                if ( file != NULL ) {
        !           347:                        firstflags.f_modes &= ~M_ONEFILE;
        !           348:                        fp->f_modes &= ~M_ONEFILE;
        !           349:                }
        !           350:                scat( firstfile, &firstflags);
        !           351:                if ( file == NULL )
        !           352:                        return;
        !           353:        }
        !           354: 
        !           355:        flags = *fp;
        !           356: 
        !           357:        if (file != NULL) {
        !           358:                if (creopen( file) == NULL) {
        !           359:                        p = "can't find ";
        !           360:                        if (errno == EACCES)
        !           361:                                p = "no permission on ";
        !           362:                        fatal( p, file);
        !           363:                }
        !           364:        }
        !           365:        else
        !           366:                file = "[stdin].";
        !           367: 
        !           368:        for (p=file; *p++; )
        !           369:                ;
        !           370:        do {
        !           371:                if (*--p == '.') {
        !           372:                        for (ip=invoke; ip<pinvoke; ++ip)
        !           373:                                if (strcmp( p, ip->i_suffix) == 0)
        !           374:                                        process( ip->i_arglist, &flags, NOSCAT);
        !           375:                        break;
        !           376:                }
        !           377:        } while (p > file);
        !           378: 
        !           379:        if (flags.f_modes & M_NUMBER)
        !           380:                flags.f_width -= 8;
        !           381:        flags.f_width += flags.f_inset;
        !           382:        if (flags.f_width-8 >= LBSIZE)
        !           383:                fatal( "page width don't jive", NULL);
        !           384:        getline = getl1;
        !           385:        if (flags.f_modes & M_TRUNC)
        !           386:                getline = getl2;
        !           387:        if (flags.f_modes & M_CTL)
        !           388:                getline = getl3;
        !           389:        puts = puts1;
        !           390:        if (flags.f_modes & M_XPAND)
        !           391:                puts = puts2;
        !           392: 
        !           393:        if (flags.f_seekoff)
        !           394:                lseek( 0, flags.f_seekoff, 0);
        !           395:        for (line=1; line<flags.f_lineoff; ++line)
        !           396:                while ((i=getchar( )) != NL)
        !           397:                        if (i < 0)
        !           398:                                return;
        !           399: 
        !           400:        i = flags.f_length;
        !           401:        while (len=page( i, puts)) {
        !           402:                if ( (len < i) && (flags.f_modes&M_ONEFILE) ) {
        !           403:                        putchar( NL);
        !           404:                        break;
        !           405:                }
        !           406:                if (is_a_tty && (flags.f_modes&M_REMOTE)==0) {
        !           407:                        fflush( stdout);
        !           408:                        if (ttyzapped == 0) {
        !           409:                                ++ttyzapped;
        !           410:                                ioctl( 1, TIOCSETN, &tty2);
        !           411:                        }
        !           412:                        for (; ; ) {
        !           413:                                if (read( 2, &c, 1) <= 0)
        !           414:                                        finis( 0);
        !           415:                                switch (c) {
        !           416:                                case EOT:
        !           417:                                case 'q':
        !           418:                                        prs( newline);
        !           419:                                        finis( 0);
        !           420:                                case NL:
        !           421:                                        i = flags.f_length;
        !           422:                                        break;
        !           423:                                case '/':
        !           424:                                        if (ttytek.sg_flags)
        !           425:                                                goto dfault;
        !           426:                                        i = flags.f_length/2 + 1;
        !           427:                                        break;
        !           428:                                case SP:
        !           429:                                        if (ttytek.sg_flags)
        !           430:                                                goto dfault;
        !           431:                                        i = 1;
        !           432:                                        break;
        !           433:                                case 'n':
        !           434:                                        prs( newline);
        !           435:                                        return;
        !           436:                                case 'f':
        !           437:                                        prs( newline);
        !           438:                                        prs( file);
        !           439:                                        prs( nconv( line-1));
        !           440:                                        continue;
        !           441:                                default:
        !           442:                                dfault:
        !           443:                                        prs( "\7");
        !           444:                                        continue;
        !           445:                                }
        !           446:                                break;
        !           447:                        }
        !           448:                }
        !           449:                putchar( NL);
        !           450:        }
        !           451: }
        !           452: 
        !           453: 
        !           454: page( length, puts)
        !           455: int    (*puts)( );
        !           456: {
        !           457:        register char   *p;
        !           458:        register        i,
        !           459:                        nflg;
        !           460:        int     l;
        !           461:        static char     lbuf[LBSIZE];
        !           462:        char            *nconv( );
        !           463: 
        !           464:        nflg = 0;
        !           465:        l = length;
        !           466:        do {
        !           467:                p = lbuf;
        !           468:                i = (*getline)( p);
        !           469:                if (i < 0)
        !           470:                        break;
        !           471: 
        !           472:                p += flags.f_inset;
        !           473:                if (p >= &lbuf[i] && flags.f_modes&M_SQUASH) {
        !           474:                        ++l;
        !           475:                        if (lbuf[i] == NL)
        !           476:                                ++line;
        !           477:                        continue;
        !           478:                }
        !           479: 
        !           480:                if (l != length)
        !           481:                        putchar( NL);
        !           482:                else if (ttytek.sg_flags)
        !           483:                        erase( );
        !           484:                column = xcolumn = 0;
        !           485:                if (flags.f_modes & M_NUMBER)
        !           486:                        if (nflg)
        !           487:                                (*puts)( "        ", 8);
        !           488:                        else {
        !           489:                                (*puts)( nconv( line), 5);
        !           490:                                (*puts)( ":  ", 3);
        !           491:                                ++nflg;
        !           492:                        }
        !           493:                if (lbuf[i] == NL) {
        !           494:                        ++line;
        !           495:                        nflg = 0;
        !           496:                }
        !           497:                if ((*puts)( p, &lbuf[i]-p))
        !           498:                        continue;
        !           499:        } while (--l);
        !           500: 
        !           501:        return (length - l);
        !           502: }
        !           503: 
        !           504: 
        !           505: 
        !           506: 
        !           507: getl1( lbuf)
        !           508: register char  *lbuf;
        !           509: {
        !           510:        register        i,
        !           511:                        c;
        !           512: 
        !           513:        i = 0;
        !           514:        while ((c=cread( )) >= 0) {
        !           515:                if (c == NL)
        !           516:                        break;
        !           517:                if (c == HT)
        !           518:                        if ((i|7)+1 <= flags.f_width) {
        !           519:                                do
        !           520:                                        lbuf[i++] = SP;
        !           521:                                while (i & 7);
        !           522:                                continue;
        !           523:                        }
        !           524:                        else
        !           525:                                ;       /* overflow */
        !           526:                else if (c == FF)
        !           527:                        continue;
        !           528:                else if (i < flags.f_width) {
        !           529:                        lbuf[i++] = c;
        !           530:                        continue;
        !           531:                }
        !           532: 
        !           533:                /* line overflow condition */
        !           534:                i = overflow( lbuf, i, c);
        !           535:                c = NUL;
        !           536:                break;
        !           537:        }
        !           538: 
        !           539:        lbuf[i] = c;
        !           540:        if (i==0 && c<0)
        !           541:                return (-1);
        !           542:        return (i);
        !           543: }
        !           544: 
        !           545: 
        !           546: getl2( lbuf)
        !           547: register char  *lbuf;
        !           548: {
        !           549:        register        i,
        !           550:                        c;
        !           551: 
        !           552:        i = 0;
        !           553:        while ((c=cread( )) >= 0) {
        !           554:                if (c == NL)
        !           555:                        break;
        !           556:                if (c == HT)
        !           557:                        do {
        !           558:                                if (i < flags.f_width)
        !           559:                                        lbuf[i] = SP;
        !           560:                        } while (++i & 7);
        !           561:                else if (c == FF)
        !           562:                        continue;
        !           563:                else if (i < flags.f_width)
        !           564:                        lbuf[i++] = c;
        !           565:                else
        !           566:                        i += 2;
        !           567:                if (i > flags.f_width) {
        !           568:                        while ((c=cread( )) >= 0)
        !           569:                                if (c == NL)
        !           570:                                        break;
        !           571:                        i = flags.f_width;
        !           572:                        break;
        !           573:                }
        !           574:        }
        !           575: 
        !           576:        lbuf[i] = c;
        !           577:        if (i==0 && c<0)
        !           578:                return (-1);
        !           579:        return (i);
        !           580: }
        !           581: 
        !           582: 
        !           583: getl3( lbuf)
        !           584: register char  *lbuf;
        !           585: {
        !           586:        register        i,
        !           587:                        c;
        !           588: 
        !           589:        i = 0;
        !           590:        while ((c=getchar( )) >= 0) {
        !           591:                if (c == NL)
        !           592:                        break;
        !           593:                if (c & ~ASC) {
        !           594:                        lbuf[i++] = '~';
        !           595:                        c &= ASC;
        !           596:                }
        !           597:                if (c==HT && flags.f_modes&M_CTLHT)
        !           598:                        do {
        !           599:                                if (i < flags.f_width)
        !           600:                                        lbuf[i] = SP;
        !           601:                        } while (++i & 7);
        !           602:                else if (c<SP || c==DEL) {
        !           603:                        lbuf[i++] = '^';
        !           604:                        lbuf[i++] = c + '@';
        !           605:                } else {
        !           606:                        switch (c) {
        !           607:                        case SP:
        !           608:                                if (flags.f_modes & M_CTLSP)
        !           609:                                        c = '_';
        !           610:                                break;
        !           611:                        case '_':
        !           612:                                if ((flags.f_modes&M_CTLSP) == 0)
        !           613:                                        break;
        !           614:                        case '~':
        !           615:                        case '^':
        !           616:                        case '\\':
        !           617:                                lbuf[i++] = '\\';
        !           618:                                break;
        !           619:                        }
        !           620:                        lbuf[i++] = c;
        !           621:                }
        !           622:                if (i+3 >= flags.f_width) {
        !           623:                        lbuf[i++] = '\\';
        !           624:                        c = NUL;
        !           625:                        break;
        !           626:                }
        !           627:        }
        !           628: 
        !           629:        lbuf[i] = c;
        !           630:        if (i==0 && c<0)
        !           631:                return (-1);
        !           632:        return (i);
        !           633: }
        !           634: 
        !           635: 
        !           636: #define        alphanumeric( c)        (alphnum[c>>3&017] & bitmask[c&7])
        !           637: char   alphnum[] = {
        !           638:        0000, 0000, 0000, 0000, 0000, 0000, 0377, 0300,
        !           639:        0177, 0377, 0377, 0351, 0177, 0377, 0377, 0340
        !           640: };
        !           641: char   bitmask[] = {
        !           642:        0200, 0100, 0040, 0020, 0010, 0004, 0002, 0001
        !           643: };
        !           644: 
        !           645: 
        !           646: overflow( lbuf, pos, c)
        !           647: register char  *lbuf;
        !           648: register       pos;
        !           649: {
        !           650:        register        i;
        !           651: 
        !           652:        uncread( c);
        !           653:        if (pos == flags.f_width)       /* ***THINK ABOUT THOSE LIMITS*** */
        !           654:                c = uncread( lbuf[--pos]);
        !           655: 
        !           656:        for (i=pos; i>HOTZONE && i>pos-HOTZONE; ) {
        !           657:                --i;
        !           658:                if (!alphanumeric( lbuf[i])) {
        !           659:                        for (++i; pos>i; )
        !           660:                                uncread( lbuf[--pos]);
        !           661:                        break;
        !           662:                }
        !           663:        }
        !           664: 
        !           665:        lbuf[pos++] = '\\';
        !           666:        return (pos);
        !           667: }
        !           668: 
        !           669: 
        !           670: puts1( p, n)
        !           671: register char  *p;
        !           672: register       n;
        !           673: {
        !           674:        register        i;
        !           675: 
        !           676:        while (--n >= 0)
        !           677:                if (*p++ == SP)
        !           678:                        ++xcolumn;
        !           679:                else {
        !           680:                        if (xcolumn > column) {
        !           681:                                while (i=(column|7)+1, i<=xcolumn) {
        !           682:                                        putchar( HT);
        !           683:                                        column = i;
        !           684:                                }
        !           685:                                while (column < xcolumn) {
        !           686:                                        putchar( SP);
        !           687:                                        ++column;
        !           688:                                }
        !           689:                        }
        !           690:                        putchar( p[-1]);
        !           691:                        xcolumn = ++column;
        !           692:                }
        !           693: 
        !           694:        return (0);
        !           695: }
        !           696: 
        !           697: 
        !           698: puts2( p, n)
        !           699: register char  *p;
        !           700: register       n;
        !           701: {
        !           702: 
        !           703:        while (--n >= 0)
        !           704:                putchar( *p++);
        !           705: 
        !           706:        return (0);
        !           707: }
        !           708: 
        !           709: 
        !           710: 
        !           711: 
        !           712: #define        CQSIZE  256
        !           713: #define        CQMASK  (CQSIZE-1)
        !           714: 
        !           715: #define        chr( i) (cbuf[i&CQMASK])
        !           716: 
        !           717: 
        !           718: unsigned       get,
        !           719:                cnt,
        !           720:                cntmax,
        !           721:                eof;
        !           722: char   cbuf[CQSIZE];
        !           723: 
        !           724: 
        !           725: FILE   *
        !           726: creopen( file)
        !           727: char   *file;
        !           728: {
        !           729:        register char   *p;
        !           730:        FILE    *freopen( );
        !           731: 
        !           732:        cnt = 0;
        !           733:        cntmax = 0;
        !           734:        eof = 0;
        !           735:        for (p=cbuf; p<cbuf+CQSIZE; )
        !           736:                *p++ = NUL;
        !           737:        return (freopen( file, "r", stdin));
        !           738: }
        !           739: 
        !           740: 
        !           741: uncread( c)
        !           742: {
        !           743: 
        !           744:        chr( --get) = c;
        !           745:        ++cnt, ++cntmax;
        !           746:        return (c);
        !           747: }
        !           748: 
        !           749: 
        !           750: 
        !           751: 
        !           752: #define        CQSIZE  256
        !           753: #define        CQMASK  (CQSIZE-1)
        !           754: 
        !           755: 
        !           756: 
        !           757: 
        !           758: cread( )
        !           759: {
        !           760:        register        c;
        !           761: 
        !           762:        if ( ! eof)
        !           763:                while (cntmax < CQSIZE-HOTZONE) {
        !           764:                        if ((c=getchar( )) < 0) {
        !           765:                                ++eof;
        !           766:                                break;
        !           767:                        }
        !           768:                        switch (c &= ASC) {
        !           769:                        case BS:
        !           770:                                if (cnt && cbuf[get+cnt-1&CQMASK] != NL)
        !           771:                                        --cnt;
        !           772:                                continue;
        !           773:                        case ESC:
        !           774:                                c = '$';
        !           775:                                goto dfault;
        !           776:                        case CR:
        !           777:                                while (cnt && cbuf[get+cnt-1&CQMASK] != NL)
        !           778:                                        --cnt;
        !           779:                                continue;
        !           780:                        case NL:
        !           781:                                cnt = cntmax;
        !           782:                                goto dfault;
        !           783:                        case '_':
        !           784:                                switch (cbuf[get+cnt&CQMASK]) {
        !           785:                                case NUL:
        !           786:                                case SP:
        !           787:                                        goto dfault;
        !           788:                                }
        !           789:                                break;
        !           790:                        case SP:
        !           791:                                if (cbuf[get+cnt&CQMASK])
        !           792:                                        break;
        !           793:                        default:
        !           794:                        dfault:
        !           795:                                cbuf[get+cnt&CQMASK] = c;
        !           796:                                break;
        !           797:                        }
        !           798:                        if (++cnt > cntmax)
        !           799:                                ++cntmax;
        !           800:                }
        !           801: 
        !           802:        if (eof) {
        !           803:                if (cntmax == 0)
        !           804:                        return (-1);
        !           805:        }
        !           806:        --cnt;
        !           807:        --cntmax;
        !           808:        c = cbuf[get&CQMASK];
        !           809:        cbuf[get++&CQMASK] = 0;
        !           810:        return (c);
        !           811: }
        !           812: 
        !           813: 
        !           814: 
        !           815: 
        !           816: prs( s)
        !           817: register char  *s;
        !           818: {
        !           819:        register char   *p;
        !           820: 
        !           821:        if ((p=s) == NULL)
        !           822:                return;
        !           823:        while (*p++)
        !           824:                ;
        !           825:        write( 2, s, p-s-1);
        !           826: }
        !           827: 
        !           828: 
        !           829: long
        !           830: atol( p)
        !           831: char   *p;
        !           832: {
        !           833:        register        c,
        !           834:                        radix,
        !           835:                        pow;
        !           836:        long    l;
        !           837: 
        !           838:        radix = 10;
        !           839:        if (*p == '0')
        !           840:                radix = 8;
        !           841:        pow = 0;
        !           842:        l = 0;
        !           843: 
        !           844:        for (; ; ) {
        !           845:                c = *p++;
        !           846:                if (c == 'b') {
        !           847:                        pow = 9;
        !           848:                        break;
        !           849:                }
        !           850:                if (c == 'k') {
        !           851:                        pow = 10;
        !           852:                        break;
        !           853:                }
        !           854:                c -= '0';
        !           855:                if ((unsigned)c > 9)
        !           856:                        break;
        !           857:                l = l*radix + c;
        !           858:        }
        !           859: 
        !           860:        return (l << pow);
        !           861: }
        !           862: 
        !           863: 
        !           864: char   *
        !           865: nconv( u)
        !           866: register unsigned      u;
        !           867: {
        !           868:        register char   *p;
        !           869:        static char     nbuf[]  = "12345   ";
        !           870: 
        !           871:        for (p=nbuf+5;
        !           872:                p>nbuf;
        !           873:                u=u/10)
        !           874:                if (u)
        !           875:                        *--p = u%10 + '0';
        !           876:                else
        !           877:                        *--p = ' ';
        !           878: 
        !           879:        return (p);
        !           880: }
        !           881: 
        !           882: 
        !           883: erase( )
        !           884: {
        !           885:        register char   *p;
        !           886: 
        !           887:        fflush( stdout);
        !           888:        ++ttyzapped;
        !           889:        ioctl( 1, TIOCSETP, &ttytek);
        !           890:        for (p="\33\f\r\r\r"; *p; )
        !           891:                putchar( *p++);
        !           892:        fflush( stdout);
        !           893:        ioctl( 1, TIOCSETP, &tty);
        !           894:        ttyzapped = 0;
        !           895: }

unix.superglobalmegacorp.com

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