BSD 4_4_Lite2 release
[unix-history] / usr / src / bin / csh / hist.c
index 3cb60ca..673cf54 100644 (file)
-/*
- * Copyright (c) 1980 Regents of the University of California.
- * All rights reserved.  The Berkeley Software License Agreement
- * specifies the terms and conditions for redistribution.
+/*-
+ * Copyright (c) 1980, 1991, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char *sccsid = "@(#)hist.c      5.2 (Berkeley) %G%";
+static char sccsid[] = "@(#)hist.c     8.2 (Berkeley) 3/22/95";
+#endif /* not lint */
+
+#include <sys/types.h>
+#include <stdlib.h>
+#if __STDC__
+# include <stdarg.h>
+#else
+# include <varargs.h>
 #endif
 
 #endif
 
-#include "sh.h"
+#include "csh.h"
+#include "extern.h"
 
 
-/*
- * C shell
- */
+static void    hfree __P((struct Hist *));
+static void    dohist1 __P((struct Hist *, int *, int, int));
+static void    phist __P((struct Hist *, int));
 
 
+void
 savehist(sp)
 savehist(sp)
-       struct wordent *sp;
+    struct wordent *sp;
 {
 {
-       register struct Hist *hp, *np;
-       register int histlen = 0;
-       char *cp;
-
-       /* throw away null lines */
-       if (sp->next->word[0] == '\n')
-               return;
-       cp = value("history");
-       if (*cp) {
-               register char *p = cp;
-
-               while (*p) {
-                       if (!digit(*p)) {
-                               histlen = 0;
-                               break;
-                       }
-                       histlen = histlen * 10 + *p++ - '0';
-               }
+    register struct Hist *hp, *np;
+    register int histlen = 0;
+    Char   *cp;
+
+    /* throw away null lines */
+    if (sp->next->word[0] == '\n')
+       return;
+    cp = value(STRhistory);
+    if (*cp) {
+       register Char *p = cp;
+
+       while (*p) {
+           if (!Isdigit(*p)) {
+               histlen = 0;
+               break;
+           }
+           histlen = histlen * 10 + *p++ - '0';
        }
        }
-       for (hp = &Histlist; np = hp->Hnext;)
-               if (eventno - np->Href >= histlen || histlen == 0)
-                       hp->Hnext = np->Hnext, hfree(np);
-               else
-                       hp = np;
-       (void) enthist(++eventno, sp, 1);
+    }
+    for (hp = &Histlist; (np = hp->Hnext) != NULL;)
+       if (eventno - np->Href >= histlen || histlen == 0)
+           hp->Hnext = np->Hnext, hfree(np);
+       else
+           hp = np;
+    (void) enthist(++eventno, sp, 1);
 }
 
 struct Hist *
 enthist(event, lp, docopy)
 }
 
 struct Hist *
 enthist(event, lp, docopy)
-       int event;
-       register struct wordent *lp;
-       bool docopy;
+    int     event;
+    register struct wordent *lp;
+    bool    docopy;
 {
 {
-       register struct Hist *np;
-
-       np = (struct Hist *) xalloc(sizeof *np);
-       np->Hnum = np->Href = event;
-       if (docopy)
-               copylex(&np->Hlex, lp);
-       else {
-               np->Hlex.next = lp->next;
-               lp->next->prev = &np->Hlex;
-               np->Hlex.prev = lp->prev;
-               lp->prev->next = &np->Hlex;
-       }
-       np->Hnext = Histlist.Hnext;
-       Histlist.Hnext = np;
-       return (np);
+    register struct Hist *np;
+
+    np = (struct Hist *) xmalloc((size_t) sizeof(*np));
+    np->Hnum = np->Href = event;
+    if (docopy) {
+       copylex(&np->Hlex, lp);
+    }
+    else {
+       np->Hlex.next = lp->next;
+       lp->next->prev = &np->Hlex;
+       np->Hlex.prev = lp->prev;
+       lp->prev->next = &np->Hlex;
+    }
+    np->Hnext = Histlist.Hnext;
+    Histlist.Hnext = np;
+    return (np);
 }
 
 }
 
+static void
 hfree(hp)
 hfree(hp)
-       register struct Hist *hp;
+    register struct Hist *hp;
 {
 
 {
 
-       freelex(&hp->Hlex);
-       xfree((char *)hp);
+    freelex(&hp->Hlex);
+    xfree((ptr_t) hp);
 }
 
 }
 
-dohist(vp)
-       char **vp;
+void
+/*ARGSUSED*/
+dohist(v, t)
+    Char **v;
+    struct command *t;
 {
 {
-       int n, rflg = 0, hflg = 0;
-       if (getn(value("history")) == 0)
-               return;
-       if (setintr)
-               (void) sigsetmask(sigblock(0) & ~sigmask(SIGINT));
-       while (*++vp && **vp == '-') {
-               char *vp2 = *vp;
-               while (*++vp2)
-                       switch (*vp2) {
-                       case 'h':
-                               hflg++;
-                               break;
-                       case 'r':
-                               rflg++;
-                               break;
-                       case '-':       /* ignore multiple '-'s */
-                               break;
-                       default:
-                               printf("Unknown flag: -%c\n", *vp2);
-                               error("Usage: history [-rh] [# number of events]");
-                       }
-       }
-       if (*vp)
-               n = getn(*vp);
-       else {
-               n = getn(value("history"));
-       }
-       dohist1(Histlist.Hnext, &n, rflg, hflg);
+    int     n, rflg = 0, hflg = 0;
+    sigset_t sigset;
+
+    if (getn(value(STRhistory)) == 0)
+       return;
+    if (setintr) {
+       sigemptyset(&sigset);
+       sigaddset(&sigset, SIGINT);
+       sigprocmask(SIG_UNBLOCK, &sigset, NULL);
+    }
+    while (*++v && **v == '-') {
+       Char   *vp = *v;
+
+       while (*++vp)
+           switch (*vp) {
+           case 'h':
+               hflg++;
+               break;
+           case 'r':
+               rflg++;
+               break;
+           case '-':           /* ignore multiple '-'s */
+               break;
+           default:
+               stderror(ERR_HISTUS);
+               break;
+           }
+    }
+    if (*v)
+       n = getn(*v);
+    else {
+       n = getn(value(STRhistory));
+    }
+    dohist1(Histlist.Hnext, &n, rflg, hflg);
 }
 
 }
 
+static void
 dohist1(hp, np, rflg, hflg)
 dohist1(hp, np, rflg, hflg)
-       struct Hist *hp;
-       int *np, rflg, hflg;
+    struct Hist *hp;
+    int    *np, rflg, hflg;
 {
 {
-       bool print = (*np) > 0;
-top:
-       if (hp == 0)
-               return;
+    bool    print = (*np) > 0;
+
+    for (; hp != 0; hp = hp->Hnext) {
        (*np)--;
        hp->Href++;
        if (rflg == 0) {
        (*np)--;
        hp->Href++;
        if (rflg == 0) {
-               dohist1(hp->Hnext, np, rflg, hflg);
-               if (print)
-                       phist(hp, hflg);
-               return;
+           dohist1(hp->Hnext, np, rflg, hflg);
+           if (print)
+               phist(hp, hflg);
+           return;
        }
        if (*np >= 0)
        }
        if (*np >= 0)
-               phist(hp, hflg);
-       hp = hp->Hnext;
-       goto top;
+           phist(hp, hflg);
+    }
 }
 
 }
 
+static void
 phist(hp, hflg)
 phist(hp, hflg)
-       register struct Hist *hp;
-       int hflg;
+    register struct Hist *hp;
+    int     hflg;
 {
 {
-
-       if (hflg == 0)
-               printf("%6d\t", hp->Hnum);
-       prlex(&hp->Hlex);
+    if (hflg == 0)
+       (void) fprintf(cshout, "%6d\t", hp->Hnum);
+    prlex(cshout, &hp->Hlex);
 }
 }