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

1.1       root        1: /*
                      2:  **********************************************************************
                      3:  *                                                                    *
                      4:  * dired [][dir][files]  Stuart Cracraft (mclure@sri-unix) Sept 1980  *
                      5:  *                                                                   *
                      6:  *      Directory editor.                                            *
                      7:  *             edit/delete files in a directory or a file list       *
                      8:  *              compile with the berkeley termlib archive             *
                      9:  *              and don't forget to change the 'helpfile' and         *
                     10:  *              'dirednam' strings to reflect your own setup.         *
                     11:  *                                                                    *
                     12:  *      Note: if you make improvements, I'd like to get them too.     *
                     13:  *                      Stuart Cracraft mclure@sri-unix,              *
                     14:  *                             ucbvax!menlo70!sri-unix!mclure        *
                     15:  *     so would I:     Jay Lepreau     lepreau@utah-20,              *
                     16:  *                             decvax!randvax!utah-cs!lepreau        *
                     17:  **********************************************************************
                     18: */
                     19: 
                     20: /*
                     21:  *     Enhanced by J.Lepreau, Univ of Utah, 8-10/81:
                     22:  *           --bunch of stuff, including more cmds, 2 window mode,
                     23:  *             buffering output, pathname substition in !escapes,
                     24:  *             initial sort options, ^G escape from sorts, ^U escape
                     25:  *             from !escapes, empty dir check.
                     26:  */
                     27: 
                     28: #ifdef COMMENT
                     29: 
                     30: Modified 12/81 by Lepreau:
                     31: 1. Fix up aborting of command escapes, with mildy tricky re-display.
                     32: 2. Make default window size be half-screen (2 window mode).
                     33:    Added option -wf to get full screen.
                     34: 3. Add check for too many files to avoid core-dump.
                     35: 4. Fix bug in cmd escapes: must reset caught signals before invocation.
                     36: 
                     37: #endif COMMENT
                     38: 
                     39: /*
                     40:    things to consider
                     41:    -    perhaps should be able to edit protection field and
                     42:                be able to change protection instantly at the
                     43:                touch of a key (or queue the change for later exit)
                     44: 
                     45:    --  Would be nice if there were cmds (e.g. 'c') which would update
                     46:                1) the file-info & re-display it, & 2) update whole
                     47:                display's info.
                     48: */
                     49: 
                     50: #ifdef vax                             /* this does for now */
                     51: # define VFORK
                     52: #endif
                     53: 
                     54: #ifndef VFORK
                     55: # define vfork fork
                     56: #endif
                     57: 
                     58: #define        FALSE           0
                     59: #define        TRUE            1
                     60: #define        NOTDELETED      0
                     61: #define        DELETED         1
                     62: 
                     63: /*     Sort Orders */
                     64: #define NAME           0
                     65: #define        SIZE            1
                     66: #define        WRITE           2
                     67: #define        READ            3
                     68: char sortstr[] = "nswr";       /* must be in order by above */
                     69: 
                     70: #define ESC         '\033'
                     71: #define CURSOR          48     /* X-coord of cursor, just b4 file */
                     72: #define CTRL(c)                ('c' & 037)
                     73: 
                     74: #include <stdio.h>
                     75: #include <sys/types.h>
                     76: #include <signal.h>
                     77: #include <sgtty.h>
                     78: #include <sys/stat.h>
                     79: #ifdef BSD
                     80: #include <sys/dir.h>
                     81: #else
                     82: #include <ndir.h>
                     83: #define        index   strchr
                     84: #endif
                     85: 
                     86: #ifdef UTAH
                     87: char   *dirednam = "/usr/local/dired ";    /* Where dired lives - need blnk */
                     88: char   *helpfile = "/usr/help/dired.hlp";      /* Where helpfile lives */
                     89: #else
                     90: char   *dirednam = "dired ";    /* Where dired lives - need blnk */
                     91: char   *helpfile = "/usr/lib/dired";   /* Where helpfile lives */
                     92: #endif
                     93: 
                     94: char   divider[132];   /* divides the windows */
                     95: #define DIVCHAR        '-'     /* makes up the divider */
                     96: 
                     97: #define MOREPGM        "p "    /* program to page thru a file */
                     98: 
                     99: #define MAXFILES       2000    /* Max number of files we can handle */
                    100: #define        MAXN    30
                    101: 
                    102: struct lbuf
                    103: {
                    104:     union
                    105:     {
                    106:        char    lname[MAXN];
                    107:        char   *namep;
                    108:     } ln;
                    109:     short   deleted;
                    110:     char    ltype;
                    111:     short   lnum;
                    112:     short   lflags;
                    113:     short   lnl;
                    114:     unsigned short   luid;
                    115:     unsigned short   lgid;
                    116:     long    lsize;
                    117:     long    latime;
                    118:     long    lctime;
                    119:     long    lmtime;
                    120: };
                    121: 
                    122: struct lbuf file[MAXFILES];
                    123: 
                    124: struct stat    statbuf;
                    125: struct sgttyb   ioctlb;
                    126: 
                    127: #define        ISARG   0100000
                    128: 
                    129: int     gflg,
                    130:         iflg,
                    131:         lflg,
                    132:         sflg;                  /* Random flags */
                    133: int    splitflg;               /* Split screen? */
                    134: int     sortyp;                        /* Key to sort on */
                    135: int     errcode;               /* Error variable used by rm */
                    136: int     rflg = 1;              /* Reverse sort flag */
                    137: int     totfiles = 0;          /* Total files */
                    138: int     flags;                 /* Gets flags */
                    139: int     blurb;                 /* 1=>thing in echo area,0 otherwise  */
                    140: int     numdeleted;            /* Number of files marked deleted */
                    141: long    ttime;                 /* Temp time variable */
                    142: long    year;                  /* Six months ago */
                    143: long    totblocks = 0;         /* Total blocks */
                    144: int     lastuid = -1;          /* Last uid/gid we handled */
                    145: char    tempbuf[128];          /* Random temporary buffer */
                    146: char    userbuf[35];           /* Temporary buffer for user name */
                    147: FILE   *pwdf;                  /* Password/group file */
                    148: 
                    149: int     curfile = 0;           /* Current file */
                    150: int     topfile = 0;           /* File at top of screen */
                    151: int     curline = 0;           /* Line that we're on */
                    152: int     scrlen =  999;         /* Length of screen - dired part: half size */
                    153: int    Worklen = 0;            /* Length of 'working window', the other part*/
                    154: int    Worktop = 0;            /* Top of    " " */
                    155: int     Tscrlen;               /*Total length of screen,minus 1 for cmd line*/
                    156: int     scrwid = 79;           /* Width of screen */
                    157: char   *CL,
                    158:        *UP,                    /* Termcap strings we'll use */
                    159:        *HO,
                    160:        *CM,
                    161:        *CD,                    /* clear to end of display */
                    162:        *CE,
                    163:        *AL;                    /* insert line */
                    164: char    PC;
                    165: char    tbuf[1024],
                    166:         tcapbuf[128];
                    167: char   *tgetstr (), *tgoto ();
                    168: char   *getenv ();
                    169: int     compar ();
                    170: char   *ctime ();
                    171: char   *index();
                    172: char   *makename ();
                    173: char   *catargs();
                    174: char   *bldnam();
                    175: long    nblock ();
                    176: int    catchint();
                    177: int    sigint;
                    178: 
                    179: char bufout[BUFSIZ];
                    180: 
                    181: main (argc, argv)
                    182: int     argc;
                    183: char   *argv[];
                    184: {
                    185:     register   int     i,
                    186:                        cc;
                    187:     int     numarg,
                    188:            special,            /* flag says had % or # in cmd */
                    189:             status;
                    190:     char    nambuf[128];
                    191:     char    command;           /* Holds last command */
                    192:     char   **oldargv;
                    193:     register char   *t,
                    194:                    *tt;
                    195: 
                    196:  /* Get terminal type */
                    197: 
                    198:     getcap ();
                    199: 
                    200:  /* Process arg flags. They must be first! */
                    201:     for (i=1; i<argc; i++) {
                    202:        if (argv[i][0] != '-')
                    203:            break;
                    204:        switch (cc = argv[i][1]) {
                    205:          case 'w':                     /* Window size */
                    206:            if (argv[i][2] == 'h')
                    207:                scrlen = 999;           /* Half */
                    208:            else if (argv[i][2] == 'f')
                    209:                scrlen = 0;             /* Full */
                    210:            else
                    211:                scrlen = atoi(&argv[i][2]);
                    212:            break;
                    213:          case 's':                     /* Initial sort order */
                    214:          case 'r':
                    215:            sortyp = index(sortstr, argv[i][2]) - sortstr;
                    216:            rflg = (cc == 's') ? 1 : -1;
                    217:            break;
                    218:          default:
                    219:            printf("Unknown option %s, ignored.\n", argv[i]);
                    220:            break;
                    221:         }
                    222:     }
                    223:     argc -= (i - 1);
                    224:     oldargv = argv;
                    225:     argv += (i - 1);
                    226: 
                    227:     if (scrlen == 0)                   /* full screen */
                    228:        scrlen = Tscrlen;
                    229:     else if (scrlen == 999)            /* means split in half */
                    230:         scrlen = (Tscrlen - 1) >> 1;   
                    231:     if (scrlen < 2)
                    232:        scrlen = 2;
                    233:     if (Tscrlen < scrlen)
                    234:        scrlen = Tscrlen;
                    235:     splitflg = (Tscrlen > scrlen+1);   /* 1 extra line for separator */
                    236:     if (splitflg) {
                    237:        Worklen = Tscrlen - (scrlen+1); /* size of 'working' window */
                    238:        Worktop = scrlen + 1;           /* bottom half for now */
                    239:     }
                    240:     else
                    241:        Worklen = 0;
                    242:     
                    243:     tt = divider + scrwid - 14;
                    244:     for (t = divider; t < tt;) /* arbitrary length */
                    245:        *t++ = DIVCHAR;
                    246:     *t = '\0';
                    247: 
                    248:     signal (SIGINT, SIG_IGN);
                    249:     signal (SIGQUIT, SIG_IGN);
                    250: 
                    251:     setdpy ();
                    252:     printf ("Reading");
                    253: 
                    254:     time (&ttime);
                    255:     year = ttime - 6L * 30L * 24L * 60L * 60L;/* 6 months ago */
                    256: 
                    257:     lflg = 1;
                    258:     gflg = iflg = sflg = 0;
                    259:     if (lflg)
                    260:     {
                    261:        t = "/etc/passwd";
                    262:        if (gflg)
                    263:            t = "/etc/group";
                    264:        pwdf = fopen (t, "r");
                    265:     }
                    266:     
                    267:     
                    268:     numarg = argc;
                    269:     if (argc == 1)
                    270:        getdir (".");
                    271:     else
                    272:        if (argc == 2)
                    273:            getdir (argv[1]);
                    274:        else
                    275:        {
                    276:            while (--argc > 0)
                    277:            {
                    278:                if (totfiles == MAXFILES) {
                    279:                    overflow();
                    280:                    break;
                    281:                }
                    282:                if ((totfiles % 10) == 0)
                    283:                    putchar ('.');
                    284:                if (gstat(*++argv) == 0) {
                    285:                    file[totfiles].ln.namep = *argv;
                    286:                    file[totfiles].lflags |= ISARG;
                    287:                    totfiles++;
                    288:                }
                    289:            }
                    290:        }
                    291:     if (totfiles == 0) {
                    292:        printf("\n?Empty directory\n");
                    293:        unsetdpy();
                    294:        sleep(1);               /* So user can see it - don't worry if less */
                    295:        exit(0);
                    296:     }
                    297:     qsort (file, totfiles, sizeof (struct lbuf), compar);
                    298:     blank ();
                    299:     showscreen ();
                    300:     curxy (0, Tscrlen);
                    301:     ceol ();
                    302:     curxy (CURSOR, 0);
                    303: startup: 
                    304:     while ((command = readchar()) != 'q')
                    305:     {
                    306:        if (blurb)
                    307:        {
                    308:            telluser ("");
                    309:            blurb = 0;
                    310:        }
                    311:        switch (command)
                    312:        {
                    313:            case 'a':           /* Abort completely */
                    314:                blank ();
                    315:                unsetdpy ();
                    316:                exit (1);
                    317:                break;
                    318:            case 'P':           /* Print a file */
                    319:            case 'p':           /* do a pr2 */
                    320:                if (file[curfile].ltype == 'd')
                    321:                {
                    322:                    telluser ("?Can only print files");
                    323:                    break;
                    324:                }
                    325:                tempbuf[0] = '\0';
                    326:                bldnam(tempbuf, numarg, curfile, argv);
                    327:                telluser ("Printing...");
                    328:                while ((i = vfork ()) == -1)
                    329:                    sleep (3);
                    330:                if (i == 0) {
                    331: #ifdef UTAH
                    332:                    if (command == 'p')         /* little print */
                    333:                        execlp("pr2", "pr2", tempbuf, 0);
                    334:                    else                                /* big print */
                    335: #endif
                    336:                        execlp ("print", "print", tempbuf, 0);
                    337:                    telluser ("?Can't find program to list file.\n");
                    338:                    _exit(1);
                    339:                }
                    340:                wait (&status);
                    341:                break;
                    342: 
                    343:            case '!':           /* Execute a system command */
                    344:                telluser ("");
                    345:                curxy (0, Tscrlen);
                    346:                unsetdpy ();
                    347:                printf ("Command: ");
                    348:                tempbuf[0] = 'x';       /* dummy kludge */
                    349:                if (gets(tempbuf) != NULL && tempbuf[0] != '\0') {
                    350:                    extern   char *skipto();
                    351:                    register char *op,          /* old ptr */
                    352:                                  *np;          /* new ptr */
                    353:                    char     bldbuf[70];
                    354: 
                    355:                    bldbuf[0] = '\0';   
                    356:                    op = tempbuf;
                    357:                    special = 0;
                    358:                    while (cc = *(np = skipto(op, "%#"))) {
                    359:                        special++;              /* set flag */
                    360:                        *np++ = '\0';        /* zap the %/# and bump past it */
                    361:                        strcat(bldbuf, op);     /* 1st part */
                    362:                        if (cc == '%')  /* complete file name */
                    363:                            bldnam(bldbuf, numarg, curfile, argv);
                    364:                        else {          /* Had # sign, trailing comp only */
                    365:                            if (numarg <= 2)
                    366:                                strcat (bldbuf, file[curfile].ln.lname);
                    367:                            else
                    368:                                strcat (bldbuf, file[curfile].ln.namep);
                    369:                        }
                    370:                            
                    371:                        op = np;
                    372:                    }
                    373:                    strcat(bldbuf, op);
                    374: 
                    375:                    blank ();
                    376:                    if (special) {              /* display expanded command */
                    377:                        printf( "%s\n", bldbuf);
                    378:                    }   /* "system" takes long enuf for him to see it */
                    379:                    signal(SIGINT, SIG_DFL);    /* temp kludge here... */
                    380:                    signal(SIGQUIT, SIG_DFL);   /* should not use 'system' */
                    381:                    system (bldbuf);
                    382:                    signal (SIGINT, SIG_IGN);
                    383:                    signal (SIGQUIT, SIG_IGN);
                    384:                    printf ("\nCR to return...");
                    385:                    setdpy ();
                    386:                    readchar();
                    387:                    blank ();
                    388:                    showscreen ();
                    389:                    telluser ("");
                    390:                }
                    391:                else {                  /* CR only, or EOF, or error */
                    392:               /* 
                    393:                * He changed his mind, skip it.  Since we were in
                    394:                * cooked mode, the CR ending the gets is echoed and
                    395:                * we lost the first line of the display.  So we
                    396:                * re-insert it.
                    397:                */
                    398:                    setdpy();
                    399:                    if (tempbuf[0] == 'x')      /* means EOF */
                    400:                        telluser("");
                    401:                /* null entry, normal case */
                    402:                    else if (AL == 0) {         /* no insert line capability */
                    403:                        blank();
                    404:                        showscreen();
                    405:                    }
                    406:                    else {                      /* be a little sneakier */
                    407:                        curxy(0, Tscrlen-1);    /* go back to where prompt */
                    408:                        ceol();                 /*  is now, and blank it */
                    409:                        home();
                    410:                        insline();              /* make some room */
                    411:                        pentry(topfile);
                    412:                        putchar('\n');
                    413:                    }
                    414:                    curxy(CURSOR, curline);
                    415:                }
                    416:                break;
                    417: 
                    418:            case 'r':           /* Reverse sort */
                    419:                curxy (0, Tscrlen);
                    420:                printf ("reverse ");
                    421:                rflg = -1;
                    422:            case 's':           /* Normal sort */
                    423:                if (command == 's')
                    424:                {
                    425:                    curxy (0, Tscrlen);
                    426:                    rflg = 1;
                    427:                }
                    428:                printf ("sort by [s,n,r,w]: ");
                    429:                command = readchar();
                    430:                while ((command == '?') || !((command == 'n') ||
                    431:                    (command == 'r') || (command == 'w') || (command == 's') ||
                    432:                    (command == CTRL(g))))
                    433:                {
                    434:                    curxy (0, Tscrlen);
                    435:                    ceol ();
                    436:                    if (rflg == -1)
                    437:                        printf ("reverse ");
                    438:                    printf ("sort by size, name, read or write date: ");
                    439:                    command = readchar();
                    440:                }
                    441:                
                    442:                if (command == CTRL(g)) {               /* abort */
                    443:                    putchar(CTRL(g));                   /* echo it */
                    444:                    telluser("");
                    445:                    curxy(CURSOR, curline);
                    446:                    break;
                    447:                }
                    448:                
                    449:                if (command == 's')
                    450:                    sortyp = SIZE;
                    451:                else
                    452:                    if (command == 'w')
                    453:                        sortyp = WRITE;
                    454:                    else
                    455:                        if (command == 'r')
                    456:                            sortyp = READ;
                    457:                        else
                    458:                            sortyp = 0;
                    459:                printf ("%c", command);
                    460:                qsort (file, totfiles, sizeof (struct lbuf), compar);
                    461:                topfile = 0;
                    462:                curfile = 0;
                    463:                curline = 0;
                    464:                blank ();
                    465:                showscreen ();
                    466:                curxy (CURSOR, 0);
                    467:                break;
                    468: 
                    469:            case 'e':           /* Edit a file or directory */
                    470:                if (file[curfile].ltype == 'd') {
                    471:                    strcpy (tempbuf, dirednam);
                    472:                    catargs(tempbuf, oldargv);
                    473:                }
                    474:                else {
                    475:                    if ((t = getenv("EDITOR")) != NULL)
                    476:                        strcat(strcpy(tempbuf, t), " ");
                    477:                    else
                    478:                        strcpy (tempbuf, "ed ");
                    479:                }
                    480:                bldnam(tempbuf, numarg, curfile, argv);
                    481:                blank ();
                    482:                unsetdpy ();
                    483:                system (tempbuf);
                    484:                setdpy ();
                    485:                blank ();
                    486:                showscreen ();
                    487:                telluser ("");
                    488:                break;
                    489: 
                    490:            case 'm':           /* 'more' a file */
                    491:                if (file[curfile].ltype == 'd')
                    492:                {
                    493:                    telluser ("?Can only page thru files");
                    494:                    break;
                    495:                }
                    496:                strcpy (tempbuf, MOREPGM);
                    497:                bldnam(tempbuf, numarg, curfile, argv);
                    498:                blank ();
                    499:                unsetdpy ();
                    500:                system (tempbuf);
                    501: /*             if (!sigint) {  */
                    502:                printf ("\nCR to return...");
                    503: /*             }               */
                    504:                setdpy ();
                    505:                readchar();
                    506:                blank ();
                    507:                showscreen ();
                    508:                telluser ("");
                    509:                break;
                    510: 
                    511:            case 'T':   /* don't wait at page end */
                    512:            case 't':   /* quickly type the file -- added 5/81, J.Lepreau */ 
                    513:                if (file[curfile].ltype == 'd')
                    514:                {
                    515:                    telluser ("?Can only type files");
                    516:                    break;
                    517:                }
                    518:                tempbuf[0] = '\0';
                    519:                bldnam(tempbuf, numarg, curfile, argv);
                    520:                if (type(tempbuf, command == 't'))    /* little t means wait */
                    521:                    showscreen ();
                    522:                curxy (CURSOR, curline);
                    523:                break;
                    524: 
                    525:            case 'l':           /* Refresh screen */
                    526:            case CTRL(l):       /* added for editor compatibility -fjl */
                    527:                blank ();
                    528:                showscreen ();
                    529:                telluser ("");
                    530:                break;
                    531:            case 'c':           /* Refresh current line */
                    532:                curxy (0, curline);
                    533:                pentry (curfile);
                    534:                curxy (CURSOR, curline);
                    535:                break;
                    536:            case CTRL(v):
                    537:            case 'f':           /* forward window */
                    538:                fscreen ();
                    539:                break;
                    540:                                /* wish we could do meta-v */
                    541:            case 'b':           /* backward window */
                    542:                bscreen ();
                    543:                break;
                    544:            case CTRL(n):
                    545:            case '\r': 
                    546:            case '\n':          /* next file */
                    547:                if (curfile == totfiles - 1)
                    548:                    telluser ("?At end of files");
                    549:                else
                    550:                    if (curline == scrlen - 1)
                    551:                    {
                    552:                        topfile = curfile;
                    553:                        curline = 0;
                    554:                        blank ();
                    555:                        showscreen ();
                    556:                        curxy (CURSOR, 0);
                    557:                        downline ();
                    558:                    }
                    559:                    else
                    560:                        downline ();
                    561:                break;
                    562:            case '^':           /* previous file */
                    563:            case CTRL(h):               /* backspace */
                    564:            case '-':
                    565:            case CTRL(p):
                    566:                if (curfile == 0)
                    567:                    telluser ("?At start of files");
                    568:                else
                    569:                    if (curline == 0)
                    570:                    {
                    571:                        topfile = curfile - scrlen + 1;
                    572:                        curline = scrlen - 1;
                    573:                        blank ();
                    574:                        showscreen ();
                    575:                        curxy (CURSOR, curline);
                    576:                        upline ();
                    577:                    }
                    578:                    else
                    579:                        upline ();
                    580:                break;
                    581:            case 'h':           /* Help */
                    582:            case '?': 
                    583:                if (type(helpfile, 1))          /* wait */
                    584:                    showscreen ();
                    585:                curxy (CURSOR, curline);
                    586:                break;
                    587:            case 'd':           /* delete file */
                    588:                if (file[curfile].deleted == DELETED)
                    589:                    telluser ("?Already marked deleted");
                    590:                else
                    591:                {
                    592:                    numdeleted++;
                    593:                    file[curfile].deleted = DELETED;
                    594:                    printf ("D%c", 010);
                    595:                    if (curline + 1 == scrlen)
                    596:                    {
                    597:                        fscreen ();
                    598:                        downline ();
                    599:                    }
                    600:                    else
                    601:                        if (curfile != totfiles - 1)
                    602:                            downline ();
                    603:                }
                    604:                break;
                    605:            case 'u':           /* undelete file */
                    606:                if (file[curfile].deleted == NOTDELETED)
                    607:                    telluser ("?Not marked deleted");
                    608:                else
                    609:                {
                    610:                    numdeleted--;
                    611:                    file[curfile].deleted = NOTDELETED;
                    612:                    printf (" %c", 010);
                    613:                }
                    614:                break;
                    615:            default: 
                    616:                telluser ("Unknown command. Type ? or h for help");
                    617:                break;
                    618:        }
                    619:     }
                    620:     if (numdeleted)
                    621:     {
                    622:        blank ();
                    623:        printf ("The following %s marked for deletion:\n",
                    624:                (numdeleted == 1) ? "is" : "are");
                    625:        typefiles ();
                    626:        printf ("\nShall I delete %s? ",
                    627:                (numdeleted == 1) ? "this" : "these");
                    628:        if ((command = readchar()) != 'y')
                    629:        {
                    630:            blank ();
                    631:            showscreen ();
                    632:            curxy (0, Tscrlen);
                    633:            ceol ();
                    634:            curxy (CURSOR, curline);
                    635:            goto startup;
                    636:        }
                    637:        else
                    638:        {
                    639:            printf ("y\n");
                    640:            for (i = 0; i < totfiles; i++)
                    641:                if (file[i].deleted == DELETED) {
                    642:                    nambuf[0] = '\0';
                    643:                    bldnam(nambuf, numarg, i, argv);
                    644:                    if (file[i].ltype == 'd')
                    645:                        rm (nambuf, 0);
                    646:                    else
                    647:                        if (unlink (nambuf) < 0)
                    648:                            printf ("Delete of %s failed.\n", nambuf);
                    649:                }
                    650:        }
                    651:     }
                    652:     else
                    653:        blank ();
                    654: 
                    655:     unsetdpy ();
                    656:     exit(0);
                    657: }
                    658: 
                    659: typefiles ()
                    660: {
                    661:     int     longsiz,
                    662:             i,
                    663:             j,
                    664:             maxperln,
                    665:             numout,
                    666:             longthis;
                    667:     longsiz = numout = 0;
                    668:     for (i = 0; i < totfiles; i++)
                    669:        if (file[i].deleted == DELETED)
                    670:            if (file[i].lflags & ISARG)
                    671:            {
                    672:                if (strlen (file[i].ln.namep) > longsiz)
                    673:                {
                    674:                    longsiz = strlen (file[i].ln.namep);
                    675:                }
                    676:            }
                    677:            else
                    678:            {
                    679:                if (strlen (file[i].ln.lname) > longsiz)
                    680:                {
                    681:                    longsiz = strlen (file[i].ln.lname);
                    682:                }
                    683:            }
                    684:     maxperln = scrwid / (longsiz + 3);
                    685:     for (i = 0; i < totfiles; i++)
                    686:        if (file[i].deleted == DELETED)
                    687:        {
                    688:            if (file[i].lflags & ISARG)
                    689:            {
                    690:                printf ("%s", file[i].ln.namep);
                    691:                longthis = strlen (file[i].ln.namep);
                    692:            }
                    693:            else
                    694:            {
                    695:                printf ("%.14s", file[i].ln.lname);
                    696:                longthis = strlen (file[i].ln.lname);
                    697:            }
                    698:            numout++;
                    699:            if ((numout % maxperln) == 0)
                    700:                putchar ('\n');
                    701:            else if (numout != numdeleted)
                    702:                for (j = 0; j < (longsiz + 3 - longthis); j++)
                    703:                    putchar (' ');
                    704:        }
                    705: }
                    706: 
                    707: rm (arg, level)
                    708: char    arg[];
                    709: {
                    710:     struct stat buf;
                    711:     struct direct   direct;
                    712:     char    name[100];
                    713:     int     d;
                    714: 
                    715:     if (stat (arg, &buf))
                    716:     {
                    717:        return;
                    718:     }
                    719:     if ((buf.st_mode & S_IFMT) == S_IFDIR)
                    720:     {
                    721:        if (access (arg, 02) < 0)
                    722:        {
                    723:            printf ("%s not deleted.\n", arg);
                    724:            return;
                    725:        }
                    726:        if ((d = open (arg, 0)) < 0)
                    727:        {
                    728:            printf ("rm: %s: cannot read\n", arg);
                    729:            return;
                    730:        }
                    731:        while (read (d, (char *) & direct, sizeof (direct)) == sizeof (direct))
                    732:        {
                    733:            if (direct.d_ino != 0 && !dotname (direct.d_name))
                    734:            {
                    735:                sprintf (name, "%s/%.14s", arg, direct.d_name);
                    736:                rm (name, level + 1);
                    737:            }
                    738:        }
                    739:        close (d);
                    740:        errcode += rmdir (arg);
                    741:        return;
                    742:     }
                    743: 
                    744:     if (unlink (arg))
                    745:     {
                    746:        ++errcode;
                    747:        printf ("%s not deleted.\n", arg);
                    748:     }
                    749: }
                    750: 
                    751: dotname (s)
                    752: char   *s;
                    753: {
                    754:     if (s[0] == '.')
                    755:        if (s[1] == '.')
                    756:            if (s[2] == '\0')
                    757:                return (1);
                    758:            else
                    759:                return (0);
                    760:        else
                    761:            if (s[1] == '\0')
                    762:                return (1);
                    763:     return (0);
                    764: }
                    765: 
                    766: rmdir (f)
                    767: char   *f;
                    768: {
                    769:     int     status,
                    770:             i;
                    771: 
                    772:     if (dotname (f))
                    773:        return (0);
                    774:     while ((i = vfork ()) == -1)
                    775:        sleep (3);
                    776:     if (i == 0) {
                    777:        execl ("/bin/rmdir", "rmdir", f, 0);
                    778:        execl ("/usr/bin/rmdir", "rmdir", f, 0);
                    779:        printf ("rm: can't find rmdir\n");
                    780:        _exit(1);
                    781:     }
                    782:     wait (&status);
                    783:     return (status);
                    784: }
                    785: 
                    786: fscreen ()
                    787: {
                    788:     if (topfile + scrlen - 1 > totfiles - 1)
                    789:        telluser ("?No remaining windows");
                    790:     else
                    791:     {
                    792:        topfile = topfile + scrlen - 1;
                    793:        curfile = topfile;
                    794:        curline = 0;
                    795:        blank ();
                    796:        showscreen ();
                    797:        curxy (CURSOR, 0);
                    798:     }
                    799: }
                    800: 
                    801: bscreen ()
                    802: {
                    803:     if (topfile - scrlen + 1 < 0)
                    804:        telluser ("?No previous windows");
                    805:     else
                    806:     {
                    807:        topfile = topfile - scrlen + 1;
                    808:        curfile = topfile;
                    809:        curline = 0;
                    810:        blank ();
                    811:        showscreen ();
                    812:        curxy (CURSOR, 0);
                    813:     }
                    814: }
                    815: 
                    816: showscreen ()
                    817: {
                    818:     int     i,
                    819:             numprint;
                    820:     home ();
                    821:     numprint = 0;
                    822:     for (i = topfile; (numprint < scrlen) && (i < totfiles); i++)
                    823:     {
                    824:        numprint++;
                    825:        pentry (i);
                    826:        putchar ('\n');
                    827:     }
                    828:     if (splitflg)
                    829:        printf ("%s\n", divider);
                    830: }
                    831: 
                    832: getdir (dir)                   /* Reads directory dir */
                    833: char   *dir;
                    834: {
                    835:     static struct direct    dentry;
                    836:     register int    j;
                    837:     struct direct *dp;
                    838:     DIR *dirf;
                    839: 
                    840:     if ((dirf = opendir (dir)) == NULL)
                    841:     {
                    842:        printf ("\nSorry, %s unreadable.\n", dir);
                    843:        unsetdpy ();
                    844:        exit(1);
                    845:     }
                    846:     for (;;)
                    847:     {
                    848:        if ((dp = readdir(dirf)) == NULL)
                    849:            break;
                    850:        dentry = *dp;
                    851:        if (dentry.d_ino == 0
                    852:                || dentry.d_name[0] == '.' && (dentry.d_name[1] == '\0'
                    853:                    || dentry.d_name[1] == '.' && dentry.d_name[2] == '\0'))
                    854:            continue;
                    855: 
                    856:        if (totfiles == MAXFILES)
                    857:            overflow();                 /* abort, too may files */
                    858:        /* Just ignore if can't find the file, dir may be changing */
                    859:        if (gstat (makename (dir, dentry.d_name)) == 0) {       /* 0 == Ok */
                    860:            file[totfiles].lnum = dentry.d_ino;
                    861:            strncpy(file[totfiles].ln.lname,  dentry.d_name, MAXN);
                    862:            totfiles++;
                    863:            if (totfiles % 10 == 0)
                    864:                putchar ('.');
                    865:        }
                    866:     }
                    867:     closedir (dirf);
                    868: }
                    869: 
                    870: gstat (name)                   /* Stats the file with name */
                    871: char   *name;
                    872: {
                    873: 
                    874:     file[totfiles].lflags = 0;
                    875:     file[totfiles].lnum = 0;
                    876:     file[totfiles].ltype = '-';
                    877: 
                    878:     if (stat (name, &statbuf) < 0)
                    879:     {
                    880:        return(-1);
                    881:     }
                    882:     file[totfiles].lnum = statbuf.st_ino;
                    883:     file[totfiles].lsize = statbuf.st_size;
                    884:     switch (statbuf.st_mode & S_IFMT)
                    885:     {
                    886:        case S_IFLNK: 
                    887:            file[totfiles].ltype = 'l';
                    888:            break;
                    889:        case S_IFDIR: 
                    890:            file[totfiles].ltype = 'd';
                    891:            break;
                    892:        case S_IFBLK: 
                    893:            file[totfiles] .ltype = 'b';
                    894:            file[totfiles].lsize = statbuf.st_rdev;
                    895:            break;
                    896:        case S_IFCHR: 
                    897:            file[totfiles].ltype = 'c';
                    898:            file[totfiles].lsize = statbuf.st_rdev;
                    899:            break;
                    900:     }
                    901:     file[totfiles].lflags = statbuf.st_mode & ~S_IFMT;
                    902:     file[totfiles].luid = statbuf.st_uid;
                    903:     file[totfiles].lgid = statbuf.st_gid;
                    904:     file[totfiles].lnl = statbuf.st_nlink;
                    905:     file[totfiles].latime = statbuf.st_atime;
                    906:     file[totfiles].lctime = statbuf.st_ctime;
                    907:     file[totfiles].lmtime = statbuf.st_mtime;
                    908:     totblocks += nblock (statbuf.st_size);
                    909:     return(0);
                    910: }
                    911: 
                    912: char *
                    913: makename (dir, filen)
                    914: char   *dir,
                    915:        *filen;
                    916: {
                    917:     static char dfile[100];
                    918:     register char  *dp,
                    919:                    *fp;
                    920:     register int    i;
                    921: 
                    922:     dp = dfile;
                    923:     fp = dir;
                    924:     while (*fp)
                    925:        *dp++ = *fp++;
                    926:     *dp++ = '/';
                    927:     fp = filen;
                    928:     strcpy(dp, fp);
                    929:     return (dfile);
                    930: }
                    931: 
                    932: long
                    933: nblock (size)
                    934: long    size;
                    935: {
                    936:     return ((size + 511) >> 9);
                    937: }
                    938: 
                    939: pentry (whichone)
                    940: int     whichone;
                    941: {
                    942:     struct
                    943:     {
                    944:        char    dminor,
                    945:                dmajor;
                    946:     };
                    947:     register    t;
                    948:     register char  *cp;
                    949: 
                    950:     if (file[whichone].lnum == -1)
                    951:        return;
                    952:     if (iflg)
                    953:        printf ("%5u ", file[whichone].lnum);
                    954:     if (sflg)
                    955:        printf ("%4D ", nblock (file[whichone].lsize));
                    956:     if (lflg)
                    957:     {
                    958:        putchar (file[whichone].ltype);
                    959:        pmode (file[whichone].lflags);
                    960:        printf ("%2d ", file[whichone].lnl);
                    961:        t = file[whichone].luid;
                    962:        if (gflg)
                    963:            t = file[whichone].lgid;
                    964:        if (getname (t, userbuf) == 0)
                    965:            printf ("%-14.14s", userbuf);
                    966:        else
                    967:            printf ("%-14d", t);
                    968:        if (file[whichone].ltype == 'b' || file[whichone].ltype == 'c')
                    969:            printf ("%3d,%3d", major ((int) file[whichone].lsize),
                    970:                    minor ((int) file[whichone].lsize));
                    971:        else
                    972:            printf ("%7ld", file[whichone].lsize);
                    973:        if ((sortyp == WRITE) || (sortyp == 0) || (sortyp == SIZE))
                    974:        {
                    975:            cp = ctime (&file[whichone].lmtime);
                    976:            if (file[whichone].lmtime < year)
                    977:                printf (" %-7.7s %-4.4s ", cp + 4, cp + 20);
                    978:            else
                    979:                printf (" %-12.12s ", cp + 4);
                    980:        }
                    981:        else
                    982:            if (sortyp == READ)
                    983:            {
                    984:                cp = ctime (&file[whichone].latime);
                    985:                if (file[whichone].latime < year)
                    986:                    printf (" %-7.7s %-4.4s ", cp + 4, cp + 20);
                    987:                else
                    988:                    printf (" %-12.12s ", cp + 4);
                    989:            }
                    990:     }
                    991:     printf ("%c", file[whichone].deleted ? 'D' : ' ');
                    992:     if (file[whichone].lflags & ISARG)
                    993:        printf (" %s", file[whichone].ln.namep);
                    994:     else {
                    995:        putchar(' ');
                    996:        for (t=0; t<14; t++) {
                    997:            register c = file[whichone].ln.lname[t] & 0377;;
                    998:            if (c == '\0')
                    999:                break;
                   1000:            if (c<' ' || c>=0200) {
                   1001:                c &= 0177;
                   1002:                c |= 0100;
                   1003:                putchar('^');
                   1004:            }
                   1005:            putchar(c);
                   1006:        }
                   1007:     }
                   1008: }
                   1009: 
                   1010: getname (uid, buf)
                   1011: int     uid;
                   1012: char    buf[];
                   1013: {
                   1014:     int     j,
                   1015:             c,
                   1016:             n, sign,
                   1017:             i;
                   1018: 
                   1019:     if (uid == lastuid)
                   1020:        return (0);
                   1021:     if (pwdf == NULL)
                   1022:        return (-1);
                   1023:     rewind (pwdf);
                   1024:     lastuid = -1;
                   1025:     do
                   1026:     {
                   1027:        i = 0;
                   1028:        j = 0;
                   1029:        n = 0;
                   1030:        sign = 0;
                   1031:        while ((c = fgetc (pwdf)) != '\n')
                   1032:        {
                   1033:            if (c == EOF)
                   1034:                return (-1);
                   1035:            if (c == ':')
                   1036:            {
                   1037:                j++;
                   1038:                c = '0';
                   1039:            }
                   1040:            if (j == 0)
                   1041:                buf[i++] = c;
                   1042:            if (j == 2) {
                   1043:                if (c=='-')
                   1044:                    sign = 1;
                   1045:                else
                   1046:                    n = n * 10 + c - '0';
                   1047:            }
                   1048:        }
                   1049:        if (sign)
                   1050:            n = -n;
                   1051:        n = (unsigned short)n;
                   1052:     } while (n != uid);
                   1053:     buf[i++] = '\0';
                   1054:     lastuid = uid;
                   1055:     return (0);
                   1056: }
                   1057: 
                   1058: int     m1[] =
                   1059: {
                   1060:     1, S_IREAD >> 0, 'r', '-'
                   1061: };
                   1062: int     m2[] =
                   1063: {
                   1064:     1, S_IWRITE >> 0, 'w', '-'
                   1065: };
                   1066: int     m3[] =
                   1067: {
                   1068:     2, S_ISUID, 's', S_IEXEC >> 0, 'x', '-'
                   1069: };
                   1070: int     m4[] =
                   1071: {
                   1072:     1, S_IREAD >> 3, 'r', '-'
                   1073: };
                   1074: int     m5[] =
                   1075: {
                   1076:     1, S_IWRITE >> 3, 'w', '-'
                   1077: };
                   1078: int     m6[] =
                   1079: {
                   1080:     2, S_ISGID, 's', S_IEXEC >> 3, 'x', '-'
                   1081: };
                   1082: int     m7[] =
                   1083: {
                   1084:     1, S_IREAD >> 6, 'r', '-'
                   1085: };
                   1086: int     m8[] =
                   1087: {
                   1088:     1, S_IWRITE >> 6, 'w', '-'
                   1089: };
                   1090: int     m9[] =
                   1091: {
                   1092:     2, 0/*S_ISVTX*/, 't', S_IEXEC >> 6, 'x', '-'
                   1093: };
                   1094: 
                   1095: int    *m[] =
                   1096: {
                   1097:     m1, m2, m3, m4, m5, m6, m7, m8, m9
                   1098: };
                   1099: 
                   1100: pmode (aflag)
                   1101: {
                   1102:     register int  **mp;
                   1103: 
                   1104:     flags = aflag;
                   1105:     for (mp = &m[0]; mp < &m[sizeof (m) / sizeof (m[0])];)
                   1106:        select (*mp++);
                   1107: }
                   1108: 
                   1109: select (pairp)
                   1110: register int   *pairp;
                   1111: {
                   1112:     register int    n;
                   1113: 
                   1114:     n = *pairp++;
                   1115:     while (--n >= 0 && (flags & *pairp++) == 0)
                   1116:        pairp++;
                   1117:     putchar (*pairp);
                   1118: }
                   1119: 
                   1120: compar (pp1, pp2)
                   1121: struct lbuf *pp1,
                   1122:            *pp2;
                   1123: {
                   1124:     register struct lbuf   *p1,
                   1125:                            *p2;
                   1126: 
                   1127:     p1 = pp1;
                   1128:     p2 = pp2;
                   1129:     if (p1 -> lflags & ISARG && p1 -> ltype == 'd')
                   1130:     {
                   1131:        if (!(p2 -> lflags & ISARG && p2 -> ltype == 'd'))
                   1132:            return (1);
                   1133:     }
                   1134:     else
                   1135:     {
                   1136:        if (p2 -> lflags & ISARG && p2 -> ltype == 'd')
                   1137:            return (-1);
                   1138:     }
                   1139:     if (sortyp == SIZE)
                   1140:     {
                   1141:        if (p2 -> lsize == p1 -> lsize)
                   1142:            return (0);
                   1143:        if (p2 -> lsize > p1 -> lsize)
                   1144:            return (rflg);
                   1145:        return (-rflg);
                   1146:     }
                   1147:     else
                   1148:        if (sortyp == WRITE)
                   1149:        {
                   1150:            if (p2 -> lmtime == p1 -> lmtime)
                   1151:                return (0);
                   1152:            if (p2 -> lmtime > p1 -> lmtime)
                   1153:                return (rflg);
                   1154:            return (-rflg);
                   1155:        }
                   1156:        else
                   1157:            if (sortyp == READ)
                   1158:            {
                   1159:                if (p2 -> latime == p1 -> latime)
                   1160:                    return (0);
                   1161:                if (p2 -> latime > p1 -> latime)
                   1162:                    return (rflg);
                   1163:                return (-rflg);
                   1164:            }
                   1165:     return (rflg * strcmp (p1 -> lflags & ISARG ? p1 -> ln.namep : p1 -> ln.lname,
                   1166:                p2 -> lflags & ISARG ? p2 -> ln.namep : p2 -> ln.lname));
                   1167: }
                   1168: 
                   1169: ceod()
                   1170: {
                   1171:     putpad(CD);
                   1172: }
                   1173: 
                   1174: ceol ()
                   1175: {
                   1176:     putpad (CE);
                   1177: }
                   1178: blank ()
                   1179: {
                   1180:     putpad (CL);
                   1181: }
                   1182: home ()
                   1183: {
                   1184:     if (HO)
                   1185:        putpad (HO);
                   1186:     else
                   1187:        curxy(0,0);
                   1188: }
                   1189: insline ()
                   1190: {
                   1191:     putpad (AL);
                   1192: }
                   1193: 
                   1194: /* Yes, folks, we use direct cursor addressing to get to next line!
                   1195:    Before you mumble "What sort of cretin would do this?" here's
                   1196:    the reason. We don't use \n since that obviously won't work.
                   1197:    We don't use \012 since virgin version 7 makes that into a crlf.
                   1198:    We don't use raw mode since we type out help files efficently,
                   1199:    and we don't want to switch modes all the time. So enjoy. -- SMC */
                   1200: 
                   1201: downline ()
                   1202: {
                   1203:     curxy (CURSOR, ++curline);
                   1204:     curfile++;
                   1205: }
                   1206: upline ()
                   1207: {
                   1208:     putpad (UP);
                   1209:     curline--;
                   1210:     curfile--;
                   1211: }
                   1212: 
                   1213: /*VARARGS1*/
                   1214: telluser (msg, args)
                   1215: char   *msg;
                   1216: {
                   1217:     curxy (0, Tscrlen);
                   1218:     ceol ();
                   1219:     printf (msg, args);
                   1220:     curxy (CURSOR, curline);
                   1221:     blurb++;
                   1222: }
                   1223: curxy (col, lin)
                   1224: {
                   1225:     char   *cmstr = tgoto (CM, col, lin);
                   1226:     putpad (cmstr);
                   1227: }
                   1228: 
                   1229: char *fgets();
                   1230: 
                   1231: type (filestr, waitflg)    /* Modified to type help file & others. fjl 5/81 */
                   1232: char *filestr;                 /* Kludgy now with split screen stuff! */
                   1233: {
                   1234:     int     helpfd = 5;
                   1235:     FILE    *fd = stdin;
                   1236:     char    *eof;
                   1237:     register int     i, n;
                   1238:     register int     cc = 0;
                   1239:     int            cur_scrl;           /* current screen length */
                   1240:     char    helpbuf[512];
                   1241:     
                   1242:     if (!splitflg)
                   1243:        helpfd = open(filestr, 0);
                   1244:     else
                   1245:        fd = fopen(filestr, "r");
                   1246:     if (helpfd < 0 || fd == NULL) {
                   1247:        telluser("?Unable to open %sfile",strcmp(filestr,helpfile)?"":"help ");
                   1248:        return (FALSE);
                   1249:     }
                   1250:     
                   1251:     signal(SIGINT, catchint);
                   1252:     sigint = 0;
                   1253:     
                   1254:     if (!splitflg) {
                   1255:        blank();
                   1256:        fflush(stdout);
                   1257:        while ((i = read (helpfd, helpbuf, 512)) > 0 && !sigint)
                   1258:            write (1, helpbuf, i);
                   1259:        close(helpfd);
                   1260:     }
                   1261:     else {
                   1262:        cur_scrl = totfiles - topfile + 1;      /* topfile starts at 0 */
                   1263:        Worktop = ((cur_scrl < scrlen) ? cur_scrl : scrlen) + 1;
                   1264:        do {
                   1265:            curxy(0, Worktop);
                   1266:            ceod();
                   1267:            for (i = Worktop; (i < Tscrlen) && !sigint && (cc != EOF); i++) {
                   1268:                n = 0;
                   1269:                while ((cc = getc(fd)) != EOF) {
                   1270:                    if (cc == '\t')
                   1271:                        n |= 07;
                   1272: chklen:                    if (n++ == scrwid-1) {      /* Use most of screen */
                   1273:                        if (cc != '\n') {
                   1274:                            ungetc(cc, fd);
                   1275:                            cc = '\n';
                   1276:                        }
                   1277:                    }
                   1278:                    if (cc < ' ' && cc!='\n' && cc!='\t' || cc>=0200) {
                   1279:                        putchar('^');
                   1280:                        cc &= 0177;
                   1281:                        cc |= 0100;
                   1282:                        goto chklen;
                   1283:                    }
                   1284:                    putchar(cc);
                   1285:                    if (cc == '\n')
                   1286:                        break;
                   1287:                }
                   1288:            }
                   1289:        } while (!sigint && (cc != EOF) && waitchk(waitflg));
                   1290:        
                   1291:        if (feof(fd))   
                   1292:            printf("===== End-of-File =====\n");
                   1293:        fflush(stdout);
                   1294:        fclose(fd);
                   1295:        return(FALSE);          /* means needs no re-display */
                   1296:     }
                   1297:            
                   1298:     if (!splitflg) {           /* redundant now... */
                   1299:        if (!sigint) {
                   1300:            curxy(0, Tscrlen);
                   1301:            printf ("CR to return...");
                   1302:            readchar();
                   1303:        }
                   1304:        blank ();
                   1305:        return (TRUE);
                   1306:     }
                   1307: }
                   1308: 
                   1309: waitchk(waitflg)
                   1310: {
                   1311:        if (!waitflg)
                   1312:            return(1);
                   1313:        fflush(stdout);
                   1314:        curxy(0, Tscrlen);
                   1315:        printf ("---Continue---");
                   1316:        ceol();
                   1317:        curxy(0, Tscrlen);
                   1318:        readchar();
                   1319:        ceol();
                   1320:        if (sigint)
                   1321:            return(0);          /* avoids clear of screen */
                   1322:        return(1);
                   1323: }
                   1324: 
                   1325: setdpy ()
                   1326: {
                   1327:     ioctl (0, TIOCGETP, &ioctlb);
                   1328:     ioctlb.sg_flags |= CBREAK;
                   1329:     ioctlb.sg_flags &= ~ECHO;
                   1330:     ioctl (0, TIOCSETP, &ioctlb);
                   1331: }
                   1332: 
                   1333: unsetdpy ()
                   1334: {
                   1335:     ioctlb.sg_flags &= ~CBREAK;
                   1336:     ioctlb.sg_flags |= ECHO;
                   1337:     ioctl (0, TIOCSETP, &ioctlb);
                   1338: }
                   1339: 
                   1340: getcap ()
                   1341: {
                   1342:     char   *ap;
                   1343:     char   *term;
                   1344:     char   *xPC;
                   1345: 
                   1346:     term = getenv ("TERM");
                   1347:     if (term == 0)
                   1348:     {
                   1349:        printf("No TERM in environment\n");
                   1350:        exit(1);
                   1351:     }
                   1352: 
                   1353:     switch (tgetent (tbuf, term))
                   1354:     {
                   1355:        case -1: 
                   1356:            printf("Cannot open termcap file\n");
                   1357:            exit (2);
                   1358:        case 0: 
                   1359:            printf("%s: unknown terminal", term);
                   1360:            exit (3);
                   1361:     }
                   1362: 
                   1363:     ap = tcapbuf;
                   1364: 
                   1365:     Tscrlen = tgetnum ("li") - 1;
                   1366:     scrwid = tgetnum ("co") - 1;/* lose 1 so won't scroll in last line */
                   1367: 
                   1368:     UP = tgetstr ("up", &ap);
                   1369:     CD = tgetstr ("cd", &ap);
                   1370:     CE = tgetstr ("ce", &ap);
                   1371:     HO = tgetstr ("ho", &ap);
                   1372:     CL = tgetstr ("cl", &ap);
                   1373:     CM = tgetstr ("cm", &ap);
                   1374:     AL = tgetstr ("al", &ap);          /* insert line, optional */
                   1375: 
                   1376:     xPC = tgetstr ("pc", &ap);
                   1377:     if (xPC)
                   1378:        PC = *xPC;
                   1379: 
                   1380:     if ((CM == 0) || (CL == 0) || (UP == 0))
                   1381:     {
                   1382:        printf("Tty must have cursor addr, clear, and 4 cursor motions.\n");
                   1383:        exit (1);
                   1384:     }
                   1385:     if (Tscrlen <= 0 || scrwid <= 0)
                   1386:     {
                   1387:        printf("Must know the screen size\n");
                   1388:        exit (1);
                   1389:     }
                   1390: }
                   1391: 
                   1392: outch (c)
                   1393: {
                   1394:     putchar (c);
                   1395: }
                   1396: 
                   1397: putpad (str)
                   1398: char   *str;
                   1399: {
                   1400:     if (str)
                   1401:        tputs (str, 0, outch);
                   1402: }
                   1403: 
                   1404: catchint(sig)
                   1405: {
                   1406:        signal(SIGINT, SIG_IGN);        /* reset it */
                   1407:        sigint = 1;
                   1408: }
                   1409: 
                   1410: char *
                   1411: bldnam(str, numarg, filidx, argv)
                   1412: char *str;
                   1413: char *argv[];
                   1414: {
                   1415:        
                   1416:        if (numarg == 1)
                   1417:            strcat (str, file[filidx].ln.lname);
                   1418:        else
                   1419:            if (numarg == 2) {
                   1420:                strcat (str, argv[1]);
                   1421:                strcat (str, "/");
                   1422:                strcat (str, file[filidx].ln.lname);
                   1423:            }
                   1424:            else
                   1425:                strcat (str, file[filidx].ln.namep);
                   1426:        return(str);
                   1427: }
                   1428: 
                   1429: char *
                   1430: catargs(str, argv)
                   1431: char *str;
                   1432: char *argv[];
                   1433: {
                   1434:        register int i;
                   1435: 
                   1436:        for (++argv; *argv; argv++) {
                   1437:                if (**argv == '-') {
                   1438:                        strcat(str, *argv);
                   1439:                        strcat(str, " ");
                   1440:                }
                   1441:        }
                   1442:        return(str);
                   1443: }
                   1444: 
                   1445: overflow()
                   1446: {
                   1447:     printf("\n?Too many files\007\n");
                   1448:     fflush(stdout);
                   1449:     sleep(1);          /* So user can see it - don't worry if less */
                   1450: }
                   1451: 
                   1452: char *skipto (string,charset)
                   1453: char *charset,*string;
                   1454: {
                   1455:        register char *setp,*strp;
                   1456:        register int found;
                   1457: 
                   1458:        found = 0;                      /* not found yet */
                   1459:        strp = string;                  /* start at first char */
                   1460: 
                   1461:        while (*strp && !found) {       /* until null or found */
                   1462:                /* find first char in charset matching *strp */
                   1463:                for (setp=charset; (*setp) && (*setp != *strp); setp++) ;
                   1464:                if (*setp)      found = 1;      /* matches a char */
                   1465:                else            strp++;         /* else keep looking */
                   1466:        }
                   1467: 
                   1468:        return (strp);
                   1469: }
                   1470: 
                   1471: readchar()
                   1472: {
                   1473:        static neofs;
                   1474:        register c;
                   1475: 
                   1476:        fflush(stdout);
                   1477:        c = getchar();
                   1478:        if (c == EOF)
                   1479:                if (++neofs > 100)
                   1480:                        exit(1);
                   1481:        return(c);
                   1482: }

unix.superglobalmegacorp.com

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