added sccs, Bill put in more buffers
[unix-history] / usr / src / usr.bin / ex / ex_voper.c
index f65d7b2..63bf53c 100644 (file)
@@ -27,6 +27,7 @@ operate(c, cnt)
        bool subop = 0;
        char *oglobp, *ocurs;
        register line *addr;
        bool subop = 0;
        char *oglobp, *ocurs;
        register line *addr;
+       line *odot;
        static char lastFKND, lastFCHR;
        char d;
 
        static char lastFKND, lastFCHR;
        char d;
 
@@ -105,11 +106,13 @@ operate(c, cnt)
         */
        case 'r':
                vrep(cnt);
         */
        case 'r':
                vrep(cnt);
+               vmacchng(1);
                return;
 
        default:
                goto nocount;
        }
                return;
 
        default:
                goto nocount;
        }
+       vmacchng(1);
        /*
         * Had an operator, so accept another count.
         * Multiply counts together.
        /*
         * Had an operator, so accept another count.
         * Multiply counts together.
@@ -259,7 +262,7 @@ ein:
        case ',':
                forbid (lastFKND == 0);
                c = isupper(lastFKND) ? tolower(lastFKND) : toupper(lastFKND);
        case ',':
                forbid (lastFKND == 0);
                c = isupper(lastFKND) ? tolower(lastFKND) : toupper(lastFKND);
-               ungetkey(lastFCHR);
+               i = lastFCHR;
                if (vglobp == 0)
                        vglobp = "";
                subop++;
                if (vglobp == 0)
                        vglobp = "";
                subop++;
@@ -279,7 +282,7 @@ ein:
        case ';':
                forbid (lastFKND == 0);
                c = lastFKND;
        case ';':
                forbid (lastFKND == 0);
                c = lastFKND;
-               ungetkey(lastFCHR);
+               i = lastFCHR;
                subop++;
                goto nocount;
 
                subop++;
                goto nocount;
 
@@ -298,11 +301,12 @@ ein:
         */
        case 'f':       /* find */
        case 't':
         */
        case 'f':       /* find */
        case 't':
-               i = getesc();
-               if (i == 0)
-                       return;
-               if (!subop)
+               if (!subop) {
+                       i = getesc();
+                       if (i == 0)
+                               return;
                        *lastcp++ = i;
                        *lastcp++ = i;
+               }
                if (vglobp == 0)
                        lastFKND = c, lastFCHR = i;
                for (; cnt > 0; cnt--)
                if (vglobp == 0)
                        lastFKND = c, lastFCHR = i;
                for (; cnt > 0; cnt--)
@@ -411,6 +415,7 @@ deleteit:
        case 'x':
                if (margin())
                        goto errlab;
        case 'x':
                if (margin())
                        goto errlab;
+               vmacchng(1);
                while (cnt > 0 && !margin())
                        wcursor += dir, cnt--;
                opf = deleteop;
                while (cnt > 0 && !margin())
                        wcursor += dir, cnt--;
                opf = deleteop;
@@ -597,13 +602,17 @@ errlab:
                        vsetsiz(Xcnt);
                vsave();
                ocurs = cursor;
                        vsetsiz(Xcnt);
                vsave();
                ocurs = cursor;
+               odot = dot;
                wcursor = 0;
                if (readecho(c))
                        return;
                if (!vglobp)
                        vscandir[0] = genbuf[0];
                oglobp = globp; CP(vutmp, genbuf); globp = vutmp;
                wcursor = 0;
                if (readecho(c))
                        return;
                if (!vglobp)
                        vscandir[0] = genbuf[0];
                oglobp = globp; CP(vutmp, genbuf); globp = vutmp;
-               d = peekc; ungetchar(0); fixech();
+               d = peekc;
+fromsemi:
+               ungetchar(0);
+               fixech();
                CATCH
 #ifndef CBREAK
                        /*
                CATCH
 #ifndef CBREAK
                        /*
@@ -619,7 +628,10 @@ errlab:
 #ifndef CBREAK
                        vraw();
 #endif
 #ifndef CBREAK
                        vraw();
 #endif
+slerr:
                        globp = oglobp;
                        globp = oglobp;
+                       dot = odot;
+                       cursor = ocurs;
                        ungetchar(d);
                        splitw = 0;
                        vclean();
                        ungetchar(d);
                        splitw = 0;
                        vclean();
@@ -630,6 +642,14 @@ errlab:
                        globp = "";
                else if (peekc)
                        --globp;
                        globp = "";
                else if (peekc)
                        --globp;
+               if (*globp == ';') {
+                       /* /foo/;/bar/ */
+                       globp++;
+                       dot = addr;
+                       cursor = loc1;
+                       goto fromsemi;
+               }
+               dot = odot;
                ungetchar(d);
                c = 0;
                if (*globp == 'z')
                ungetchar(d);
                c = 0;
                if (*globp == 'z')
@@ -639,8 +659,13 @@ errlab:
                i = 0;
                while (isdigit(*globp))
                        i = i * 10 + *globp++ - '0';
                i = 0;
                while (isdigit(*globp))
                        i = i * 10 + *globp++ - '0';
-               if (*globp)
+               if (any(*globp, "^+-."))
                        c = *globp++;
                        c = *globp++;
+               if (*globp) {
+                       /* random junk after the pattern */
+                       beep();
+                       goto slerr;
+               }
                globp = oglobp;
                splitw = 0;
                vmoving = 0;
                globp = oglobp;
                splitw = 0;
                vmoving = 0;