BSD 3 development
[unix-history] / usr / src / cmd / csh / sh.hist.c
CommitLineData
0a02ab26
BJ
1/* Copyright (c) 1979 Regents of the University of California */
2#include "sh.h"
3
4/*
5 * C shell
6 */
7
8savehist(sp)
9 struct wordent *sp;
10{
11 register struct Hist *hp, *np;
12 int histlen;
13 register char *cp;
14
15 cp = value("history");
16 if (*cp == 0)
17 histlen = 0;
18 else {
19 while (*cp && digit(*cp))
20 cp++;
21 /* avoid a looping snafu */
22 if (*cp)
23 set("history", "10");
24 histlen = getn(value("history"));
25 }
26 /* throw away null lines */
27 if (sp->next->word[0] == '\n')
28 return;
29 for (hp = &Histlist; np = hp->Hnext;)
30 if (eventno - np->Href >= histlen || histlen == 0)
31 hp->Hnext = np->Hnext, hfree(np);
32 else
33 hp = np;
34 enthist(++eventno, sp, 1);
35}
36
37struct Hist *
38enthist(event, lp, docopy)
39 int event;
40 register struct wordent *lp;
41 bool docopy;
42{
43 register struct Hist *np;
44
45 np = (struct Hist *) calloc(1, sizeof *np);
46 np->Hnum = np->Href = event;
47 if (docopy)
48 copylex(&np->Hlex, lp);
49 else {
50 np->Hlex.next = lp->next;
51 lp->next->prev = &np->Hlex;
52 np->Hlex.prev = lp->prev;
53 lp->prev->next = &np->Hlex;
54 }
55 np->Hnext = Histlist.Hnext;
56 Histlist.Hnext = np;
57 return (np);
58}
59
60hfree(hp)
61 register struct Hist *hp;
62{
63
64 freelex(&hp->Hlex);
65 xfree(hp);
66}
67
68dohist()
69{
70
71 if (getn(value("history")) == 0)
72 return;
73 dohist1(Histlist.Hnext);
74}
75
76dohist1(hp)
77 register struct Hist *hp;
78{
79
80 if (hp == 0)
81 return;
82 hp->Href++;
83 dohist1(hp->Hnext);
84 phist(hp);
85}
86
87phist(hp)
88 register struct Hist *hp;
89{
90
91 printf("%6d\t", hp->Hnum);
92 prlex(&hp->Hlex);
93}