add icmp statistics printing
[unix-history] / usr / src / usr.bin / ex / ex_vops2.c
index cfffc8d..b4a877b 100644 (file)
@@ -1,4 +1,5 @@
-/* Copyright (c) 1979 Regents of the University of California */
+/* Copyright (c) 1981 Regents of the University of California */
+static char *sccsid = "@(#)ex_vops2.c  6.5 %G%";
 #include "ex.h"
 #include "ex_tty.h"
 #include "ex_vis.h"
 #include "ex.h"
 #include "ex_tty.h"
 #include "ex_vis.h"
@@ -8,8 +9,8 @@
  * and mostly, insert mode (and a subroutine
  * to read an input line, including in the echo area.)
  */
  * and mostly, insert mode (and a subroutine
  * to read an input line, including in the echo area.)
  */
-char   *vUA1, *vUA2;
-char   *vUD1, *vUD2;
+extern char    *vUA1, *vUA2;           /* mjm: extern; also in ex_vops.c */
+extern char    *vUD1, *vUD2;           /* mjm: extern; also in ex_vops.c */
 
 /*
  * Obleeperate characters in hardcopy
 
 /*
  * Obleeperate characters in hardcopy
@@ -103,13 +104,13 @@ bool      gobbled;
 char   *ogcursor;
 
 vappend(ch, cnt, indent)
 char   *ogcursor;
 
 vappend(ch, cnt, indent)
-       char ch;
+       int ch;         /* mjm: char --> int */
        int cnt, indent;
 {
        register int i;
        register char *gcursor;
        bool escape;
        int cnt, indent;
 {
        register int i;
        register char *gcursor;
        bool escape;
-       int repcnt;
+       int repcnt, savedoomed;
        short oldhold = hold;
 
        /*
        short oldhold = hold;
 
        /*
@@ -211,7 +212,7 @@ vappend(ch, cnt, indent)
                if (ch == 'r' && repcnt == 0)
                        escape = 0;
                else {
                if (ch == 'r' && repcnt == 0)
                        escape = 0;
                else {
-                       gcursor = vgetline(repcnt, gcursor, &escape);
+                       gcursor = vgetline(repcnt, gcursor, &escape, ch);
 
                        /*
                         * After an append, stick information
 
                        /*
                         * After an append, stick information
@@ -276,6 +277,7 @@ vappend(ch, cnt, indent)
                 */
                if (state != HARDOPEN) {
                        DEPTH(vcline) = 0;
                 */
                if (state != HARDOPEN) {
                        DEPTH(vcline) = 0;
+                       savedoomed = doomed;
                        if (doomed > 0) {
                                register int cind = cindent();
 
                        if (doomed > 0) {
                                register int cind = cindent();
 
@@ -283,6 +285,12 @@ vappend(ch, cnt, indent)
                                doomed = 0;
                        }
                        i = vreopen(LINE(vcline), lineDOT(), vcline);
                                doomed = 0;
                        }
                        i = vreopen(LINE(vcline), lineDOT(), vcline);
+#ifdef TRACE
+                       if (trace)
+                               fprintf(trace, "restoring doomed from %d to %d\n", doomed, savedoomed);
+#endif
+                       if (ch == 'R')
+                               doomed = savedoomed;
                }
 
                /*
                }
 
                /*
@@ -395,17 +403,19 @@ back1()
  * are careful about the way we do this so that it is
  * repeatable.  (I.e. so that your kill doesn't happen,
  * when you repeat an insert if it was escaped with \ the
  * are careful about the way we do this so that it is
  * repeatable.  (I.e. so that your kill doesn't happen,
  * when you repeat an insert if it was escaped with \ the
- * first time you did it.
+ * first time you did it.  commch is the command character
+ * involved, including the prompt for readline.
  */
 char *
  */
 char *
-vgetline(cnt, gcursor, aescaped)
+vgetline(cnt, gcursor, aescaped, commch)
        int cnt;
        register char *gcursor;
        bool *aescaped;
        int cnt;
        register char *gcursor;
        bool *aescaped;
+       char commch;
 {
        register int c, ch;
        register char *cp;
 {
        register int c, ch;
        register char *cp;
-       int x, y, iwhite;
+       int x, y, iwhite, backsl=0;
        char *iglobp;
        char cstr[2];
        int (*OO)() = Outchar;
        char *iglobp;
        char cstr[2];
        int (*OO)() = Outchar;
@@ -436,6 +446,7 @@ vgetline(cnt, gcursor, aescaped)
                vprepins();
        }
        for (;;) {
                vprepins();
        }
        for (;;) {
+               backsl = 0;
                if (gobblebl)
                        gobblebl--;
                if (cnt != 0) {
                if (gobblebl)
                        gobblebl--;
                if (cnt != 0) {
@@ -448,7 +459,7 @@ vgetline(cnt, gcursor, aescaped)
                        c &= (QUOTE|TRIM);
                ch = c;
                maphopcnt = 0;
                        c &= (QUOTE|TRIM);
                ch = c;
                maphopcnt = 0;
-               if (vglobp == 0 && Peekkey == 0)
+               if (vglobp == 0 && Peekkey == 0 && commch != 'r')
                        while ((ch = map(c, immacs)) != c) {
                                c = ch;
                                if (!value(REMAP))
                        while ((ch = map(c, immacs)) != c) {
                                c = ch;
                                if (!value(REMAP))
@@ -559,18 +570,20 @@ vbackup:
                                vcsync();
                                c = getkey();
 #ifndef USG3TTY
                                vcsync();
                                c = getkey();
 #ifndef USG3TTY
-                               if (c == tty.sg_erase || c == tty.sg_kill) {
+                               if (c == tty.sg_erase || c == tty.sg_kill)
 #else
                                if (c == tty.c_cc[VERASE]
 #else
                                if (c == tty.c_cc[VERASE]
-                                   || c == tty.c_cc[VKILL]) {
+                                   || c == tty.c_cc[VKILL])
 #endif
 #endif
+                               {
                                        vgoto(y, x);
                                        if (doomed >= 0)
                                                doomed++;
                                        goto def;
                                }
                                ungetkey(c), c = '\\';
                                        vgoto(y, x);
                                        if (doomed >= 0)
                                                doomed++;
                                        goto def;
                                }
                                ungetkey(c), c = '\\';
-                               goto noput;
+                               backsl = 1;
+                               break;
 
                        /*
                         * ^Q           Super quote following character
 
                        /*
                         * ^Q           Super quote following character
@@ -608,21 +621,25 @@ vbackup:
                                gobbled = 1;
                                continue;
                        }
                                gobbled = 1;
                                continue;
                        }
-                       if (/* c <= ' ' && */ value(WRAPMARGIN) &&
-                               outcol >= OCOLUMNS - value(WRAPMARGIN)) {
+                       if (value(WRAPMARGIN) &&
+                               (outcol >= OCOLUMNS - value(WRAPMARGIN) ||
+                                backsl && outcol==0) &&
+                               commch != 'r') {
                                /*
                                 * At end of word and hit wrapmargin.
                                 * Move the word to next line and keep going.
                                 */
                                wdkind = 1;
                                *gcursor++ = c;
                                /*
                                 * At end of word and hit wrapmargin.
                                 * Move the word to next line and keep going.
                                 */
                                wdkind = 1;
                                *gcursor++ = c;
+                               if (backsl)
+                                       *gcursor++ = getkey();
                                *gcursor = 0;
                                /*
                                 * Find end of previous word if we are past it.
                                 */
                                for (cp=gcursor; cp>ogcursor && isspace(cp[-1]); cp--)
                                        ;
                                *gcursor = 0;
                                /*
                                 * Find end of previous word if we are past it.
                                 */
                                for (cp=gcursor; cp>ogcursor && isspace(cp[-1]); cp--)
                                        ;
-                               if (outcol - (gcursor-cp) >= OCOLUMNS - value(WRAPMARGIN)) {
+                               if (outcol+(backsl?OCOLUMNS:0) - (gcursor-cp) >= OCOLUMNS - value(WRAPMARGIN)) {
                                        /*
                                         * Find beginning of previous word.
                                         */
                                        /*
                                         * Find beginning of previous word.
                                         */
@@ -789,9 +806,11 @@ vbackup:
                                continue;
                        }
 def:
                                continue;
                        }
 def:
-                       putchar(c);
-                       flush();
-noput:
+                       if (!backsl) {
+                               int cnt;
+                               putchar(c);
+                               flush();
+                       }
                        if (gcursor > &genbuf[LBSIZE - 2])
                                error("Line too long");
                        *gcursor++ = c & TRIM;
                        if (gcursor > &genbuf[LBSIZE - 2])
                                error("Line too long");
                        *gcursor++ = c & TRIM;