BSD 4 release
[unix-history] / usr / src / cmd / csh / sh.lex.c
index 4b39f04..70f17e5 100644 (file)
@@ -1,4 +1,5 @@
-/* Copyright (c) 1979 Regents of the University of California */
+static char *sccsid = "@(#)sh.lex.c 4.1 10/9/80";
+
 #include "sh.h"
 
 /*
 #include "sh.h"
 
 /*
@@ -63,7 +64,7 @@ lex(hp)
        do
                c = readc(0);
        while (c == ' ' || c == '\t');
        do
                c = readc(0);
        while (c == ' ' || c == '\t');
-       if (c == '^' && intty)
+       if (c == HISTSUB && intty)
                /* ^lef^rit     from tty is short !:s^lef^rit */
                getexcl(c);
        else
                /* ^lef^rit     from tty is short !:s^lef^rit */
                getexcl(c);
        else
@@ -131,7 +132,7 @@ freelex(vp)
                fp = vp->next;
                vp->next = fp->next;
                xfree(fp->word);
                fp = vp->next;
                vp->next = fp->next;
                xfree(fp->word);
-               xfree(fp);
+               xfree((char *)fp);
        }
        vp->prev = vp;
 }
        }
        vp->prev = vp;
 }
@@ -173,7 +174,7 @@ loop:
                        }
                        if (c == '\\') {
                                c = getC(0);
                        }
                        if (c == '\\') {
                                c = getC(0);
-                               if (c == '!')
+                               if (c == HIST)
                                        c |= QUOTE;
                                else {
                                        if (c == '\n' && c1 != '`')
                                        c |= QUOTE;
                                else {
                                        if (c == '\n' && c1 != '`')
@@ -231,7 +232,7 @@ casebksl:
                                onelflg = 2;
                        goto loop;
                }
                                onelflg = 2;
                        goto loop;
                }
-               if (c != '!')
+               if (c != HIST)
                        *wp++ = '\\', --i;
                c |= QUOTE;
                break;
                        *wp++ = '\\', --i;
                c |= QUOTE;
                break;
@@ -247,7 +248,7 @@ pack:
                                        onelflg = 2;
                                goto ret;
                        }
                                        onelflg = 2;
                                goto ret;
                        }
-                       if (c != '!')
+                       if (c != HIST)
                                *wp++ = '\\', --i;
                        c |= QUOTE;
                }
                                *wp++ = '\\', --i;
                        c |= QUOTE;
                }
@@ -317,7 +318,7 @@ top:
                getdol();
                goto top;
        }
                getdol();
                goto top;
        }
-       if (c == '!' && (flag & DOEXCL)) {
+       if (c == HIST && (flag & DOEXCL)) {
                getexcl(0);
                goto top;
        }
                getexcl(0);
                goto top;
        }
@@ -346,6 +347,7 @@ getdol()
        *np++ = c;
        switch (c) {
        
        *np++ = c;
        switch (c) {
        
+       case '<':
        case '$':
                if (special)
                        goto vsyn;
        case '$':
                if (special)
                        goto vsyn;
@@ -400,7 +402,7 @@ getdol()
                if (c == 'g')
                        *np++ = c, c = getC(DOEXCL);
                *np++ = c;
                if (c == 'g')
                        *np++ = c, c = getC(DOEXCL);
                *np++ = c;
-               if (!any(c, "htrqx"))
+               if (!any(c, "htrqxe"))
                        goto vsyn;
        } else
                ungetD(c);
                        goto vsyn;
        } else
                ungetD(c);
@@ -427,7 +429,7 @@ addla(cp)
 {
        char buf[BUFSIZ];
 
 {
        char buf[BUFSIZ];
 
-       if (lap != 0 && strlen(cp) + strlen(lap) >= BUFSIZ - 4) {
+       if (lap != 0 && strlen(cp) + strlen(lap) >= sizeof (labuf) - 4) {
                seterr("Expansion buf ovflo");
                return;
        }
                seterr("Expansion buf ovflo");
                return;
        }
@@ -472,8 +474,8 @@ getexcl(sc)
                for (ip = hp->next->next; ip != hp->prev; ip = ip->next)
                        dol++;
        left = 0, right = dol;
                for (ip = hp->next->next; ip != hp->prev; ip = ip->next)
                        dol++;
        left = 0, right = dol;
-       if (sc == '^') {
-               ungetC('s'), unreadc('^'), c = ':';
+       if (sc == HISTSUB) {
+               ungetC('s'), unreadc(HISTSUB), c = ':';
                goto subst;
        }
        c = getC(0);
                goto subst;
        }
        c = getC(0);
@@ -504,7 +506,7 @@ subst:
        exclc = right - left + 1;
        while (--left >= 0)
                hp = hp->next;
        exclc = right - left + 1;
        while (--left >= 0)
                hp = hp->next;
-       if (sc == '^' || c == ':') {
+       if (sc == HISTSUB || c == ':') {
                do {
                        hp = getsub(hp);
                        c = getC(0);
                do {
                        hp = getsub(hp);
                        c = getC(0);
@@ -548,6 +550,7 @@ getsub(en)
        case 'h':
        case 'r':
        case 't':
        case 'h':
        case 'r':
        case 't':
+       case 'e':
                break;
 
        case '&':
                break;
 
        case '&':
@@ -595,7 +598,7 @@ bads:
                if (cp != lhsb)
                        *cp++ = 0;
                else if (lhsb[0] == 0) {
                if (cp != lhsb)
                        *cp++ = 0;
                else if (lhsb[0] == 0) {
-badlhs:
+/*badlhs:*/
                        seterr("No prev lhs");
                        goto ret;
                }
                        seterr("No prev lhs");
                        goto ret;
                }
@@ -613,12 +616,13 @@ badlhs:
                        if (c == '~') {
                                if (&cp[strlen(orhsb)] > &rhsb[sizeof rhsb - 2])
                                        goto toorhs;
                        if (c == '~') {
                                if (&cp[strlen(orhsb)] > &rhsb[sizeof rhsb - 2])
                                        goto toorhs;
-                               cp = strend(strcpy(cp, orhsb));
+                               strcpy(cp, orhsb);
+                               cp = strend(cp);
                                continue;
                        }
 */
                        if (cp > &rhsb[sizeof rhsb - 2]) {
                                continue;
                        }
 */
                        if (cp > &rhsb[sizeof rhsb - 2]) {
-toorhs:
+/*toorhs:*/
                                seterr("Rhs too long");
                                goto ret;
                        }
                                seterr("Rhs too long");
                                goto ret;
                        }
@@ -763,7 +767,7 @@ domod(cp, type)
 
        case 'h':
        case 't':
 
        case 'h':
        case 't':
-               if (!any('/', cp))
+               if (!any('/', cp))      /* what if :h :t are both the same? */
                        return (0);
                wp = strend(cp);
                while (*--wp != '/')
                        return (0);
                wp = strend(cp);
                while (*--wp != '/')
@@ -775,14 +779,18 @@ take:
                        xp = savestr(wp + 1);
                return (xp);
 
                        xp = savestr(wp + 1);
                return (xp);
 
+       case 'e':
        case 'r':
                wp = strend(cp);
        case 'r':
                wp = strend(cp);
-               for (wp--; wp >= cp && *wp != '.'; wp--)
-                       if (*wp == '/')
-                               return (0);
-               if (wp < cp)
-                       return (0);
-               goto take;
+               for (wp--; wp >= cp && *wp != '/'; wp--)
+                       if (*wp == '.') {
+                               if (type == 'e')
+                                       xp = savestr(wp + 1);
+                               else
+                                       xp = savestr(cp), xp[wp - cp] = 0;
+                               return (xp);
+                       }
+               return (savestr(type == 'e' ? "" : cp));
        }
        return (0);
 }
        }
        return (0);
 }
@@ -877,6 +885,7 @@ bad:
                return (0);
        }
        return (1);
                return (0);
        }
        return (1);
+
 }
 
 struct wordent *
 }
 
 struct wordent *
@@ -889,7 +898,13 @@ gethent(sc)
        int event;
        bool back = 0;
 
        int event;
        bool back = 0;
 
-       c = sc == '^' ? '!' : getC(0);
+       c = sc == HISTSUB ? HIST : getC(0);
+       if (c == HIST) {
+               if (alhistp)
+                       return (alhistp);
+               event = eventno;
+               goto skip;
+       }
        switch (c) {
 
        case ':':
        switch (c) {
 
        case ':':
@@ -903,19 +918,18 @@ gethent(sc)
                event = lastev;
                break;
 
                event = lastev;
                break;
 
-       case '!':
-               event = eventno;
-               break;
-
        case '-':
                back = 1;
                c = getC(0);
                goto number;
 
        case '-':
                back = 1;
                c = getC(0);
                goto number;
 
+       case '#':                       /* !# is command being typed in (mrh) */
+               return(&paraml);
+
        default:
        default:
-               if (any(c, "(=")) {
+               if (any(c, "(=~")) {
                        unreadc(c);
                        unreadc(c);
-                       ungetC('!');
+                       ungetC(HIST);
                        return (0);
                }
                if (digit(c))
                        return (0);
                }
                if (digit(c))
@@ -928,7 +942,7 @@ gethent(sc)
                }
                unreadc(c);
                if (np == lhsb) {
                }
                unreadc(c);
                if (np == lhsb) {
-                       ungetC('!');
+                       ungetC(HIST);
                        return (0);
                }
                *np++ = 0;
                        return (0);
                }
                *np++ = 0;
@@ -973,6 +987,7 @@ gethent(sc)
                unreadc(c);
                break;
        }
                unreadc(c);
                break;
        }
+skip:
        for (hp = Histlist.Hnext; hp; hp = hp->Hnext)
                if (hp->Hnum == event) {
                        hp->Href = eventno;
        for (hp = Histlist.Hnext; hp; hp = hp->Hnext)
                if (hp->Hnum == event) {
                        hp->Href = eventno;
@@ -1013,7 +1028,7 @@ matchev(hp, cp, anyarg)
        register char *dp;
        struct wordent *lp = &hp->Hlex;
        int argno = 0;
        register char *dp;
        struct wordent *lp = &hp->Hlex;
        int argno = 0;
-       
+
        for (;;) {
                lp = lp->next;
                if (lp->word[0] == '\n')
        for (;;) {
                lp = lp->next;
                if (lp->word[0] == '\n')
@@ -1051,6 +1066,7 @@ readc(wanteof)
        bool wanteof;
 {
        register int c;
        bool wanteof;
 {
        register int c;
+       static sincereal;
 
        if (c = peekread) {
                peekread = 0;
 
        if (c = peekread) {
                peekread = 0;
@@ -1073,6 +1089,27 @@ top:
                /* Infinite source! */
                return ('\n');
        }
                /* Infinite source! */
                return ('\n');
        }
+       if (evalp) {
+               if (c = *evalp++)
+                       return (c);
+               if (*evalvec) {
+                       evalp = *evalvec++;
+                       return (' ');
+               }
+               evalp = 0;
+       }
+       if (evalvec) {
+               if (evalvec == (char **)1) {
+                       doneinp = 1;
+                       reset();
+               }
+               if (evalp = *evalvec) {
+                       evalvec++;
+                       goto top;
+               }
+               evalvec = (char **)1;
+               return ('\n');
+       }
        do {
                if (arginp == (char *) 1 || onelflg == 1) {
                        if (wanteof)
        do {
                if (arginp == (char *) 1 || onelflg == 1) {
                        if (wanteof)
@@ -1086,6 +1123,7 @@ top:
                        }
                        return (c);
                }
                        }
                        return (c);
                }
+reread:
                c = bgetc();
                if (c < 0) {
 #include <sgtty.h>
                c = bgetc();
                if (c < 0) {
 #include <sgtty.h>
@@ -1094,16 +1132,34 @@ top:
                        if (wanteof)
                                return (-1);
                        /* was isatty but raw with ignoreeof yields problems */
                        if (wanteof)
                                return (-1);
                        /* was isatty but raw with ignoreeof yields problems */
-                       if (adrof("ignoreeof") && gtty(SHIN, &tty)==0 && (tty.sg_flags & RAW) == 0) {
-                               if (loginsh)
-                                       printf("\nUse \"logout\" to logout.\n");
-                               else
-                                       printf("\nUse \"exit\" to leave csh.\n");
-                               reset();
+                       if (ioctl(SHIN, TIOCGETP, &tty)==0 && (tty.sg_flags & RAW) == 0) {
+                               short ctpgrp;
+
+                               if (++sincereal > 25)
+                                       goto oops;
+                               if (tpgrp != -1 &&
+                                   ioctl(FSHTTY, TIOCGPGRP, &ctpgrp) == 0 &&
+                                   tpgrp != ctpgrp) {
+                                       ioctl(FSHTTY, TIOCSPGRP, &tpgrp);
+                                       killpg(ctpgrp, SIGHUP);
+printf("Reset tty pgrp from %d to %d\n", ctpgrp, tpgrp);
+                                       goto reread;
+                               }
+                               if (adrof("ignoreeof")) {
+                                       if (loginsh)
+                                               printf("\nUse \"logout\" to logout.\n");
+                                       else
+                                               printf("\nUse \"exit\" to leave csh.\n");
+                                       reset();
+                               }
+                               if (chkstop == 0)
+                                       panystop(1);
                        }
                        }
+oops:
                        doneinp = 1;
                        reset();
                }
                        doneinp = 1;
                        reset();
                }
+               sincereal = 0;
                if (c == '\n' && onelflg)
                        onelflg--;
        } while (c == 0);
                if (c == '\n' && onelflg)
                        onelflg--;
        } while (c == 0);
@@ -1141,7 +1197,7 @@ again:
 
                if (fbuf) {
                        blkcpy(nfbuf, fbuf);
 
                if (fbuf) {
                        blkcpy(nfbuf, fbuf);
-                       xfree(fbuf);
+                       xfree((char *)fbuf);
                }
                fbuf = nfbuf;
                fbuf[fblocks] = calloc(BUFSIZ, sizeof (char));
                }
                fbuf = nfbuf;
                fbuf[fblocks] = calloc(BUFSIZ, sizeof (char));