Home | History | Annotate | Download | only in csh
      1 /*
      2  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
      3  * Use is subject to license terms.
      4  */
      5 
      6 /*	Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T	*/
      7 /*	  All Rights Reserved  	*/
      8 
      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.
     13  */
     14 
     15 #pragma ident	"%Z%%M%	%I%	%E% SMI"
     16 
     17 #include "sh.h"
     18 #include "sh.tconst.h"
     19 
     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);
     24 
     25 /*
     26  * C shell
     27  */
     28 
     29 void
     30 savehist(struct wordent *sp)
     31 {
     32 	struct Hist *hp, *np;
     33 	int histlen = 0;
     34 	tchar *cp;
     35 
     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;
     45 
     46 		while (*p) {
     47 			if (!digit(*p)) {
     48 				histlen = 0;
     49 				break;
     50 			}
     51 			histlen = histlen * 10 + *p++ - '0';
     52 		}
     53 	}
     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);
     60 }
     61 
     62 struct Hist *
     63 enthist(int event, struct wordent *lp, bool docopy)
     64 {
     65 	struct Hist *np;
     66 
     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;
     79 	}
     80 	np->Hnext = Histlist.Hnext;
     81 	Histlist.Hnext = np;
     82 	return (np);
     83 }
     84 
     85 void
     86 hfree(struct Hist *hp)
     87 {
     88 #ifdef TRACE
     89 	tprintf("TRACE- hfree()\n");
     90 #endif
     91 
     92 	freelex(&hp->Hlex);
     93 	xfree( (tchar *)hp);
     94 }
     95 
     96 void
     97 dohist(tchar **vp)
     98 {
     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;
    109 
    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]");
    123 			}
    124 	}
    125 	if (*vp)
    126 		n = getn(*vp);
    127 	else {
    128 		n = getn(value(S_history /*"history"*/));
    129 	}
    130 	dohist1(Histlist.Hnext, &n, rflg, hflg);
    131 }
    132 
    133 void
    134 dohist1(struct Hist *hp, int *np, int rflg, int hflg)
    135 {
    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;
    150 	}
    151 	if (*np >= 0)
    152 		phist(hp, hflg);
    153 	hp = hp->Hnext;
    154 	goto top;
    155 }
    156 
    157 void
    158 phist(struct Hist *hp, int hflg)
    159 {
    160 #ifdef TRACE
    161 	tprintf("TRACE- phist()\n");
    162 #endif
    163 
    164 	if (hflg == 0)
    165 		printf("%6d\t", hp->Hnum);
    166 	prlex(&hp->Hlex);
    167 }
    168