home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / bin / csh / hist.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-07-19  |  4.4 KB  |  185 lines

  1. /*-
  2.  * Copyright (c) 1980, 1991 The Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  *    This product includes software developed by the University of
  16.  *    California, Berkeley and its contributors.
  17.  * 4. Neither the name of the University nor the names of its contributors
  18.  *    may be used to endorse or promote products derived from this software
  19.  *    without specific prior written permission.
  20.  *
  21.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31.  * SUCH DAMAGE.
  32.  */
  33.  
  34. #ifndef lint
  35. static char sccsid[] = "@(#)hist.c    5.10 (Berkeley) 7/19/91";
  36. #endif /* not lint */
  37.  
  38. #include <sys/types.h>
  39. #include <stdlib.h>
  40. #if __STDC__
  41. # include <stdarg.h>
  42. #else
  43. # include <varargs.h>
  44. #endif
  45.  
  46. #include "csh.h"
  47. #include "extern.h"
  48.  
  49. static void    hfree __P((struct Hist *));
  50. static void    dohist1 __P((struct Hist *, int *, int, int));
  51. static void    phist __P((struct Hist *, int));
  52.  
  53. void
  54. savehist(sp)
  55.     struct wordent *sp;
  56. {
  57.     register struct Hist *hp, *np;
  58.     register int histlen = 0;
  59.     Char   *cp;
  60.  
  61.     /* throw away null lines */
  62.     if (sp->next->word[0] == '\n')
  63.     return;
  64.     cp = value(STRhistory);
  65.     if (*cp) {
  66.     register Char *p = cp;
  67.  
  68.     while (*p) {
  69.         if (!Isdigit(*p)) {
  70.         histlen = 0;
  71.         break;
  72.         }
  73.         histlen = histlen * 10 + *p++ - '0';
  74.     }
  75.     }
  76.     for (hp = &Histlist; np = hp->Hnext;)
  77.     if (eventno - np->Href >= histlen || histlen == 0)
  78.         hp->Hnext = np->Hnext, hfree(np);
  79.     else
  80.         hp = np;
  81.     (void) enthist(++eventno, sp, 1);
  82. }
  83.  
  84. struct Hist *
  85. enthist(event, lp, docopy)
  86.     int     event;
  87.     register struct wordent *lp;
  88.     bool    docopy;
  89. {
  90.     register struct Hist *np;
  91.  
  92.     np = (struct Hist *) xmalloc((size_t) sizeof(*np));
  93.     np->Hnum = np->Href = event;
  94.     if (docopy) {
  95.     copylex(&np->Hlex, lp);
  96.     }
  97.     else {
  98.     np->Hlex.next = lp->next;
  99.     lp->next->prev = &np->Hlex;
  100.     np->Hlex.prev = lp->prev;
  101.     lp->prev->next = &np->Hlex;
  102.     }
  103.     np->Hnext = Histlist.Hnext;
  104.     Histlist.Hnext = np;
  105.     return (np);
  106. }
  107.  
  108. static void
  109. hfree(hp)
  110.     register struct Hist *hp;
  111. {
  112.  
  113.     freelex(&hp->Hlex);
  114.     xfree((ptr_t) hp);
  115. }
  116.  
  117. void
  118. /*ARGSUSED*/
  119. dohist(v, t)
  120.     Char **v;
  121.     struct command *t;
  122. {
  123.     int     n, rflg = 0, hflg = 0;
  124.  
  125.     if (getn(value(STRhistory)) == 0)
  126.     return;
  127.     if (setintr)
  128.     (void) sigsetmask(sigblock((sigset_t) 0) & ~sigmask(SIGINT));
  129.     while (*++v && **v == '-') {
  130.     Char   *vp = *v;
  131.  
  132.     while (*++vp)
  133.         switch (*vp) {
  134.         case 'h':
  135.         hflg++;
  136.         break;
  137.         case 'r':
  138.         rflg++;
  139.         break;
  140.         case '-':        /* ignore multiple '-'s */
  141.         break;
  142.         default:
  143.         stderror(ERR_HISTUS);
  144.         break;
  145.         }
  146.     }
  147.     if (*v)
  148.     n = getn(*v);
  149.     else {
  150.     n = getn(value(STRhistory));
  151.     }
  152.     dohist1(Histlist.Hnext, &n, rflg, hflg);
  153. }
  154.  
  155. static void
  156. dohist1(hp, np, rflg, hflg)
  157.     struct Hist *hp;
  158.     int    *np, rflg, hflg;
  159. {
  160.     bool    print = (*np) > 0;
  161.  
  162.     for (; hp != 0; hp = hp->Hnext) {
  163.     (*np)--;
  164.     hp->Href++;
  165.     if (rflg == 0) {
  166.         dohist1(hp->Hnext, np, rflg, hflg);
  167.         if (print)
  168.         phist(hp, hflg);
  169.         return;
  170.     }
  171.     if (*np >= 0)
  172.         phist(hp, hflg);
  173.     }
  174. }
  175.  
  176. static void
  177. phist(hp, hflg)
  178.     register struct Hist *hp;
  179.     int     hflg;
  180. {
  181.     if (hflg == 0)
  182.     (void) fprintf(cshout, "%6d\t", hp->Hnum);
  183.     prlex(cshout, &hp->Hlex);
  184. }
  185.