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