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