dmake: do not set MAKEFLAGS=k
[unleashed/tickless.git] / usr / src / cmd / csh / sh.hist.c
blobfb8b5e06ce6a470b3bf5714cca50ea6fd0d62385
1 /*
2 * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
3 * Use is subject to license terms.
4 */
6 /* Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */
7 /* All Rights Reserved */
9 /*
10 * Copyright (c) 1980 Regents of the University of California.
11 * All rights reserved. The Berkeley Software License Agreement
12 * specifies the terms and conditions for redistribution.
15 #pragma ident "%Z%%M% %I% %E% SMI"
17 #include "sh.h"
18 #include "sh.tconst.h"
20 struct Hist *enthist(int, struct wordent *, bool);
21 void hfree(struct Hist *);
22 void dohist1(struct Hist *, int *, int, int);
23 void phist(struct Hist *, int);
26 * C shell
29 void
30 savehist(struct wordent *sp)
32 struct Hist *hp, *np;
33 int histlen = 0;
34 tchar *cp;
36 #ifdef TRACE
37 tprintf("TRACE- savehist()\n");
38 #endif
39 /* throw away null lines */
40 if (sp->next->word[0] == '\n')
41 return;
42 cp = value(S_history /*"history"*/);
43 if (*cp) {
44 tchar *p = cp;
46 while (*p) {
47 if (!digit(*p)) {
48 histlen = 0;
49 break;
51 histlen = histlen * 10 + *p++ - '0';
54 for (hp = &Histlist; np = hp->Hnext;)
55 if (eventno - np->Href >= histlen || histlen == 0)
56 hp->Hnext = np->Hnext, hfree(np);
57 else
58 hp = np;
59 (void) enthist(++eventno, sp, 1);
62 struct Hist *
63 enthist(int event, struct wordent *lp, bool docopy)
65 struct Hist *np;
67 #ifdef TRACE
68 tprintf("TRACE- enthist()\n");
69 #endif
70 np = (struct Hist *) xalloc(sizeof *np);
71 np->Hnum = np->Href = event;
72 if (docopy)
73 copylex(&np->Hlex, lp);
74 else {
75 np->Hlex.next = lp->next;
76 lp->next->prev = &np->Hlex;
77 np->Hlex.prev = lp->prev;
78 lp->prev->next = &np->Hlex;
80 np->Hnext = Histlist.Hnext;
81 Histlist.Hnext = np;
82 return (np);
85 void
86 hfree(struct Hist *hp)
88 #ifdef TRACE
89 tprintf("TRACE- hfree()\n");
90 #endif
92 freelex(&hp->Hlex);
93 xfree( (tchar *)hp);
96 void
97 dohist(tchar **vp)
99 int n, rflg = 0, hflg = 0;
100 #ifdef TRACE
101 tprintf("TRACE- dohist()\n");
102 #endif
103 if (getn(value(S_history /*"history"*/)) == 0)
104 return;
105 if (setintr)
106 (void) sigsetmask(sigblock(0) & ~sigmask(SIGINT));
107 while (*++vp && **vp == '-') {
108 tchar *vp2 = *vp;
110 while (*++vp2)
111 switch (*vp2) {
112 case 'h':
113 hflg++;
114 break;
115 case 'r':
116 rflg++;
117 break;
118 case '-': /* ignore multiple '-'s */
119 break;
120 default:
121 printf("Unknown flag: -%c\n", *vp2);
122 error("Usage: history [-rh] [# number of events]");
125 if (*vp)
126 n = getn(*vp);
127 else {
128 n = getn(value(S_history /*"history"*/));
130 dohist1(Histlist.Hnext, &n, rflg, hflg);
133 void
134 dohist1(struct Hist *hp, int *np, int rflg, int hflg)
136 bool print = (*np) > 0;
137 #ifdef TRACE
138 tprintf("TRACE- dohist1()\n");
139 #endif
140 top:
141 if (hp == 0)
142 return;
143 (*np)--;
144 hp->Href++;
145 if (rflg == 0) {
146 dohist1(hp->Hnext, np, rflg, hflg);
147 if (print)
148 phist(hp, hflg);
149 return;
151 if (*np >= 0)
152 phist(hp, hflg);
153 hp = hp->Hnext;
154 goto top;
157 void
158 phist(struct Hist *hp, int hflg)
160 #ifdef TRACE
161 tprintf("TRACE- phist()\n");
162 #endif
164 if (hflg == 0)
165 printf("%6d\t", hp->Hnum);
166 prlex(&hp->Hlex);