|
|
1.1 root 1: static char *sccsid = "@(#)sh.hist.c 4.6 6/11/83";
2:
3: #include "sh.h"
4:
5: /*
6: * C shell
7: */
8:
9: savehist(sp)
10: struct wordent *sp;
11: {
12: register struct Hist *hp, *np;
13: int histlen;
14: register char *cp;
15:
16: cp = value("history");
17: if (*cp == 0)
18: histlen = 0;
19: else {
20: while (*cp && digit(*cp))
21: cp++;
22: /* avoid a looping snafu */
23: if (*cp)
24: set("history", "10");
25: histlen = getn(value("history"));
26: }
27: /* throw away null lines */
28: if (sp->next->word[0] == '\n')
29: return;
30: for (hp = &Histlist; np = hp->Hnext;)
31: if (eventno - np->Href >= histlen || histlen == 0)
32: hp->Hnext = np->Hnext, hfree(np);
33: else
34: hp = np;
35: enthist(++eventno, sp, 1);
36: }
37:
38: struct Hist *
39: enthist(event, lp, docopy)
40: int event;
41: register struct wordent *lp;
42: bool docopy;
43: {
44: register struct Hist *np;
45:
46: np = (struct Hist *) calloc(1, sizeof *np);
47: np->Hnum = np->Href = event;
48: if (docopy)
49: copylex(&np->Hlex, lp);
50: else {
51: np->Hlex.next = lp->next;
52: lp->next->prev = &np->Hlex;
53: np->Hlex.prev = lp->prev;
54: lp->prev->next = &np->Hlex;
55: }
56: np->Hnext = Histlist.Hnext;
57: Histlist.Hnext = np;
58: return (np);
59: }
60:
61: hfree(hp)
62: register struct Hist *hp;
63: {
64:
65: freelex(&hp->Hlex);
66: xfree((char *)hp);
67: }
68:
69: dohist(vp)
70: char **vp;
71: {
72: int n, rflg = 0, hflg = 0;
73: if (getn(value("history")) == 0)
74: return;
75: if (setintr)
76: sigrelse(SIGINT);
77: vp++;
78: while (*vp && *vp[0] == '-') {
79: if (*vp && eq(*vp, "-h")) {
80: hflg++;
81: vp++;
82: }
83: if (*vp && eq(*vp, "-r")) {
84: rflg++;
85: vp++;
86: }
87: }
88: if (*vp)
89: n = getn(*vp);
90: else {
91: n = getn(value("history"));
92: }
93: dohist1(Histlist.Hnext, &n, rflg, hflg);
94: }
95:
96: dohist1(hp, np, rflg, hflg)
97: struct Hist *hp;
98: int *np, rflg, hflg;
99: {
100: bool print = (*np) > 0;
101: top:
102: if (hp == 0)
103: return;
104: (*np)--;
105: hp->Href++;
106: if (rflg == 0) {
107: dohist1(hp->Hnext, np, rflg, hflg);
108: if (print)
109: phist(hp, hflg);
110: return;
111: }
112: if (*np >= 0)
113: phist(hp, hflg);
114: hp = hp->Hnext;
115: goto top;
116: }
117:
118: phist(hp, hflg)
119: register struct Hist *hp;
120: int hflg;
121: {
122:
123: if (hflg == 0)
124: printf("%6d\t", hp->Hnum);
125: prlex(&hp->Hlex);
126: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.