Annotation of 43BSDReno/bin/csh/sh.hist.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1980 Regents of the University of California.
        !             3:  * All rights reserved.  The Berkeley Software License Agreement
        !             4:  * specifies the terms and conditions for redistribution.
        !             5:  */
        !             6: 
        !             7: #ifndef lint
        !             8: static char *sccsid = "@(#)sh.hist.c   5.3 (Berkeley) 6/25/87";
        !             9: #endif
        !            10: 
        !            11: #include "sh.h"
        !            12: 
        !            13: /*
        !            14:  * C shell
        !            15:  */
        !            16: 
        !            17: savehist(sp)
        !            18:        struct wordent *sp;
        !            19: {
        !            20:        register struct Hist *hp, *np;
        !            21:        register int histlen = 0;
        !            22:        char *cp;
        !            23: 
        !            24:        /* throw away null lines */
        !            25:        if (sp->next->word[0] == '\n')
        !            26:                return;
        !            27:        cp = value("history");
        !            28:        if (*cp) {
        !            29:                register char *p = cp;
        !            30: 
        !            31:                while (*p) {
        !            32:                        if (!digit(*p)) {
        !            33:                                histlen = 0;
        !            34:                                break;
        !            35:                        }
        !            36:                        histlen = histlen * 10 + *p++ - '0';
        !            37:                }
        !            38:        }
        !            39:        for (hp = &Histlist; np = hp->Hnext;)
        !            40:                if (eventno - np->Href >= histlen || histlen == 0)
        !            41:                        hp->Hnext = np->Hnext, hfree(np);
        !            42:                else
        !            43:                        hp = np;
        !            44:        (void) enthist(++eventno, sp, 1);
        !            45: }
        !            46: 
        !            47: struct Hist *
        !            48: enthist(event, lp, docopy)
        !            49:        int event;
        !            50:        register struct wordent *lp;
        !            51:        bool docopy;
        !            52: {
        !            53:        register struct Hist *np;
        !            54: 
        !            55:        np = (struct Hist *) xalloc(sizeof *np);
        !            56:        np->Hnum = np->Href = event;
        !            57:        if (docopy)
        !            58:                copylex(&np->Hlex, lp);
        !            59:        else {
        !            60:                np->Hlex.next = lp->next;
        !            61:                lp->next->prev = &np->Hlex;
        !            62:                np->Hlex.prev = lp->prev;
        !            63:                lp->prev->next = &np->Hlex;
        !            64:        }
        !            65:        np->Hnext = Histlist.Hnext;
        !            66:        Histlist.Hnext = np;
        !            67:        return (np);
        !            68: }
        !            69: 
        !            70: hfree(hp)
        !            71:        register struct Hist *hp;
        !            72: {
        !            73: 
        !            74:        freelex(&hp->Hlex);
        !            75:        xfree((char *)hp);
        !            76: }
        !            77: 
        !            78: dohist(vp)
        !            79:        char **vp;
        !            80: {
        !            81:        int n, rflg = 0, hflg = 0;
        !            82:        if (getn(value("history")) == 0)
        !            83:                return;
        !            84:        if (setintr)
        !            85:                (void) sigsetmask(sigblock(0L) & ~sigmask(SIGINT));
        !            86:        while (*++vp && **vp == '-') {
        !            87:                char *vp2 = *vp;
        !            88:  
        !            89:                while (*++vp2)
        !            90:                        switch (*vp2) {
        !            91:                        case 'h':
        !            92:                                hflg++;
        !            93:                                break;
        !            94:                        case 'r':
        !            95:                                rflg++;
        !            96:                                break;
        !            97:                        case '-':       /* ignore multiple '-'s */
        !            98:                                break;
        !            99:                        default:
        !           100:                                printf("Unknown flag: -%c\n", *vp2);
        !           101:                                error("Usage: history [-rh] [# number of events]");
        !           102:                        }
        !           103:        }
        !           104:        if (*vp)
        !           105:                n = getn(*vp);
        !           106:        else {
        !           107:                n = getn(value("history"));
        !           108:        }
        !           109:        dohist1(Histlist.Hnext, &n, rflg, hflg);
        !           110: }
        !           111: 
        !           112: dohist1(hp, np, rflg, hflg)
        !           113:        struct Hist *hp;
        !           114:        int *np, rflg, hflg;
        !           115: {
        !           116:        bool print = (*np) > 0;
        !           117: top:
        !           118:        if (hp == 0)
        !           119:                return;
        !           120:        (*np)--;
        !           121:        hp->Href++;
        !           122:        if (rflg == 0) {
        !           123:                dohist1(hp->Hnext, np, rflg, hflg);
        !           124:                if (print)
        !           125:                        phist(hp, hflg);
        !           126:                return;
        !           127:        }
        !           128:        if (*np >= 0)
        !           129:                phist(hp, hflg);
        !           130:        hp = hp->Hnext;
        !           131:        goto top;
        !           132: }
        !           133: 
        !           134: phist(hp, hflg)
        !           135:        register struct Hist *hp;
        !           136:        int hflg;
        !           137: {
        !           138: 
        !           139:        if (hflg == 0)
        !           140:                printf("%6d\t", hp->Hnum);
        !           141:        prlex(&hp->Hlex);
        !           142: }

unix.superglobalmegacorp.com

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