On Wed, Nov 12, 2014 at 07:34:28PM +0100, Martin Natano wrote:
> The 'struct _gs' type (aka. GS) contains pointers to screen interface
> functions, which are set by cl_func_std(), but this mechanism isn't
> necessary anymore, because the other frontends (tk, motif, ipc) have
> been removed. The only remaining frontend is curses and can be used
> directly. The only exception is the scr_msg function pointer, which is
> used by the perl api (disabled by default) and thus must remain in GS.
> 
> Also, the tcl_interp, ip_private and tk_private fields are unused and
> can be removed.

Below is an updated version of the patch, which applies cleanly to vi as
it is in CVS now. I killed scr_msg, because the last user (the perl api)
is now gone.

This diff is mostly a mechanical change from scr_* to cl_* (or vs_* in
the cases of scr_busy and scr_msg). The benefit is, that the global
state is used less, and the code should be more readable, as less
indirections are involved when a function is called. Does anyone want
to commit that?

> See the diff below.
> 
> cheers,
> natano


Index: cl/cl_funcs.c
===================================================================
RCS file: /cvs/src/usr.bin/vi/cl/cl_funcs.c,v
retrieving revision 1.17
diff -u -r1.17 cl_funcs.c
--- cl/cl_funcs.c       12 Nov 2014 16:29:04 -0000      1.17
+++ cl/cl_funcs.c       20 Nov 2014 20:36:40 -0000
@@ -466,14 +466,12 @@
 int
 cl_rename(SCR *sp, char *name, int on)
 {
-       GS *gp;
        CL_PRIVATE *clp;
        char *ttype;
 
-       gp = sp->gp;
        clp = CLP(sp);
 
-       ttype = OG_STR(gp, GO_TERM);
+       ttype = OG_STR(sp->gp, GO_TERM);
 
        /*
         * XXX
Index: cl/cl_main.c
===================================================================
RCS file: /cvs/src/usr.bin/vi/cl/cl_main.c,v
retrieving revision 1.25
diff -u -r1.25 cl_main.c
--- cl/cl_main.c        19 Nov 2014 03:42:40 -0000      1.25
+++ cl/cl_main.c        20 Nov 2014 20:36:40 -0000
@@ -33,7 +33,6 @@
 GS *__global_list;                             /* GLOBAL: List of screens. */
 sigset_t __sigblockset;                                /* GLOBAL: Blocked 
signals. */
 
-static void       cl_func_std(GS *);
 static CL_PRIVATE *cl_init(GS *);
 static GS        *gs_init(char *);
 static void       perr(char *, char *);
@@ -202,9 +201,6 @@
                (void)close(fd);
        }
 
-       /* Initialize the list of curses functions. */
-       cl_func_std(gp);
-
        return (clp);
 }
 
@@ -351,36 +347,6 @@
        (void)sigaction(SIGINT, NULL, &clp->oact[INDX_INT]);
        (void)sigaction(SIGTERM, NULL, &clp->oact[INDX_TERM]);
        (void)sigaction(SIGWINCH, NULL, &clp->oact[INDX_WINCH]);
-}
-
-/*
- * cl_func_std --
- *     Initialize the standard curses functions.
- */
-static void
-cl_func_std(GS *gp)
-{
-       gp->scr_addstr = cl_addstr;
-       gp->scr_attr = cl_attr;
-       gp->scr_baud = cl_baud;
-       gp->scr_bell = cl_bell;
-       gp->scr_busy = NULL;
-       gp->scr_clrtoeol = cl_clrtoeol;
-       gp->scr_cursor = cl_cursor;
-       gp->scr_deleteln = cl_deleteln;
-       gp->scr_event = cl_event;
-       gp->scr_ex_adjust = cl_ex_adjust;
-       gp->scr_fmap = cl_fmap;
-       gp->scr_insertln = cl_insertln;
-       gp->scr_keyval = cl_keyval;
-       gp->scr_move = cl_move;
-       gp->scr_msg = NULL;
-       gp->scr_optchange = cl_optchange;
-       gp->scr_refresh = cl_refresh;
-       gp->scr_rename = cl_rename;
-       gp->scr_screen = cl_screen;
-       gp->scr_suspend = cl_suspend;
-       gp->scr_usage = cl_usage;
 }
 
 /*
Index: cl/cl_read.c
===================================================================
RCS file: /cvs/src/usr.bin/vi/cl/cl_read.c,v
retrieving revision 1.19
diff -u -r1.19 cl_read.c
--- cl/cl_read.c        12 Nov 2014 04:28:41 -0000      1.19
+++ cl/cl_read.c        20 Nov 2014 20:36:40 -0000
@@ -128,12 +128,10 @@
 {
        struct termios term1, term2;
        CL_PRIVATE *clp;
-       GS *gp;
        struct pollfd pfd[1];
        input_t rval;
        int nr, term_reset, timeout;
 
-       gp = sp->gp;
        clp = CLP(sp);
        term_reset = 0;
 
@@ -205,7 +203,7 @@
         * It's ugly that we wait on scripting file descriptors here, but it's
         * the only way to keep from locking out scripting windows.
         */
-       if (F_ISSET(gp, G_SCRWIN)) {
+       if (F_ISSET(sp->gp, G_SCRWIN)) {
                if (sscr_check_input(sp))
                        goto err;
        }
Index: common/gs.h
===================================================================
RCS file: /cvs/src/usr.bin/vi/common/gs.h,v
retrieving revision 1.13
diff -u -r1.13 gs.h
--- common/gs.h 20 Nov 2014 08:50:53 -0000      1.13
+++ common/gs.h 20 Nov 2014 20:36:40 -0000
@@ -40,13 +40,13 @@
        u_int16_t flags;
 };
 
-/* Action arguments to scr_exadjust(). */
+/* Action arguments to cl_ex_adjust(). */
 typedef enum { EX_TERM_CE, EX_TERM_SCROLL } exadj_t;
 
-/* Screen attribute arguments to scr_attr(). */
+/* Screen attribute arguments to cl_attr(). */
 typedef enum { SA_ALTERNATE, SA_INVERSE } scr_attr_t;
 
-/* Key type arguments to scr_keyval(). */
+/* Key type arguments to cl_keyval(). */
 typedef enum { KEY_VEOF, KEY_VERASE, KEY_VKILL, KEY_VWERASE } scr_keyval_t;
 
 /*
@@ -64,8 +64,6 @@
        SCR     *ccl_sp;                /* Colon command-line screen. */
 
        void    *cl_private;            /* Curses support private area. */
-       void    *ip_private;            /* IP support private area. */
-       void    *tk_private;            /* Tk/Tcl support private area. */
 
                                        /* File references. */
        TAILQ_HEAD(_frefh, _fref) frefq;
@@ -147,50 +145,6 @@
 #define        G_SRESTART      0x0080          /* Screen restarted. */
 #define        G_TMP_INUSE     0x0100          /* Temporary buffer in use. */
        u_int32_t flags;
-
-       /* Screen interface functions. */
-                                       /* Add a string to the screen. */
-       int     (*scr_addstr)(SCR *, const char *, size_t);
-                                       /* Toggle a screen attribute. */
-       int     (*scr_attr)(SCR *, scr_attr_t, int);
-                                       /* Terminal baud rate. */
-       int     (*scr_baud)(SCR *, u_long *);
-                                       /* Beep/bell/flash the terminal. */
-       int     (*scr_bell)(SCR *);
-                                       /* Display a busy message. */
-       void    (*scr_busy)(SCR *, const char *, busy_t);
-                                       /* Clear to the end of the line. */
-       int     (*scr_clrtoeol)(SCR *);
-                                       /* Return the cursor location. */
-       int     (*scr_cursor)(SCR *, size_t *, size_t *);
-                                       /* Delete a line. */
-       int     (*scr_deleteln)(SCR *);
-                                       /* Get a keyboard event. */
-       int     (*scr_event)(SCR *, EVENT *, u_int32_t, int);
-                                       /* Ex: screen adjustment routine. */
-       int     (*scr_ex_adjust)(SCR *, exadj_t);
-       int     (*scr_fmap)             /* Set a function key. */
-(SCR *, seq_t, CHAR_T *, size_t, CHAR_T *, size_t);
-                                       /* Get terminal key value. */
-       int     (*scr_keyval)(SCR *, scr_keyval_t, CHAR_T *, int *);
-                                       /* Insert a line. */
-       int     (*scr_insertln)(SCR *);
-                                       /* Handle an option change. */
-       int     (*scr_optchange)(SCR *, int, char *, u_long *);
-                                       /* Move the cursor. */
-       int     (*scr_move)(SCR *, size_t, size_t);
-                                       /* Message or ex output. */
-       void    (*scr_msg)(SCR *, mtype_t, char *, size_t);
-                                       /* Refresh the screen. */
-       int     (*scr_refresh)(SCR *, int);
-                                       /* Rename the file. */
-       int     (*scr_rename)(SCR *, char *, int);
-                                       /* Set the screen type. */
-       int     (*scr_screen)(SCR *, u_int32_t);
-                                       /* Suspend the editor. */
-       int     (*scr_suspend)(SCR *, int *);
-                                       /* Print usage message. */
-       void    (*scr_usage)(void);
 };
 
 /*
Index: common/key.c
===================================================================
RCS file: /cvs/src/usr.bin/vi/common/key.c,v
retrieving revision 1.13
diff -u -r1.13 key.c
--- common/key.c        12 Nov 2014 04:28:41 -0000      1.13
+++ common/key.c        20 Nov 2014 21:00:56 -0000
@@ -20,12 +20,15 @@
 #include <errno.h>
 #include <limits.h>
 #include <locale.h>
+#include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <termios.h>
 #include <unistd.h>
 
 #include "common.h"
+#include "../cl/cl.h"
 #include "../vi/vi.h"
 
 static int     v_event_append(SCR *, EVENT *);
@@ -160,7 +163,7 @@
        int dne;
 
        /* Get the key's value from the screen. */
-       if (sp->gp->scr_keyval(sp, name, &ch, &dne))
+       if (cl_keyval(sp, name, &ch, &dne))
                return;
        if (dne)
                return;
@@ -529,7 +532,7 @@
                 */
                if (F_ISSET(gp, G_SCRWIN) && sscr_input(sp))
                        return (1);
-loop:          if (gp->scr_event(sp, argp,
+loop:          if (cl_event(sp, argp,
                    LF_ISSET(EC_INTERRUPT | EC_QUOTED | EC_RAW), timeout))
                        return (1);
                switch (argp->e_event) {
@@ -670,7 +673,7 @@
                 * get anywhere useful.
                 */
                if ((++remap_cnt == 1 || remap_cnt % 10 == 0) &&
-                   (gp->scr_event(sp, &ev,
+                   (cl_event(sp, &ev,
                    EC_INTERRUPT, 0) || ev.e_event == E_INTERRUPT)) {
                        F_SET(sp->gp, G_INTERRUPTED);
                        argp->e_event = E_INTERRUPT;
Index: common/main.c
===================================================================
RCS file: /cvs/src/usr.bin/vi/common/main.c,v
retrieving revision 1.26
diff -u -r1.26 main.c
--- common/main.c       20 Nov 2014 08:50:53 -0000      1.26
+++ common/main.c       20 Nov 2014 20:36:41 -0000
@@ -21,12 +21,15 @@
 #include <fcntl.h>
 #include <limits.h>
 #include <paths.h>
+#include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <termios.h>
 #include <unistd.h>
 
 #include "common.h"
+#include "../cl/cl.h"
 #include "../vi/vi.h"
 
 #ifdef DEBUG
@@ -67,13 +70,6 @@
 #endif
        };
 
-       /* Initialize the busy routine, if not defined by the screen. */
-       if (gp->scr_busy == NULL)
-               gp->scr_busy = vs_busy;
-       /* Initialize the message routine, if not defined by the screen. */
-       if (gp->scr_msg == NULL)
-               gp->scr_msg = vs_msg;
-
        /* Common global structure initialization. */
        TAILQ_INIT(&gp->dq);
        TAILQ_INIT(&gp->hq);
@@ -212,7 +208,7 @@
                        break;
                case '?':
                default:
-                       (void)gp->scr_usage();
+                       cl_usage();
                        return (1);
                }
        argc -= optind;
@@ -409,7 +405,7 @@
                            (ev.e_event == E_CHARACTER &&
                            (ev.e_value == K_CR || ev.e_value == K_NL)))
                                break;
-                       (void)gp->scr_bell(sp);
+                       (void)cl_bell(sp);
                }
        }
 
Index: common/msg.c
===================================================================
RCS file: /cvs/src/usr.bin/vi/common/msg.c,v
retrieving revision 1.21
diff -u -r1.21 msg.c
--- common/msg.c        12 Nov 2014 16:29:04 -0000      1.21
+++ common/msg.c        20 Nov 2014 20:36:41 -0000
@@ -175,7 +175,7 @@
        if (sp != NULL)
                (void)ex_fflush(sp);
        if (gp != NULL)
-               gp->scr_msg(sp, mt, bp, mlen);
+               vs_msg(sp, mt, bp, mlen);
        else
                (void)fprintf(stderr, "%.*s", (int)mlen, bp);
 
@@ -323,7 +323,7 @@
        ++tlen;
 
        (void)ex_fflush(sp);
-       sp->gp->scr_msg(sp, M_INFO, bp, tlen);
+       vs_msg(sp, M_INFO, bp, tlen);
 
        FREE_SPACE(sp, bp, blen);
 alloc_err:
@@ -490,7 +490,7 @@
        /* Flush any waiting ex messages. */
        (void)ex_fflush(sp);
 
-       sp->gp->scr_msg(sp, M_INFO, s, len);
+       vs_msg(sp, M_INFO, s, len);
 
        FREE_SPACE(sp, bp, blen);
 alloc_err:
Index: common/options.c
===================================================================
RCS file: /cvs/src/usr.bin/vi/common/options.c,v
retrieving revision 1.18
diff -u -r1.18 options.c
--- common/options.c    14 Nov 2014 20:27:03 -0000      1.18
+++ common/options.c    20 Nov 2014 20:36:41 -0000
@@ -21,12 +21,15 @@
 #include <errno.h>
 #include <limits.h>
 #include <paths.h>
+#include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <termios.h>
 #include <unistd.h>
 
 #include "common.h"
+#include "../cl/cl.h"
 #include "../vi/vi.h"
 #include "pathnames.h"
 
@@ -387,7 +390,7 @@
         * Note, the windows option code will correct any too-large value
         * or when the O_LINES value is 1.
         */
-       if (sp->gp->scr_baud(sp, &v))
+       if (cl_baud(sp, &v))
                return (1);
        if (v <= 600)
                v = 8;
@@ -577,7 +580,7 @@
                            op->func(sp, spo, NULL, &turnoff)) ||
                            ex_optchange(sp, offset, NULL, &turnoff) ||
                            v_optchange(sp, offset, NULL, &turnoff) ||
-                           sp->gp->scr_optchange(sp, offset, NULL, &turnoff)) {
+                           cl_optchange(sp, offset, NULL, &turnoff)) {
                                rval = 1;
                                break;
                        }
@@ -672,7 +675,7 @@
                            op->func(sp, spo, sep, &value)) ||
                            ex_optchange(sp, offset, sep, &value) ||
                            v_optchange(sp, offset, sep, &value) ||
-                           sp->gp->scr_optchange(sp, offset, sep, &value)) {
+                           cl_optchange(sp, offset, sep, &value)) {
                                rval = 1;
                                break;
                        }
@@ -719,7 +722,7 @@
                            op->func(sp, spo, sep, NULL)) ||
                            ex_optchange(sp, offset, sep, NULL) ||
                            v_optchange(sp, offset, sep, NULL) ||
-                           sp->gp->scr_optchange(sp, offset, sep, NULL)) {
+                           cl_optchange(sp, offset, sep, NULL)) {
                                rval = 1;
                                break;
                        }
Index: common/options_f.c
===================================================================
RCS file: /cvs/src/usr.bin/vi/common/options_f.c,v
retrieving revision 1.9
diff -u -r1.9 options_f.c
--- common/options_f.c  12 Nov 2014 04:28:41 -0000      1.9
+++ common/options_f.c  20 Nov 2014 20:36:41 -0000
@@ -19,12 +19,15 @@
 #include <ctype.h>
 #include <errno.h>
 #include <limits.h>
+#include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <termios.h>
 #include <unistd.h>
 
 #include "common.h"
+#include "../cl/cl.h"
 
 /*
  * PUBLIC: int f_altwerase(SCR *, OPTION *, char *, u_long *);
@@ -246,7 +249,7 @@
        u_long v;
 
        /* Historical behavior for w300 was < 1200. */
-       if (sp->gp->scr_baud(sp, &v))
+       if (cl_baud(sp, &v))
                return (1);
        if (v >= 1200)
                return (0);
@@ -263,7 +266,7 @@
        u_long v;
 
        /* Historical behavior for w1200 was == 1200. */
-       if (sp->gp->scr_baud(sp, &v))
+       if (cl_baud(sp, &v))
                return (1);
        if (v < 1200 || v > 4800)
                return (0);
@@ -280,7 +283,7 @@
        u_long v;
 
        /* Historical behavior for w9600 was > 1200. */
-       if (sp->gp->scr_baud(sp, &v))
+       if (cl_baud(sp, &v))
                return (1);
        if (v <= 4800)
                return (0);
Index: common/recover.c
===================================================================
RCS file: /cvs/src/usr.bin/vi/common/recover.c,v
retrieving revision 1.19
diff -u -r1.19 recover.c
--- common/recover.c    14 Nov 2014 20:27:03 -0000      1.19
+++ common/recover.c    20 Nov 2014 20:36:41 -0000
@@ -36,6 +36,7 @@
 #include <unistd.h>
 
 #include "common.h"
+#include "../vi/vi.h"
 
 /*
  * Recovery code.
@@ -208,15 +209,14 @@
                        goto err;
 
                /* Turn on a busy message, and sync it to backing store. */
-               sp->gp->scr_busy(sp,
-                   "057|Copying file for recovery...", BUSY_ON);
+               vs_busy(sp, "057|Copying file for recovery...", BUSY_ON);
                if (ep->db->sync(ep->db, R_RECNOSYNC)) {
                        msgq_str(sp, M_SYSERR, ep->rcv_path,
                            "058|Preservation failed: %s");
-                       sp->gp->scr_busy(sp, NULL, BUSY_OFF);
+                       vs_busy(sp, NULL, BUSY_OFF);
                        goto err;
                }
-               sp->gp->scr_busy(sp, NULL, BUSY_OFF);
+               vs_busy(sp, NULL, BUSY_OFF);
        }
 
        /* Turn off the owner execute bit. */
@@ -292,15 +292,14 @@
                (void)snprintf(buf, sizeof(buf), "%s/vi.XXXXXXXXXX", dp);
                if ((fd = rcv_mktemp(sp, buf, dp, S_IRUSR | S_IWUSR)) == -1)
                        goto err;
-               sp->gp->scr_busy(sp,
-                   "061|Copying file for recovery...", BUSY_ON);
+               vs_busy(sp, "061|Copying file for recovery...", BUSY_ON);
                if (rcv_copy(sp, fd, ep->rcv_path) ||
                    close(fd) || rcv_mailfile(sp, 1, buf)) {
                        (void)unlink(buf);
                        (void)close(fd);
                        rval = 1;
                }
-               sp->gp->scr_busy(sp, NULL, BUSY_OFF);
+               vs_busy(sp, NULL, BUSY_OFF);
        }
        if (0) {
 err:           rval = 1;
Index: common/search.c
===================================================================
RCS file: /cvs/src/usr.bin/vi/common/search.c,v
retrieving revision 1.10
diff -u -r1.10 search.c
--- common/search.c     12 Nov 2014 04:28:41 -0000      1.10
+++ common/search.c     20 Nov 2014 20:36:41 -0000
@@ -18,12 +18,16 @@
 #include <ctype.h>
 #include <errno.h>
 #include <limits.h>
+#include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <termios.h>
 #include <unistd.h>
 
 #include "common.h"
+#include "../cl/cl.h"
+#include "../vi/vi.h"
 
 typedef enum { S_EMPTY, S_EOF, S_NOPREV, S_NOTFOUND, S_SOF, S_WRAP } smsg_t;
 
@@ -236,7 +240,7 @@
                        if (LF_ISSET(SEARCH_MSG))
                                re_error(sp, eval, &sp->re_c);
                        else
-                               (void)sp->gp->scr_bell(sp);
+                               (void)cl_bell(sp);
                        break;
                }
 
@@ -368,7 +372,7 @@
                        if (LF_ISSET(SEARCH_MSG))
                                re_error(sp, eval, &sp->re_c);
                        else
-                               (void)sp->gp->scr_bell(sp);
+                               (void)cl_bell(sp);
                        break;
                }
 
@@ -404,7 +408,7 @@
                                if (LF_ISSET(SEARCH_MSG))
                                        re_error(sp, eval, &sp->re_c);
                                else
-                                       (void)sp->gp->scr_bell(sp);
+                                       (void)cl_bell(sp);
                                goto err;
                        }
                        if (coff && match[0].rm_so >= coff)
@@ -468,5 +472,5 @@
 void
 search_busy(SCR *sp, busy_t btype)
 {
-       sp->gp->scr_busy(sp, "078|Searching...", btype);
+       vs_busy(sp, "078|Searching...", btype);
 }
Index: common/seq.c
===================================================================
RCS file: /cvs/src/usr.bin/vi/common/seq.c,v
retrieving revision 1.9
diff -u -r1.9 seq.c
--- common/seq.c        12 Nov 2014 04:28:41 -0000      1.9
+++ common/seq.c        20 Nov 2014 20:36:41 -0000
@@ -270,13 +270,11 @@
 seq_dump(SCR *sp, seq_t stype, int isname)
 {
        CHAR_T *p;
-       GS *gp;
        SEQ *qp;
        int cnt, len, olen;
 
        cnt = 0;
-       gp = sp->gp;
-       LIST_FOREACH(qp, &gp->seqq, q) {
+       LIST_FOREACH(qp, &sp->gp->seqq, q) {
                if (stype != qp->stype || F_ISSET(qp, SEQ_FUNCMAP))
                        continue;
                ++cnt;
Index: ex/ex.c
===================================================================
RCS file: /cvs/src/usr.bin/vi/ex/ex.c,v
retrieving revision 1.19
diff -u -r1.19 ex.c
--- ex/ex.c     12 Nov 2014 04:28:41 -0000      1.19
+++ ex/ex.c     20 Nov 2014 20:36:41 -0000
@@ -21,12 +21,15 @@
 #include <errno.h>
 #include <fcntl.h>
 #include <limits.h>
+#include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <termios.h>
 #include <unistd.h>
 
 #include "../common/common.h"
+#include "../cl/cl.h"
 #include "../vi/vi.h"
 
 #if defined(DEBUG) && defined(COMLOG)
@@ -63,7 +66,7 @@
 
        /* Flush any saved messages. */
        while ((mp = LIST_FIRST(&gp->msgq)) != NULL) {
-               gp->scr_msg(sp, mp->mtype, mp->buf, mp->len);
+               vs_msg(sp, mp->mtype, mp->buf, mp->len);
                LIST_REMOVE(mp, q);
                free(mp->buf);
                free(mp);
@@ -1354,7 +1357,7 @@
                if (sp->ep != NULL &&
                    F_ISSET(sp, SC_EX) && !F_ISSET(gp, G_SCRIPTED) &&
                    (F_ISSET(ecp, E_USELASTCMD) || ecp->cmd == &cmds[C_SCROLL]))
-                       gp->scr_ex_adjust(sp, EX_TERM_SCROLL);
+                       cl_ex_adjust(sp, EX_TERM_SCROLL);
                F_CLR(ecp, E_NRSEP);
        }
 
Index: ex/ex_append.c
===================================================================
RCS file: /cvs/src/usr.bin/vi/ex/ex_append.c,v
retrieving revision 1.10
diff -u -r1.10 ex_append.c
--- ex/ex_append.c      12 Nov 2014 04:28:41 -0000      1.10
+++ ex/ex_append.c      20 Nov 2014 20:36:41 -0000
@@ -16,11 +16,14 @@
 
 #include <bitstring.h>
 #include <limits.h>
+#include <signal.h>
 #include <stdio.h>
 #include <string.h>
+#include <termios.h>
 #include <unistd.h>
 
 #include "../common/common.h"
+#include "../cl/cl.h"
 
 enum which {APPEND, CHANGE, INSERT};
 
@@ -201,7 +204,7 @@
         * be possible.
         */
        if (F_ISSET(sp, SC_VI)) {
-               if (gp->scr_screen(sp, SC_EX)) {
+               if (cl_screen(sp, SC_EX)) {
                        ex_emsg(sp, cmdp->cmd->name, EXM_NOCANON);
                        return (1);
                }
Index: ex/ex_file.c
===================================================================
RCS file: /cvs/src/usr.bin/vi/ex/ex_file.c,v
retrieving revision 1.7
diff -u -r1.7 ex_file.c
--- ex/ex_file.c        12 Nov 2014 04:28:41 -0000      1.7
+++ ex/ex_file.c        20 Nov 2014 20:36:41 -0000
@@ -17,11 +17,14 @@
 #include <bitstring.h>
 #include <errno.h>
 #include <limits.h>
+#include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <termios.h>
 
 #include "../common/common.h"
+#include "../cl/cl.h"
 
 /*
  * ex_file -- :f[ile] [name]
@@ -66,7 +69,7 @@
                F_SET(frp, FR_NAMECHANGE);
 
                /* Notify the screen. */
-               (void)sp->gp->scr_rename(sp, sp->frp->name, 1);
+               (void)cl_rename(sp, sp->frp->name, 1);
                break;
        default:
                abort();
Index: ex/ex_map.c
===================================================================
RCS file: /cvs/src/usr.bin/vi/ex/ex_map.c,v
retrieving revision 1.6
diff -u -r1.6 ex_map.c
--- ex/ex_map.c 12 Nov 2014 04:28:41 -0000      1.6
+++ ex/ex_map.c 20 Nov 2014 20:36:41 -0000
@@ -17,11 +17,14 @@
 #include <bitstring.h>
 #include <ctype.h>
 #include <limits.h>
+#include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <termios.h>
 
 #include "../common/common.h"
+#include "../cl/cl.h"
 
 /*
  * ex_map -- :map[!] [input] [replacement]
@@ -76,8 +79,7 @@
                    cmdp->argv[1]->bp, cmdp->argv[1]->len, stype,
                    SEQ_FUNCMAP | SEQ_USERDEF))
                        return (1);
-               return (sp->gp->scr_fmap == NULL ? 0 :
-                   sp->gp->scr_fmap(sp, stype, input, cmdp->argv[0]->len,
+               return (cl_fmap(sp, stype, input, cmdp->argv[0]->len,
                    cmdp->argv[1]->bp, cmdp->argv[1]->len));
        }
 
Index: ex/ex_print.c
===================================================================
RCS file: /cvs/src/usr.bin/vi/ex/ex_print.c,v
retrieving revision 1.10
diff -u -r1.10 ex_print.c
--- ex/ex_print.c       12 Nov 2014 04:28:41 -0000      1.10
+++ ex/ex_print.c       20 Nov 2014 20:36:41 -0000
@@ -22,6 +22,7 @@
 #include <string.h>
 
 #include "../common/common.h"
+#include "../vi/vi.h"
 
 static int ex_prchars(SCR *, const char *, size_t *, size_t, u_int, int);
 
@@ -303,7 +304,7 @@
        exp = EXP(sp);
 
        if (exp->obp_len != 0) {
-               sp->gp->scr_msg(sp, M_NONE, exp->obp, exp->obp_len);
+               vs_msg(sp, M_NONE, exp->obp, exp->obp_len);
                exp->obp_len = 0;
        }
        return (0);
Index: ex/ex_read.c
===================================================================
RCS file: /cvs/src/usr.bin/vi/ex/ex_read.c,v
retrieving revision 1.10
diff -u -r1.10 ex_read.c
--- ex/ex_read.c        12 Nov 2014 04:28:41 -0000      1.10
+++ ex/ex_read.c        20 Nov 2014 20:36:41 -0000
@@ -20,11 +20,14 @@
 #include <ctype.h>
 #include <errno.h>
 #include <limits.h>
+#include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <termios.h>
 
 #include "../common/common.h"
+#include "../cl/cl.h"
 #include "../vi/vi.h"
 
 /*
@@ -154,7 +157,7 @@
                 * the screen on a normal read.
                 */
                if (F_ISSET(sp, SC_VI)) {
-                       if (gp->scr_screen(sp, SC_EX)) {
+                       if (cl_screen(sp, SC_EX)) {
                                ex_emsg(sp, cmdp->cmd->name, EXM_NOCANON_F);
                                return (1);
                        }
@@ -227,7 +230,7 @@
                                F_SET(sp->frp, FR_NAMECHANGE | FR_EXNAMED);
 
                                /* Notify the screen. */
-                               (void)sp->gp->scr_rename(sp, sp->frp->name, 1);
+                               (void)cl_rename(sp, sp->frp->name, 1);
                        } else
                                set_alt_name(sp, name);
                        break;
@@ -318,7 +321,7 @@
                        if (INTERRUPTED(sp))
                                break;
                        if (!silent) {
-                               gp->scr_busy(sp, p,
+                               vs_busy(sp, p,
                                    p == NULL ? BUSY_UPDATE : BUSY_ON);
                                p = NULL;
                        }
@@ -351,6 +354,6 @@
        }
 
        if (!silent)
-               gp->scr_busy(sp, NULL, BUSY_OFF);
+               vs_busy(sp, NULL, BUSY_OFF);
        return (rval);
 }
Index: ex/ex_shell.c
===================================================================
RCS file: /cvs/src/usr.bin/vi/ex/ex_shell.c,v
retrieving revision 1.13
diff -u -r1.13 ex_shell.c
--- ex/ex_shell.c       12 Nov 2014 04:28:41 -0000      1.13
+++ ex/ex_shell.c       20 Nov 2014 20:36:41 -0000
@@ -22,9 +22,11 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <termios.h>
 #include <unistd.h>
 
 #include "../common/common.h"
+#include "../cl/cl.h"
 
 /*
  * ex_shell -- :sh[ell]
@@ -50,13 +52,13 @@
        (void)snprintf(buf, sizeof(buf), "%s -i", O_STR(sp, O_SHELL));
 
        /* Restore the window name. */
-       (void)sp->gp->scr_rename(sp, NULL, 0);
+       (void)cl_rename(sp, NULL, 0);
 
        /* If we're still in a vi screen, move out explicitly. */
        rval = ex_exec_proc(sp, cmdp, buf, NULL, !F_ISSET(sp, SC_SCR_EXWROTE));
 
        /* Set the window name. */
-       (void)sp->gp->scr_rename(sp, sp->frp->name, 1);
+       (void)cl_rename(sp, sp->frp->name, 1);
 
        /*
         * !!!
@@ -90,11 +92,11 @@
 
        /* Enter ex mode. */
        if (F_ISSET(sp, SC_VI)) {
-               if (gp->scr_screen(sp, SC_EX)) {
+               if (cl_screen(sp, SC_EX)) {
                        ex_emsg(sp, cmdp->cmd->name, EXM_NOCANON);
                        return (1);
                }
-               (void)gp->scr_attr(sp, SA_ALTERNATE, 0);
+               (void)cl_attr(sp, SA_ALTERNATE, 0);
                F_SET(sp, SC_SCR_EX | SC_SCR_EXWROTE);
        }
 
Index: ex/ex_stop.c
===================================================================
RCS file: /cvs/src/usr.bin/vi/ex/ex_stop.c,v
retrieving revision 1.6
diff -u -r1.6 ex_stop.c
--- ex/ex_stop.c        12 Nov 2014 04:28:41 -0000      1.6
+++ ex/ex_stop.c        20 Nov 2014 20:36:41 -0000
@@ -17,11 +17,14 @@
 #include <bitstring.h>
 #include <errno.h>
 #include <limits.h>
+#include <signal.h>
 #include <stdio.h>
 #include <string.h>
+#include <termios.h>
 #include <unistd.h>
 
 #include "../common/common.h"
+#include "../cl/cl.h"
 
 /*
  * ex_stop -- :stop[!]
@@ -39,7 +42,7 @@
        if (!FL_ISSET(cmdp->iflags, E_C_FORCE) && file_aw(sp, FS_ALL))
                return (1);
 
-       if (sp->gp->scr_suspend(sp, &allowed))
+       if (cl_suspend(sp, &allowed))
                return (1);
        if (!allowed)
                ex_emsg(sp, NULL, EXM_NOSUSPEND);
Index: ex/ex_txt.c
===================================================================
RCS file: /cvs/src/usr.bin/vi/ex/ex_txt.c,v
retrieving revision 1.13
diff -u -r1.13 ex_txt.c
--- ex/ex_txt.c 12 Nov 2014 04:28:41 -0000      1.13
+++ ex/ex_txt.c 20 Nov 2014 20:36:41 -0000
@@ -17,11 +17,14 @@
 #include <bitstring.h>
 #include <ctype.h>
 #include <limits.h>
+#include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <termios.h>
 
 #include "../common/common.h"
+#include "../cl/cl.h"
 #include "../vi/vi.h"
 
 /*
@@ -297,7 +300,7 @@
                                        continue;
 
                                carat_st = C_NOTSET;
-leftmargin:                    (void)gp->scr_ex_adjust(sp, EX_TERM_CE);
+leftmargin:                    (void)cl_ex_adjust(sp, EX_TERM_CE);
                                tp->ai = tp->len = 0;
                                break;
                        case C_NOTSET:                  /* ^D */
@@ -312,7 +315,7 @@
                        }
 
                        /* Clear and redisplay the line. */
-                       (void)gp->scr_ex_adjust(sp, EX_TERM_CE);
+                       (void)cl_ex_adjust(sp, EX_TERM_CE);
                        txt_prompt(sp, tp, prompt, flags);
                        break;
                default:
Index: ex/ex_util.c
===================================================================
RCS file: /cvs/src/usr.bin/vi/ex/ex_util.c,v
retrieving revision 1.8
diff -u -r1.8 ex_util.c
--- ex/ex_util.c        12 Nov 2014 04:28:41 -0000      1.8
+++ ex/ex_util.c        20 Nov 2014 20:36:41 -0000
@@ -18,12 +18,15 @@
 #include <bitstring.h>
 #include <errno.h>
 #include <limits.h>
+#include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <termios.h>
 #include <unistd.h>
 
 #include "../common/common.h"
+#include "../cl/cl.h"
 
 /*
  * ex_cinit --
@@ -145,9 +148,9 @@
 
        gp = sp->gp;
 
-       if (gp->scr_screen(sp, SC_EX))
+       if (cl_screen(sp, SC_EX))
                return (1);
-       (void)gp->scr_attr(sp, SA_ALTERNATE, 0);
+       (void)cl_attr(sp, SA_ALTERNATE, 0);
 
        sp->rows = O_VAL(sp, O_LINES);
        sp->cols = O_VAL(sp, O_COLUMNS);
Index: ex/ex_write.c
===================================================================
RCS file: /cvs/src/usr.bin/vi/ex/ex_write.c,v
retrieving revision 1.12
diff -u -r1.12 ex_write.c
--- ex/ex_write.c       12 Nov 2014 04:28:41 -0000      1.12
+++ ex/ex_write.c       20 Nov 2014 20:36:41 -0000
@@ -20,12 +20,16 @@
 #include <errno.h>
 #include <fcntl.h>
 #include <limits.h>
+#include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <termios.h>
 #include <unistd.h>
 
 #include "../common/common.h"
+#include "../cl/cl.h"
+#include "../vi/vi.h"
 
 enum which {WN, WQ, WRITE, XIT};
 static int exwr(SCR *, EXCMD *, enum which);
@@ -244,7 +248,7 @@
                        F_SET(sp->frp, FR_NAMECHANGE | FR_EXNAMED);
 
                        /* Notify the screen. */
-                       (void)sp->gp->scr_rename(sp, sp->frp->name, 1);
+                       (void)cl_rename(sp, sp->frp->name, 1);
                } else
                        set_alt_name(sp, name);
                break;
@@ -309,7 +313,7 @@
                                if (INTERRUPTED(sp))
                                        break;
                                if (!silent) {
-                                       gp->scr_busy(sp, msg, msg == NULL ?
+                                       vs_busy(sp, msg, msg == NULL ?
                                            BUSY_UPDATE : BUSY_ON);
                                        msg = NULL;
                                }
@@ -350,7 +354,7 @@
        }
 
        if (!silent)
-               gp->scr_busy(sp, NULL, BUSY_OFF);
+               vs_busy(sp, NULL, BUSY_OFF);
 
        /* Report the possibly partial transfer. */
        if (nlno != NULL) {
Index: vi/v_ex.c
===================================================================
RCS file: /cvs/src/usr.bin/vi/vi/v_ex.c,v
retrieving revision 1.12
diff -u -r1.12 v_ex.c
--- vi/v_ex.c   12 Nov 2014 04:28:41 -0000      1.12
+++ vi/v_ex.c   20 Nov 2014 20:36:41 -0000
@@ -17,12 +17,15 @@
 
 #include <bitstring.h>
 #include <limits.h>
+#include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <termios.h>
 #include <unistd.h>
 
 #include "../common/common.h"
+#include "../cl/cl.h"
 #include "vi.h"
 
 static int v_ecl(SCR *);
@@ -58,17 +61,13 @@
 int
 v_exmode(SCR *sp, VICMD *vp)
 {
-       GS *gp;
-
-       gp = sp->gp;
-
        /* Try and switch screens -- the screen may not permit it. */
-       if (gp->scr_screen(sp, SC_EX)) {
+       if (cl_screen(sp, SC_EX)) {
                msgq(sp, M_ERR,
                    "207|The Q command requires the ex terminal interface");
                return (1);
        }
-       (void)gp->scr_attr(sp, SA_ALTERNATE, 0);
+       (void)cl_attr(sp, SA_ALTERNATE, 0);
 
        /* Save the current cursor position. */
        sp->frp->lno = sp->lno;
@@ -356,12 +355,9 @@
 int
 v_ex(SCR *sp, VICMD *vp)
 {
-       GS *gp;
        TEXT *tp;
        int do_cedit, do_resolution, ifcontinue;
 
-       gp = sp->gp;
-
        /*
         * !!!
         * If we put out more than a single line of messages, or ex trashes
@@ -377,7 +373,7 @@
                 * There may already be an ex command waiting to run.  If
                 * so, we continue with it.
                 */
-               if (!EXCMD_RUNNING(gp)) {
+               if (!EXCMD_RUNNING(sp->gp)) {
                        /* Get a command. */
                        if (v_tcmd(sp, vp, ':',
                            TXT_BS | TXT_CEDIT | TXT_FILEC | TXT_PROMPT))
Index: vi/v_redraw.c
===================================================================
RCS file: /cvs/src/usr.bin/vi/vi/v_redraw.c,v
retrieving revision 1.6
diff -u -r1.6 v_redraw.c
--- vi/v_redraw.c       12 Nov 2014 04:28:41 -0000      1.6
+++ vi/v_redraw.c       20 Nov 2014 20:36:41 -0000
@@ -17,9 +17,12 @@
 
 #include <bitstring.h>
 #include <limits.h>
+#include <signal.h>
 #include <stdio.h>
+#include <termios.h>
 
 #include "../common/common.h"
+#include "../cl/cl.h"
 #include "vi.h"
 
 /*
@@ -31,5 +34,5 @@
 int
 v_redraw(SCR *sp, VICMD *vp)
 {
-       return (sp->gp->scr_refresh(sp, 1));
+       return (cl_refresh(sp, 1));
 }
Index: vi/v_txt.c
===================================================================
RCS file: /cvs/src/usr.bin/vi/vi/v_txt.c,v
retrieving revision 1.27
diff -u -r1.27 v_txt.c
--- vi/v_txt.c  12 Nov 2014 04:28:41 -0000      1.27
+++ vi/v_txt.c  20 Nov 2014 20:36:41 -0000
@@ -20,12 +20,15 @@
 #include <ctype.h>
 #include <errno.h>
 #include <limits.h>
+#include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <termios.h>
 #include <unistd.h>
 
 #include "../common/common.h"
+#include "../cl/cl.h"
 #include "vi.h"
 
 static int      txt_abbrev(SCR *, TEXT *, CHAR_T *, int, int *, int *);
@@ -182,8 +185,8 @@
                 */
                if (IS_SMALL(sp)) {
                        for (cnt = sp->t_rows; cnt <= sp->t_maxrows; ++cnt) {
-                               (void)sp->gp->scr_move(sp, cnt, 0);
-                               (void)sp->gp->scr_clrtoeol(sp);
+                               (void)cl_move(sp, cnt, 0);
+                               (void)cl_clrtoeol(sp);
                        }
                        TMAP = HMAP + (sp->t_rows - 1);
                } else
@@ -2044,7 +2047,7 @@
        switch (argc) {
        case 0:                         /* No matches. */
                if (!trydir)
-                       (void)sp->gp->scr_bell(sp);
+                       (void)cl_bell(sp);
                return (0);
        case 1:                         /* One match. */
                /* If something changed, do the exchange. */
@@ -2061,7 +2064,7 @@
 
                /* If nothing changed, period, ring the bell. */
                if (!trydir)
-                       (void)sp->gp->scr_bell(sp);
+                       (void)cl_bell(sp);
                return (0);
        default:                        /* Multiple matches. */
                *redrawp = 1;
@@ -2627,7 +2630,7 @@
        if (lno != TMAP[0].lno) {
                if (vs_line(sp, &TMAP[0], NULL, NULL))
                        return (1);
-               (void)sp->gp->scr_refresh(sp, 0);
+               (void)cl_refresh(sp, 0);
        }
        return (0);
 }
Index: vi/vi.c
===================================================================
RCS file: /cvs/src/usr.bin/vi/vi/vi.c,v
retrieving revision 1.15
diff -u -r1.15 vi.c
--- vi/vi.c     12 Nov 2014 04:28:41 -0000      1.15
+++ vi/vi.c     20 Nov 2014 20:36:41 -0000
@@ -19,12 +19,15 @@
 #include <ctype.h>
 #include <errno.h>
 #include <limits.h>
+#include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <termios.h>
 #include <unistd.h>
 
 #include "../common/common.h"
+#include "../cl/cl.h"
 #include "vi.h"
 
 typedef enum {
@@ -85,7 +88,7 @@
                return (1);
 
        /* Set the focus. */
-       (void)sp->gp->scr_rename(sp, sp->frp->name, 1);
+       (void)cl_rename(sp, sp->frp->name, 1);
 
        for (vip = VIP(sp), rval = 0;;) {
                /* Resolve messages. */
@@ -262,7 +265,7 @@
                        /* Switch screens, change focus. */
                        sp = next;
                        vip = VIP(sp);
-                       (void)sp->gp->scr_rename(sp, sp->frp->name, 1);
+                       (void)cl_rename(sp, sp->frp->name, 1);
 
                        /* Don't trust the cursor. */
                        F_SET(vip, VIP_CUR_INVALID);
@@ -382,7 +385,7 @@
                        /* Switch screens, change focus. */
                        sp = sp->nextdisp;
                        vip = VIP(sp);
-                       (void)sp->gp->scr_rename(sp, sp->frp->name, 1);
+                       (void)cl_rename(sp, sp->frp->name, 1);
 
                        /* Don't trust the cursor. */
                        F_SET(vip, VIP_CUR_INVALID);
@@ -395,7 +398,7 @@
                /* If the last command switched files, change focus. */
                if (F_ISSET(sp, SC_FSWITCH)) {
                        F_CLR(sp, SC_FSWITCH);
-                       (void)sp->gp->scr_rename(sp, sp->frp->name, 1);
+                       (void)cl_rename(sp, sp->frp->name, 1);
                }
 
                /* If leaving vi, return to the main editor loop. */
@@ -698,7 +701,7 @@
        case ISPARTIAL:
                break;
        case NOTPARTIAL:
-               (void)sp->gp->scr_bell(sp);
+               (void)cl_bell(sp);
                break;
        }
        return (GC_ERR);
@@ -922,16 +925,14 @@
 static int
 v_init(SCR *sp)
 {
-       GS *gp;
        VI_PRIVATE *vip;
 
-       gp = sp->gp;
        vip = VIP(sp);
 
        /* Switch into vi. */
-       if (gp->scr_screen(sp, SC_VI))
+       if (cl_screen(sp, SC_VI))
                return (1);
-       (void)gp->scr_attr(sp, SA_ALTERNATE, 1);
+       (void)cl_attr(sp, SA_ALTERNATE, 1);
 
        F_CLR(sp, SC_EX | SC_SCR_EX);
        F_SET(sp, SC_VI);
@@ -1189,7 +1190,7 @@
                         * generated in a row.  (Just figured you might want
                         * to know that.)
                         */
-                       (void)sp->gp->scr_bell(sp);
+                       (void)cl_bell(sp);
                        return (GC_INTERRUPT);
                case E_REPAINT:
                        if (vs_repaint(sp, evp))
Index: vi/vs_line.c
===================================================================
RCS file: /cvs/src/usr.bin/vi/vi/vs_line.c,v
retrieving revision 1.14
diff -u -r1.14 vs_line.c
--- vi/vs_line.c        12 Nov 2014 04:28:41 -0000      1.14
+++ vi/vs_line.c        20 Nov 2014 20:36:41 -0000
@@ -17,10 +17,13 @@
 
 #include <bitstring.h>
 #include <limits.h>
+#include <signal.h>
 #include <stdio.h>
 #include <string.h>
+#include <termios.h>
 
 #include "../common/common.h"
+#include "../cl/cl.h"
 #include "vi.h"
 
 #ifdef VISIBLE_TAB_CHARS
@@ -39,7 +42,6 @@
 vs_line(SCR *sp, SMAP *smp, size_t *yp, size_t *xp)
 {
        CHAR_T *kp;
-       GS *gp;
        SMAP *tsmp;
        size_t chlen = 0, cno_cnt, cols_per_screen, len, nlen;
        size_t offset_in_char, offset_in_line, oldx, oldy;
@@ -82,9 +84,8 @@
         * the real contents of the screen are.  Because of this, we have to
         * return to whereever we started from.
         */
-       gp = sp->gp;
-       (void)gp->scr_cursor(sp, &oldy, &oldx);
-       (void)gp->scr_move(sp, smp - HMAP, 0);
+       (void)cl_cursor(sp, &oldy, &oldx);
+       (void)cl_move(sp, smp - HMAP, 0);
 
        /* Get the line. */
        dne = db_get(sp, smp->lno, 0, &p, &len);
@@ -138,7 +139,7 @@
                                    O_NUMBER_FMT, (ulong)smp->lno);
                                if (nlen >= sizeof(cbuf))
                                        nlen = sizeof(cbuf) - 1;
-                               (void)gp->scr_addstr(sp, cbuf, nlen);
+                               (void)cl_addstr(sp, cbuf, nlen);
                        }
                }
        }
@@ -181,13 +182,13 @@
                        } else
                                if (list_dollar) {
                                        ch = '$';
-empty:                                 (void)gp->scr_addstr(sp,
+empty:                                 (void)cl_addstr(sp,
                                            KEY_NAME(sp, ch), KEY_LEN(sp, ch));
                                }
                }
 
-               (void)gp->scr_clrtoeol(sp);
-               (void)gp->scr_move(sp, oldy, oldx);
+               (void)cl_clrtoeol(sp);
+               (void)cl_move(sp, oldy, oldx);
                return (0);
        }
 
@@ -397,9 +398,9 @@
                if (is_cached)
                        continue;
 
-#define        FLUSH(gp, sp, cbp, cbuf) do {                                   
\
+#define        FLUSH(sp, cbp, cbuf) do {                                       
\
        *(cbp) = '\0';                                                  \
-       (void)(gp)->scr_addstr((sp), (cbuf), (cbp) - (cbuf));           \
+       (void)cl_addstr((sp), (cbuf), (cbp) - (cbuf));                  \
        (cbp) = (cbuf);                                                 \
 } while (0)
                /*
@@ -412,12 +413,12 @@
                if (is_tab)
                        while (chlen--) {
                                if (cbp >= ecbp)
-                                       FLUSH(gp, sp, cbp, cbuf);
+                                       FLUSH(sp, cbp, cbuf);
                                *cbp++ = TABCH;
                        }
                else {
                        if (cbp + chlen >= ecbp)
-                               FLUSH(gp, sp, cbp, cbuf);
+                               FLUSH(sp, cbp, cbuf);
                        for (kp = KEY_NAME(sp, ch) + offset_in_char; chlen--;)
                                *cbp++ = *kp++;
                }
@@ -438,21 +439,21 @@
 
                        chlen = KEY_LEN(sp, '$');
                        if (cbp + chlen >= ecbp)
-                               FLUSH(gp, sp, cbp, cbuf);
+                               FLUSH(sp, cbp, cbuf);
                        for (kp = KEY_NAME(sp, '$'); chlen--;)
                                *cbp++ = *kp++;
                }
 
                /* If still didn't paint the whole line, clear the rest. */
                if (scno < cols_per_screen)
-                       (void)gp->scr_clrtoeol(sp);
+                       (void)cl_clrtoeol(sp);
        }
 
        /* Flush any buffered characters. */
        if (cbp > cbuf)
-               FLUSH(gp, sp, cbp, cbuf);
+               FLUSH(sp, cbp, cbuf);
 
-ret1:  (void)gp->scr_move(sp, oldy, oldx);
+ret1:  (void)cl_move(sp, oldy, oldx);
        return (0);
 }
 
@@ -465,14 +466,11 @@
 int
 vs_number(SCR *sp)
 {
-       GS *gp;
        SMAP *smp;
        size_t len, oldy, oldx;
        int exist;
        char nbuf[10];
 
-       gp = sp->gp;
-
        /* No reason to do anything if we're in input mode on the info line. */
        if (F_ISSET(sp, SC_TINPUT_INFO))
                return (0);
@@ -488,7 +486,7 @@
         */
        exist = db_exist(sp, TMAP->lno + 1);
 
-       (void)gp->scr_cursor(sp, &oldy, &oldx);
+       (void)cl_cursor(sp, &oldy, &oldx);
        for (smp = HMAP; smp <= TMAP; ++smp) {
                /* Numbers are only displayed for the first screen line. */
                if (O_ISSET(sp, O_LEFTRIGHT)) {
@@ -505,12 +503,12 @@
                if (smp->lno != 1 && !exist && !db_exist(sp, smp->lno))
                        break;
 
-               (void)gp->scr_move(sp, smp - HMAP, 0);
+               (void)cl_move(sp, smp - HMAP, 0);
                len = snprintf(nbuf, sizeof(nbuf), O_NUMBER_FMT, 
(ulong)smp->lno);
                if (len >= sizeof(nbuf))
                        len = sizeof(nbuf) - 1;
-               (void)gp->scr_addstr(sp, nbuf, len);
+               (void)cl_addstr(sp, nbuf, len);
        }
-       (void)gp->scr_move(sp, oldy, oldx);
+       (void)cl_move(sp, oldy, oldx);
        return (0);
 }
Index: vi/vs_msg.c
===================================================================
RCS file: /cvs/src/usr.bin/vi/vi/vs_msg.c,v
retrieving revision 1.13
diff -u -r1.13 vs_msg.c
--- vi/vs_msg.c 12 Nov 2014 04:28:41 -0000      1.13
+++ vi/vs_msg.c 20 Nov 2014 20:36:41 -0000
@@ -17,12 +17,15 @@
 
 #include <bitstring.h>
 #include <ctype.h>
+#include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <termios.h>
 #include <unistd.h>
 
 #include "../common/common.h"
+#include "../cl/cl.h"
 #include "vi.h"
 
 typedef enum {
@@ -45,18 +48,14 @@
  * vs_busy --
  *     Display, update or clear a busy message.
  *
- * This routine is the default editor interface for vi busy messages.  It
- * implements a standard strategy of stealing lines from the bottom of the
- * vi text screen.  Screens using an alternate method of displaying busy
- * messages, e.g. X11 clock icons, should set their scr_busy function to the
- * correct function before calling the main editor routine.
+ * This routine is the editor interface for vi busy messages.  It implements
+ * a standard strategy of stealing lines from the bottom of the vi text screen.
  *
  * PUBLIC: void vs_busy(SCR *, const char *, busy_t);
  */
 void
 vs_busy(SCR *sp, const char *msg, busy_t btype)
 {
-       GS *gp;
        VI_PRIVATE *vip;
        static const char flagc[] = "|/-\\";
        struct timeval tv;
@@ -67,7 +66,6 @@
        if (F_ISSET(sp, SC_EX | SC_SCR_EXWROTE))
                return;
 
-       gp = sp->gp;
        vip = VIP(sp);
 
        /*
@@ -87,15 +85,15 @@
                (void)gettimeofday(&vip->busy_tv, NULL);
 
                /* Save the current cursor. */
-               (void)gp->scr_cursor(sp, &vip->busy_oldy, &vip->busy_oldx);
+               (void)cl_cursor(sp, &vip->busy_oldy, &vip->busy_oldx);
 
                /* Display the busy message. */
                p = msg_cat(sp, msg, &len);
-               (void)gp->scr_move(sp, LASTLINE(sp), 0);
-               (void)gp->scr_addstr(sp, p, len);
-               (void)gp->scr_cursor(sp, &notused, &vip->busy_fx);
-               (void)gp->scr_clrtoeol(sp);
-               (void)gp->scr_move(sp, LASTLINE(sp), vip->busy_fx);
+               (void)cl_move(sp, LASTLINE(sp), 0);
+               (void)cl_addstr(sp, p, len);
+               (void)cl_cursor(sp, &notused, &vip->busy_fx);
+               (void)cl_clrtoeol(sp);
+               (void)cl_move(sp, LASTLINE(sp), vip->busy_fx);
                break;
        case BUSY_OFF:
                if (vip->busy_ref == 0)
@@ -107,10 +105,10 @@
                 * Always return to the original position.
                 */
                if (vip->totalcount == 0 && vip->busy_ref == 0) {
-                       (void)gp->scr_move(sp, LASTLINE(sp), 0);
-                       (void)gp->scr_clrtoeol(sp);
+                       (void)cl_move(sp, LASTLINE(sp), 0);
+                       (void)cl_clrtoeol(sp);
                }
-               (void)gp->scr_move(sp, vip->busy_oldy, vip->busy_oldx);
+               (void)cl_move(sp, vip->busy_oldy, vip->busy_oldx);
                break;
        case BUSY_UPDATE:
                if (vip->totalcount != 0 || vip->busy_ref == 0)
@@ -126,12 +124,12 @@
                /* Display the update. */
                if (vip->busy_ch == sizeof(flagc) - 1)
                        vip->busy_ch = 0;
-               (void)gp->scr_move(sp, LASTLINE(sp), vip->busy_fx);
-               (void)gp->scr_addstr(sp, flagc + vip->busy_ch++, 1);
-               (void)gp->scr_move(sp, LASTLINE(sp), vip->busy_fx);
+               (void)cl_move(sp, LASTLINE(sp), vip->busy_fx);
+               (void)cl_addstr(sp, flagc + vip->busy_ch++, 1);
+               (void)cl_move(sp, LASTLINE(sp), vip->busy_fx);
                break;
        }
-       (void)gp->scr_refresh(sp, 0);
+       (void)cl_refresh(sp, 0);
 }
 
 /* 
@@ -143,8 +141,8 @@
 void
 vs_home(SCR *sp)
 {
-       (void)sp->gp->scr_move(sp, LASTLINE(sp), 0);
-       (void)sp->gp->scr_refresh(sp, 0);
+       (void)cl_move(sp, LASTLINE(sp), 0);
+       (void)cl_refresh(sp, 0);
 }
 
 /*
@@ -156,11 +154,8 @@
 void
 vs_update(SCR *sp, const char *m1, const char *m2)
 {
-       GS *gp;
        size_t len, mlen, oldx, oldy;
 
-       gp = sp->gp;
-
        /*
         * This routine displays a message on the bottom line of the screen,
         * without updating any of the command structures that would keep it
@@ -179,11 +174,11 @@
         * Save the cursor position, the substitute-with-confirmation code
         * will have already set it correctly.
         */
-       (void)gp->scr_cursor(sp, &oldy, &oldx);
+       (void)cl_cursor(sp, &oldy, &oldx);
 
        /* Clear the bottom line. */
-       (void)gp->scr_move(sp, LASTLINE(sp), 0);
-       (void)gp->scr_clrtoeol(sp);
+       (void)cl_move(sp, LASTLINE(sp), 0);
+       (void)cl_clrtoeol(sp);
 
        /*
         * XXX
@@ -193,18 +188,18 @@
                mlen = len = strlen(m1);
                if (len > sp->cols - 2)
                        mlen = len = sp->cols - 2;
-               (void)gp->scr_addstr(sp, m1, mlen);
+               (void)cl_addstr(sp, m1, mlen);
        } else
                len = 0;
        if (m2 != NULL) {
                mlen = strlen(m2);
                if (len + mlen > sp->cols - 2)
                        mlen = (sp->cols - 2) - len;
-               (void)gp->scr_addstr(sp, m2, mlen);
+               (void)cl_addstr(sp, m2, mlen);
        }
 
-       (void)gp->scr_move(sp, oldy, oldx);
-       (void)gp->scr_refresh(sp, 0);
+       (void)cl_move(sp, oldy, oldx);
+       (void)cl_refresh(sp, 0);
 }
 
 /*
@@ -213,9 +208,7 @@
  *
  * This routine is the default editor interface for all ex output, and all ex
  * and vi error/informational messages.  It implements the standard strategy
- * of stealing lines from the bottom of the vi text screen.  Screens using an
- * alternate method of displaying messages, e.g. dialog boxes, should set their
- * scr_msg function to the correct function before calling the editor.
+ * of stealing lines from the bottom of the vi text screen.
  *
  * PUBLIC: void vs_msg(SCR *, mtype_t, char *, size_t);
  */
@@ -239,7 +232,7 @@
        if (F_ISSET(sp, SC_TINPUT_INFO) || F_ISSET(gp, G_BELLSCHED)) {
                if (F_ISSET(sp, SC_SCR_VI)) {
                        F_CLR(gp, G_BELLSCHED);
-                       (void)gp->scr_bell(sp);
+                       (void)cl_bell(sp);
                } else
                        F_SET(gp, G_BELLSCHED);
        }
@@ -270,7 +263,7 @@
        if (F_ISSET(sp, SC_EX | SC_SCR_EXWROTE)) {
                if (!F_ISSET(sp, SC_SCR_EX)) {
                        if (F_ISSET(sp, SC_SCR_EXWROTE)) {
-                               if (sp->gp->scr_screen(sp, SC_EX))
+                               if (cl_screen(sp, SC_EX))
                                        return;
                        } else
                                if (ex_init(sp))
@@ -278,16 +271,16 @@
                }
 
                if (mtype == M_ERR)
-                       (void)gp->scr_attr(sp, SA_INVERSE, 1);
+                       (void)cl_attr(sp, SA_INVERSE, 1);
                (void)printf("%.*s", (int)len, line);
                if (mtype == M_ERR)
-                       (void)gp->scr_attr(sp, SA_INVERSE, 0);
+                       (void)cl_attr(sp, SA_INVERSE, 0);
                (void)fflush(stdout);
 
                F_CLR(sp, SC_EX_WAIT_NO);
 
                if (!F_ISSET(sp, SC_SCR_EX))
-                       (void)sp->gp->scr_screen(sp, SC_VI);
+                       (void)cl_screen(sp, SC_VI);
                return;
        }
 
@@ -298,7 +291,7 @@
        }
 
        /* Save the cursor position. */
-       (void)gp->scr_cursor(sp, &oldy, &oldx);
+       (void)cl_cursor(sp, &oldy, &oldx);
 
        /* If it's an ex output message, just write it out. */
        if (mtype == M_NONE) {
@@ -376,8 +369,8 @@
                        break;
        }
 
-ret:   (void)gp->scr_move(sp, oldy, oldx);
-       (void)gp->scr_refresh(sp, 0);
+ret:   (void)cl_move(sp, oldy, oldx);
+       (void)cl_refresh(sp, 0);
 }
 
 /*
@@ -388,14 +381,12 @@
 vs_output(SCR *sp, mtype_t mtype, const char *line, int llen)
 {
        CHAR_T *kp;
-       GS *gp;
        VI_PRIVATE *vip;
        size_t chlen, notused;
        int ch, len, tlen;
        const char *p, *t;
        char *cbp, *ecbp, cbuf[128];
 
-       gp = sp->gp;
        vip = VIP(sp);
        for (p = line; llen > 0;) {
                /* Get the next physical line. */
@@ -420,9 +411,9 @@
                if (vip->lcontinue == 0) {
                        if (!IS_ONELINE(sp)) {
                                if (vip->totalcount == 1) {
-                                       (void)gp->scr_move(sp,
+                                       (void)cl_move(sp,
                                            LASTLINE(sp) - 1, 0);
-                                       (void)gp->scr_clrtoeol(sp);
+                                       (void)cl_clrtoeol(sp);
                                        (void)vs_divider(sp);
                                        F_SET(vip, VIP_DIVIDER);
                                        ++vip->totalcount;
@@ -438,23 +429,23 @@
                        if (vip->totalcount != 0)
                                vs_scroll(sp, NULL, SCROLL_W_QUIT);
 
-                       (void)gp->scr_move(sp, LASTLINE(sp), 0);
+                       (void)cl_move(sp, LASTLINE(sp), 0);
                        ++vip->totalcount;
                        ++vip->linecount;
 
                        if (INTERRUPTED(sp))
                                break;
                } else
-                       (void)gp->scr_move(sp, LASTLINE(sp), vip->lcontinue);
+                       (void)cl_move(sp, LASTLINE(sp), vip->lcontinue);
 
                /* Error messages are in inverse video. */
                if (mtype == M_ERR)
-                       (void)gp->scr_attr(sp, SA_INVERSE, 1);
+                       (void)cl_attr(sp, SA_INVERSE, 1);
 
                /* Display the line, doing character translation. */
 #define        FLUSH {                                                         
\
        *cbp = '\0';                                                    \
-       (void)gp->scr_addstr(sp, cbuf, cbp - cbuf);                     \
+       (void)cl_addstr(sp, cbuf, cbp - cbuf);                  \
        cbp = cbuf;                                                     \
 }
                ecbp = (cbp = cbuf) + sizeof(cbuf) - 1;
@@ -478,10 +469,10 @@
                if (cbp > cbuf)
                        FLUSH;
                if (mtype == M_ERR)
-                       (void)gp->scr_attr(sp, SA_INVERSE, 0);
+                       (void)cl_attr(sp, SA_INVERSE, 0);
 
                /* Clear the rest of the line. */
-               (void)gp->scr_clrtoeol(sp);
+               (void)cl_clrtoeol(sp);
 
                /* If we loop, it's a new line. */
                vip->lcontinue = 0;
@@ -497,7 +488,7 @@
 
        /* Set up next continuation line. */
        if (p == NULL)
-               gp->scr_cursor(sp, &notused, &vip->lcontinue);
+               cl_cursor(sp, &notused, &vip->lcontinue);
 }
 
 /*
@@ -513,11 +504,9 @@
 vs_ex_resolve(SCR *sp, int *continuep)
 {
        EVENT ev;
-       GS *gp;
        VI_PRIVATE *vip;
        sw_t wtype;
 
-       gp = sp->gp;
        vip = VIP(sp);
        *continuep = 0;
 
@@ -548,7 +537,7 @@
         * commands.  That seems right to me (well, at least not wrong).
         */
        if (F_ISSET(sp, SC_SCR_EXWROTE)) {
-               if (sp->gp->scr_screen(sp, SC_VI))
+               if (cl_screen(sp, SC_VI))
                        return (1);
        } else
                if (!F_ISSET(sp, SC_EX_WAIT_YES) && vip->totalcount < 2) {
@@ -591,7 +580,7 @@
                F_SET(sp, SC_SCR_REFORMAT);
 
        /* Ex may have switched out of the alternate screen, return. */
-       (void)gp->scr_attr(sp, SA_ALTERNATE, 1);
+       (void)cl_attr(sp, SA_ALTERNATE, 1);
 
        /*
         * Whew.  We're finally back home, after what feels like years.
@@ -656,12 +645,12 @@
                csp = sp;
 
        /* Save the cursor position. */
-       (void)gp->scr_cursor(csp, &oldy, &oldx);
+       (void)cl_cursor(csp, &oldy, &oldx);
 
        /* Ring the bell if it's scheduled. */
        if (F_ISSET(gp, G_BELLSCHED)) {
                F_CLR(gp, G_BELLSCHED);
-               (void)gp->scr_bell(sp);
+               (void)cl_bell(sp);
        }
 
        /* Display new file status line. */
@@ -683,7 +672,7 @@
                if (!F_ISSET(sp, SC_SCR_VI) && vs_refresh(sp, 1))
                        return (1);
                while ((mp = LIST_FIRST(&gp->msgq)) != NULL) {
-                       gp->scr_msg(sp, mp->mtype, mp->buf, mp->len);
+                       vs_msg(sp, mp->mtype, mp->buf, mp->len);
                        LIST_REMOVE(mp, q);
                        free(mp->buf);
                        free(mp);
@@ -731,7 +720,7 @@
                (void)vs_repaint(sp, &ev);
 
        /* Restore the cursor position. */
-       (void)gp->scr_move(csp, oldy, oldx);
+       (void)cl_move(csp, oldy, oldx);
 
        return (0);
 }
@@ -743,10 +732,8 @@
 static void
 vs_scroll(SCR *sp, int *continuep, sw_t wtype)
 {
-       GS *gp;
        VI_PRIVATE *vip;
 
-       gp = sp->gp;
        vip = VIP(sp);
        if (!IS_ONELINE(sp)) {
                /*
@@ -754,14 +741,14 @@
                 * delete the line above the first line output so preserve the
                 * maximum amount of the screen.
                 */
-               (void)gp->scr_move(sp, vip->totalcount <
-                   sp->rows ? LASTLINE(sp) - vip->totalcount : 0, 0);
-               (void)gp->scr_deleteln(sp);
+               (void)cl_move(sp, vip->totalcount < sp->rows ?
+                   LASTLINE(sp) - vip->totalcount : 0, 0);
+               (void)cl_deleteln(sp);
 
                /* If there are screens below us, push them back into place. */
                if (TAILQ_NEXT(sp, q)) {
-                       (void)gp->scr_move(sp, LASTLINE(sp), 0);
-                       (void)gp->scr_insertln(sp);
+                       (void)cl_move(sp, LASTLINE(sp), 0);
+                       (void)cl_insertln(sp);
                }
        }
        if (wtype == SCROLL_W_QUIT && vip->linecount < sp->t_maxrows)
@@ -785,7 +772,7 @@
        gp = sp->gp;
        vip = VIP(sp);
 
-       (void)gp->scr_move(sp, LASTLINE(sp), 0);
+       (void)cl_move(sp, LASTLINE(sp), 0);
        if (IS_ONELINE(sp))
                p = msg_cmsg(sp, CMSG_CONT_S, &len);
        else
@@ -803,13 +790,13 @@
                        abort();
                        /* NOTREACHED */
                }
-       (void)gp->scr_addstr(sp, p, len);
+       (void)cl_addstr(sp, p, len);
 
        ++vip->totalcount;
        vip->linecount = 0;
 
-       (void)gp->scr_clrtoeol(sp);
-       (void)gp->scr_refresh(sp, 0);
+       (void)cl_clrtoeol(sp);
+       (void)cl_refresh(sp, 0);
 
        /* Get a single character from the terminal. */
        if (continuep != NULL)
@@ -824,7 +811,7 @@
                        F_SET(gp, G_INTERRUPTED);
                        break;
                }
-               (void)gp->scr_bell(sp);
+               (void)cl_bell(sp);
        }
        switch (wtype) {
        case SCROLL_W_QUIT:
@@ -847,16 +834,14 @@
 static void
 vs_divider(SCR *sp)
 {
-       GS *gp;
        size_t len;
 
 #define        DIVIDESTR       "+=+=+=+=+=+=+=+"
        len =
            sizeof(DIVIDESTR) - 1 > sp->cols ? sp->cols : sizeof(DIVIDESTR) - 1;
-       gp = sp->gp;
-       (void)gp->scr_attr(sp, SA_INVERSE, 1);
-       (void)gp->scr_addstr(sp, DIVIDESTR, len);
-       (void)gp->scr_attr(sp, SA_INVERSE, 0);
+       (void)cl_attr(sp, SA_INVERSE, 1);
+       (void)cl_addstr(sp, DIVIDESTR, len);
+       (void)cl_attr(sp, SA_INVERSE, 0);
 }
 
 /*
Index: vi/vs_refresh.c
===================================================================
RCS file: /cvs/src/usr.bin/vi/vi/vs_refresh.c,v
retrieving revision 1.19
diff -u -r1.19 vs_refresh.c
--- vi/vs_refresh.c     12 Nov 2014 04:28:41 -0000      1.19
+++ vi/vs_refresh.c     20 Nov 2014 20:36:41 -0000
@@ -18,11 +18,14 @@
 #include <bitstring.h>
 #include <ctype.h>
 #include <limits.h>
+#include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <termios.h>
 
 #include "../common/common.h"
+#include "../cl/cl.h"
 #include "vi.h"
 
 #define        UPDATE_CURSOR   0x01                    /* Update the cursor. */
@@ -133,7 +136,7 @@
                        vs_resolve(tsp, sp, 0);
                }
        if (need_refresh)
-               (void)gp->scr_refresh(sp, 0);
+               (void)cl_refresh(sp, 0);
 
        /*
         * A side-effect of refreshing the screen is that it's now ready
@@ -156,7 +159,6 @@
 static int
 vs_paint(SCR *sp, u_int flags)
 {
-       GS *gp;
        SMAP *smp, tmp;
        VI_PRIVATE *vip;
        recno_t lastline, lcnt;
@@ -170,7 +172,6 @@
 #define        OCNO    vip->ocno               /* Remembered file column. */
 #define        SCNO    vip->sc_col             /* Current screen column. */
 
-       gp = sp->gp;
        vip = VIP(sp);
        didpaint = leftright_warp = 0;
 
@@ -270,12 +271,12 @@
                                                return (1);
                                }
                        else {
-small_fill:                    (void)gp->scr_move(sp, LASTLINE(sp), 0);
-                               (void)gp->scr_clrtoeol(sp);
+small_fill:                    (void)cl_move(sp, LASTLINE(sp), 0);
+                               (void)cl_clrtoeol(sp);
                                for (; sp->t_rows > sp->t_minrows;
                                    --sp->t_rows, --TMAP) {
-                                       (void)gp->scr_move(sp, TMAP - HMAP, 0);
-                                       (void)gp->scr_clrtoeol(sp);
+                                       (void)cl_move(sp, TMAP - HMAP, 0);
+                                       (void)cl_clrtoeol(sp);
                                }
                                if (vs_sm_fill(sp, LNO, P_FILL))
                                        return (1);
@@ -571,7 +572,7 @@
         *
         * We have the current column, retrieve the current row.
         */
-fast:  (void)gp->scr_cursor(sp, &y, &notused);
+fast:  (void)cl_cursor(sp, &y, &notused);
        goto done_cursor;
 
        /*
@@ -677,8 +678,8 @@
         */
        if (F_ISSET(sp, SC_SCR_REDRAW) && IS_SMALL(sp))
                for (cnt = sp->t_rows; cnt <= sp->t_maxrows; ++cnt) {
-                       (void)gp->scr_move(sp, cnt, 0);
-                       (void)gp->scr_clrtoeol(sp);
+                       (void)cl_move(sp, cnt, 0);
+                       (void)cl_clrtoeol(sp);
                }
 
        didpaint = 1;
@@ -731,7 +732,7 @@
                vs_modeline(sp);
 
        if (LF_ISSET(UPDATE_CURSOR)) {
-               (void)gp->scr_move(sp, y, SCNO);
+               (void)cl_move(sp, y, SCNO);
 
                /*
                 * XXX
@@ -746,7 +747,7 @@
        }
 
        if (LF_ISSET(UPDATE_SCREEN))
-               (void)gp->scr_refresh(sp, F_ISSET(vip, VIP_N_EX_PAINT));
+               (void)cl_refresh(sp, F_ISSET(vip, VIP_N_EX_PAINT));
 
        /* 12: Clear the flags that are handled by this routine. */
        F_CLR(sp, SC_SCR_CENTER | SC_SCR_REDRAW | SC_SCR_REFORMAT | SC_SCR_TOP);
@@ -776,7 +777,6 @@
                "218|Insert",                   /* SM_INSERT */
                "219|Replace",                  /* SM_REPLACE */
        };
-       GS *gp;
        size_t cols, curcol, curlen, endpoint, len, midpoint;
        const char *t = NULL;
        int ellipsis;
@@ -790,8 +790,6 @@
        if (sp->frp == NULL)
                return;
 
-       gp = sp->gp;
-
        /*
         * We put down the file name, the ruler, the mode and the dirty flag.
         * If there's not enough room, there's not enough room, we don't play
@@ -805,7 +803,7 @@
         *
         * Move to the last line on the screen.
         */
-       (void)gp->scr_move(sp, LASTLINE(sp), 0);
+       (void)cl_move(sp, LASTLINE(sp), 0);
 
        /* If more than one screen in the display, show the file name. */
        curlen = 0;
@@ -829,18 +827,17 @@
                }
                if (ellipsis) {
                        while (ellipsis--)
-                               (void)gp->scr_addstr(sp,
+                               (void)cl_addstr(sp,
                                    KEY_NAME(sp, '.'), KEY_LEN(sp, '.'));
-                       (void)gp->scr_addstr(sp,
+                       (void)cl_addstr(sp,
                            KEY_NAME(sp, ' '), KEY_LEN(sp, ' '));
                }
                for (; *p != '\0'; ++p)
-                       (void)gp->scr_addstr(sp,
-                           KEY_NAME(sp, *p), KEY_LEN(sp, *p));
+                       (void)cl_addstr(sp, KEY_NAME(sp, *p), KEY_LEN(sp, *p));
        }
 
        /* Clear the rest of the line. */
-       (void)gp->scr_clrtoeol(sp);
+       (void)cl_clrtoeol(sp);
 
        /*
         * Display the ruler.  If we're not at the midpoint yet, move there.
@@ -861,13 +858,13 @@
 
                midpoint = (cols - ((len + 1) / 2)) / 2;
                if (curlen < midpoint) {
-                       (void)gp->scr_move(sp, LASTLINE(sp), midpoint);
+                       (void)cl_move(sp, LASTLINE(sp), midpoint);
                        curlen += len;
                } else if (curlen + 2 + len < cols) {
-                       (void)gp->scr_addstr(sp, "  ", 2);
+                       (void)cl_addstr(sp, "  ", 2);
                        curlen += 2 + len;
                }
-               (void)gp->scr_addstr(sp, buf, len);
+               (void)cl_addstr(sp, buf, len);
        }
 
        /*
@@ -885,12 +882,12 @@
        }
 
        if (endpoint > curlen + 2) {
-               (void)gp->scr_move(sp, LASTLINE(sp), endpoint);
+               (void)cl_move(sp, LASTLINE(sp), endpoint);
                if (O_ISSET(sp, O_SHOWMODE)) {
                        if (F_ISSET(sp->ep, F_MODIFIED))
-                               (void)gp->scr_addstr(sp,
+                               (void)cl_addstr(sp,
                                    KEY_NAME(sp, '*'), KEY_LEN(sp, '*'));
-                       (void)gp->scr_addstr(sp, t, len);
+                       (void)cl_addstr(sp, t, len);
                }
        }
 }
Index: vi/vs_smap.c
===================================================================
RCS file: /cvs/src/usr.bin/vi/vi/vs_smap.c,v
retrieving revision 1.8
diff -u -r1.8 vs_smap.c
--- vi/vs_smap.c        12 Nov 2014 04:28:41 -0000      1.8
+++ vi/vs_smap.c        20 Nov 2014 20:36:41 -0000
@@ -17,11 +17,14 @@
 
 #include <bitstring.h>
 #include <limits.h>
+#include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <termios.h>
 
 #include "../common/common.h"
+#include "../cl/cl.h"
 #include "vi.h"
 
 static int     vs_deleteln(SCR *, int);
@@ -127,7 +130,7 @@
        }
 
        /* Save and restore the cursor for these routines. */
-       (void)sp->gp->scr_cursor(sp, &oldy, &oldx);
+       (void)cl_cursor(sp, &oldy, &oldx);
 
        switch (op) {
        case LINE_DELETE:
@@ -148,7 +151,7 @@
                abort();
        }
 
-       (void)sp->gp->scr_move(sp, oldy, oldx);
+       (void)cl_move(sp, oldy, oldx);
        return (0);
 }
 
@@ -310,7 +313,7 @@
        HANDLE_WEIRDNESS(cnt_orig);
 
        /* Delete that many lines from the screen. */
-       (void)sp->gp->scr_move(sp, p - HMAP, 0);
+       (void)cl_move(sp, p - HMAP, 0);
        if (vs_deleteln(sp, cnt_orig))
                return (1);
 
@@ -365,7 +368,7 @@
                cnt_orig = cnt;
 
        /* Push down that many lines. */
-       (void)sp->gp->scr_move(sp, p - HMAP, 0);
+       (void)cl_move(sp, p - HMAP, 0);
        if (vs_insertln(sp, cnt_orig))
                return (1);
 
@@ -438,7 +441,7 @@
 
                /* If there are any following lines, push them down. */
                if (cnt > 1) {
-                       (void)sp->gp->scr_move(sp, p - HMAP, 0);
+                       (void)cl_move(sp, p - HMAP, 0);
                        if (vs_insertln(sp, diff))
                                return (1);
 
@@ -460,7 +463,7 @@
                diff = cnt_orig - cnt_new;
 
                /* Delete that many lines from the screen. */
-               (void)sp->gp->scr_move(sp, p - HMAP, 0);
+               (void)cl_move(sp, p - HMAP, 0);
                if (vs_deleteln(sp, diff))
                        return (1);
 
@@ -737,7 +740,7 @@
         * Delete the top line of the screen.  Shift the screen map
         * up and display a new line at the bottom of the screen.
         */
-       (void)sp->gp->scr_move(sp, 0, 0);
+       (void)cl_move(sp, 0, 0);
        if (vs_deleteln(sp, 1))
                return (1);
 
@@ -762,19 +765,17 @@
 static int
 vs_deleteln(SCR *sp, int cnt)
 {
-       GS *gp;
        size_t oldy, oldx;
 
-       gp = sp->gp;
        if (IS_ONELINE(sp))
-               (void)gp->scr_clrtoeol(sp);
+               (void)cl_clrtoeol(sp);
        else {
-               (void)gp->scr_cursor(sp, &oldy, &oldx);
+               (void)cl_cursor(sp, &oldy, &oldx);
                while (cnt--) {
-                       (void)gp->scr_deleteln(sp);
-                       (void)gp->scr_move(sp, LASTLINE(sp), 0);
-                       (void)gp->scr_insertln(sp);
-                       (void)gp->scr_move(sp, oldy, oldx);
+                       (void)cl_deleteln(sp);
+                       (void)cl_move(sp, LASTLINE(sp), 0);
+                       (void)cl_insertln(sp);
+                       (void)cl_move(sp, oldy, oldx);
                }
        }
        return (0);
@@ -938,14 +939,11 @@
 static int
 vs_sm_erase(SCR *sp)
 {
-       GS *gp;
-
-       gp = sp->gp;
-       (void)gp->scr_move(sp, LASTLINE(sp), 0);
-       (void)gp->scr_clrtoeol(sp);
+       (void)cl_move(sp, LASTLINE(sp), 0);
+       (void)cl_clrtoeol(sp);
        for (; sp->t_rows > sp->t_minrows; --sp->t_rows, --TMAP) {
-               (void)gp->scr_move(sp, TMAP - HMAP, 0);
-               (void)gp->scr_clrtoeol(sp);
+               (void)cl_move(sp, TMAP - HMAP, 0);
+               (void)cl_clrtoeol(sp);
        }
        return (0);
 }
@@ -963,7 +961,7 @@
         * Insert a line at the top of the screen.  Shift the screen map
         * down and display a new line at the top of the screen.
         */
-       (void)sp->gp->scr_move(sp, 0, 0);
+       (void)cl_move(sp, 0, 0);
        if (vs_insertln(sp, 1))
                return (1);
 
@@ -988,20 +986,18 @@
 static int
 vs_insertln(SCR *sp, int cnt)
 {
-       GS *gp;
        size_t oldy, oldx;
 
-       gp = sp->gp;
        if (IS_ONELINE(sp)) {
-               (void)gp->scr_move(sp, LASTLINE(sp), 0);
-               (void)gp->scr_clrtoeol(sp);
+               (void)cl_move(sp, LASTLINE(sp), 0);
+               (void)cl_clrtoeol(sp);
        } else {
-               (void)gp->scr_cursor(sp, &oldy, &oldx);
+               (void)cl_cursor(sp, &oldy, &oldx);
                while (cnt--) {
-                       (void)gp->scr_move(sp, LASTLINE(sp) - 1, 0);
-                       (void)gp->scr_deleteln(sp);
-                       (void)gp->scr_move(sp, oldy, oldx);
-                       (void)gp->scr_insertln(sp);
+                       (void)cl_move(sp, LASTLINE(sp) - 1, 0);
+                       (void)cl_deleteln(sp);
+                       (void)cl_move(sp, oldy, oldx);
+                       (void)cl_insertln(sp);
                }
        }
        return (0);
Index: vi/vs_split.c
===================================================================
RCS file: /cvs/src/usr.bin/vi/vi/vs_split.c,v
retrieving revision 1.12
diff -u -r1.12 vs_split.c
--- vi/vs_split.c       12 Nov 2014 04:28:41 -0000      1.12
+++ vi/vs_split.c       20 Nov 2014 20:36:41 -0000
@@ -36,13 +36,10 @@
 int
 vs_split(SCR *sp, SCR *new, int ccl)
 {
-       GS *gp;
        SMAP *smp;
        size_t half;
        int issmallscreen, splitup;
 
-       gp = sp->gp;
-
        /* Check to see if it's possible. */
        /* XXX: The IS_ONELINE fix will change this, too. */
        if (sp->rows < 4) {
@@ -106,7 +103,7 @@
                sp->rows -= half;               /* Old. */
                new->woff = sp->woff + sp->rows;
                                                /* Link in after old. */
-               TAILQ_INSERT_AFTER(&gp->dq, sp, new, q);
+               TAILQ_INSERT_AFTER(&sp->gp->dq, sp, new, q);
        }
 
        /* Adjust maximum text count. */
@@ -458,11 +455,8 @@
 int
 vs_resize(SCR *sp, long count, adj_t adj)
 {
-       GS *gp;
        SCR *g, *s;
        size_t g_off, s_off;
-
-       gp = sp->gp;
 
        /*
         * Figure out which screens will grow, which will shrink, and

Reply via email to