fixed job control bug, improved choice of + and - jobs
[unix-history] / usr / src / bin / csh / hist.c
CommitLineData
91a455c6
BJ
1static char *sccsid = "@(#)hist.c 4.1 %G%";
2
3#include "sh.h"
4
5/*
6 * C shell
7 */
8
9savehist(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
38struct Hist *
39enthist(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
61hfree(hp)
62 register struct Hist *hp;
63{
64
65 freelex(&hp->Hlex);
66 xfree((char *)hp);
67}
68
69dohist(vp)
70 char **vp;
71{
72 int n, rflg = 0;
73
74 if (getn(value("history")) == 0)
75 return;
76 if (setintr)
77 sigrelse(SIGINT);
78 vp++;
79 if (*vp && eq(*vp, "-r")) {
80 rflg++;
81 vp++;
82 }
83 if (*vp)
84 n = getn(*vp);
85 else
86 n = 1000;
87 dohist1(Histlist.Hnext, &n, rflg);
88}
89
90dohist1(hp, np, rflg)
91 struct Hist *hp;
92 int *np;
93{
94 bool print = (*np) > 0;
95top:
96 if (hp == 0)
97 return;
98 (*np)--;
99 hp->Href++;
100 if (rflg == 0) {
101 dohist1(hp->Hnext, np, rflg);
102 if (print)
103 phist(hp);
104 return;
105 }
106 if (*np >= 0)
107 phist(hp);
108 hp = hp->Hnext;
109 goto top;
110}
111
112phist(hp)
113 register struct Hist *hp;
114{
115
116 printf("%6d\t", hp->Hnum);
117 prlex(&hp->Hlex);
118}