diff options
author | peter <peter@FreeBSD.org> | 2013-08-11 20:03:12 +0000 |
---|---|---|
committer | peter <peter@FreeBSD.org> | 2013-08-11 20:03:12 +0000 |
commit | 5f2a1d653696ec5457bfd044f0ebcd873bfc3c80 (patch) | |
tree | 7c1ae67d07b93aea05bfea51c590c1112b65042b /contrib/nvi/ip | |
parent | 324febaf01918418f99998aa5537126ac98c9df0 (diff) | |
download | FreeBSD-src-5f2a1d653696ec5457bfd044f0ebcd873bfc3c80.zip FreeBSD-src-5f2a1d653696ec5457bfd044f0ebcd873bfc3c80.tar.gz |
Update nvi-1.79 to 2.1.1-4334a8297f
This is the gsoc-2011 project to clean up and backport multibyte support
from other nvi forks in a form we can use.
USE_WIDECHAR is on unless building for the rescue crunchgen. This should
allow editing in the native locale encoding.
USE_ICONV depends on make.conf having 'WITH_ICONV=YES' for now. This
adds the ability to do things like edit a KOI8-R file while having $LANG
set to (say) en_US.UTF-8. iconv is used to transcode the characters for
display.
Other points:
* It uses gencat and catopen/etc instead of homegrown msg catalog stuff.
* A lot of stuff has been trimmed out, eg: the perl and tcl bindings which
we could never use in base anyway.
* It uses ncursesw when in widechar mode. This could be interesting.
GSoC info: http://www.google-melange.com/gsoc/proposal/review/google/gsoc2011/zy/1
Repo at: https://github.com/lichray/nvi2
Obtained from: Zhihao Yuan <lichray@gmail.com>
Diffstat (limited to 'contrib/nvi/ip')
-rw-r--r-- | contrib/nvi/ip/IP_INSTRUCTIONS | 41 | ||||
-rw-r--r-- | contrib/nvi/ip/ip.h | 92 | ||||
-rw-r--r-- | contrib/nvi/ip/ip_funcs.c | 443 | ||||
-rw-r--r-- | contrib/nvi/ip/ip_main.c | 165 | ||||
-rw-r--r-- | contrib/nvi/ip/ip_read.c | 307 | ||||
-rw-r--r-- | contrib/nvi/ip/ip_screen.c | 87 | ||||
-rw-r--r-- | contrib/nvi/ip/ip_term.c | 108 |
7 files changed, 0 insertions, 1243 deletions
diff --git a/contrib/nvi/ip/IP_INSTRUCTIONS b/contrib/nvi/ip/IP_INSTRUCTIONS deleted file mode 100644 index 7745c88..0000000 --- a/contrib/nvi/ip/IP_INSTRUCTIONS +++ /dev/null @@ -1,41 +0,0 @@ -1: Add: - -DRUNNING_IP - - to the Makefile CFLAGS line and rebuild cl_main.o if it's already - been compiled. - -2: Add: - - IPOBJS= ip_funcs.o ip_main.o ip_read.o ip_screen.o ip_term.o - - after the other object lists in the Makefile. - -3: Add - $(IPOBJS) - - to the end of the NVIALL= line in the Makefile. - -4: Add: - - # Vi IP sources. - ip_funcs.o: $(srcdir)/ip/ip_funcs.c - $(CC) $(CFLAGS) $? - ip_main.o: $(srcdir)/ip/ip_main.c - $(CC) $(CFLAGS) $? - ip_read.o: $(srcdir)/ip/ip_read.c - $(CC) $(CFLAGS) $? - ip_screen.o: $(srcdir)/ip/ip_screen.c - $(CC) $(CFLAGS) $? - ip_term.o: $(srcdir)/ip/ip_term.c - $(CC) $(CFLAGS) $? - - at the end of the Makefile. - -5: Remove cl_main.o if it exists, and make nvi. - -6: Go to ip_cl and change the entries in the Makefile to reflect - where the nvi binary was just built. - -7: Build ip_cl. - -8: Enter ip_cl and you should be running vi over a pipe. diff --git a/contrib/nvi/ip/ip.h b/contrib/nvi/ip/ip.h deleted file mode 100644 index f7798c3..0000000 --- a/contrib/nvi/ip/ip.h +++ /dev/null @@ -1,92 +0,0 @@ -/*- - * Copyright (c) 1996 - * Keith Bostic. All rights reserved. - * - * See the LICENSE file for redistribution information. - * - * @(#)ip.h 8.3 (Berkeley) 10/13/96 - */ - -typedef struct _ip_private { - int i_fd; /* Input file descriptor. */ - int o_fd; /* Output file descriptor. */ - - size_t row; /* Current row. */ - size_t col; /* Current column. */ - - size_t iblen; /* Input buffer length. */ - size_t iskip; /* Returned input buffer. */ - char ibuf[256]; /* Input buffer. */ - -#define IP_SCR_VI_INIT 0x0001 /* Vi screen initialized. */ - u_int32_t flags; -} IP_PRIVATE; - -#define IPP(sp) ((IP_PRIVATE *)((sp)->gp->ip_private)) -#define GIPP(gp) ((IP_PRIVATE *)((gp)->ip_private)) - -/* The screen line relative to a specific window. */ -#define RLNO(sp, lno) (sp)->woff + (lno) - -/* - * The IP protocol consists of frames, each containing: - * - * <IPO_><object> - * - * XXX - * We should have a marking byte, 0xaa to delimit frames. - * - */ -#define IPO_CODE 1 /* An event specification. */ -#define IPO_INT 2 /* 4-byte, network order integer. */ -#define IPO_STR 3 /* IPO_INT: followed by N bytes. */ - -#define IPO_CODE_LEN 1 -#define IPO_INT_LEN 4 - -/* A structure that can hold the information for any frame. */ -typedef struct _ip_buf { - int code; /* Event code. */ - const char *str; /* String. */ - size_t len; /* String length. */ - u_int32_t val1; /* First value. */ - u_int32_t val2; /* Second value. */ -} IP_BUF; - -/* - * Screen/editor IP_CODE's. - * - * The program structure depends on the event loop being able to return - * IPO_EOF/IPOE_ERR multiple times -- eventually enough things will end - * due to the events that vi will reach the command level for the screen, - * at which point the exit flags will be set and vi will exit. - * - * IP events sent from the screen to vi. - */ -#define IPO_EOF 1 /* End of input (NOT ^D). */ -#define IPO_ERR 2 /* Input error. */ -#define IPO_INTERRUPT 3 /* Interrupt. */ -#define IPO_QUIT 4 /* Quit. */ -#define IPO_RESIZE 5 /* Screen resize: IPO_INT, IPO_INT. */ -#define IPO_SIGHUP 6 /* SIGHUP. */ -#define IPO_SIGTERM 7 /* SIGTERM. */ -#define IPO_STRING 8 /* Input string: IPO_STR. */ -#define IPO_WRITE 9 /* Write. */ - -/* - * IP events sent from vi to the screen. - */ -#define IPO_ADDSTR 1 /* Add a string: IPO_STR. */ -#define IPO_ATTRIBUTE 2 /* Set screen attribute: IPO_INT, IPO_INT. */ -#define IPO_BELL 3 /* Beep/bell/flash the terminal. */ -#define IPO_BUSY 4 /* Display a busy message: IPO_STR. */ -#define IPO_CLRTOEOL 5 /* Clear to the end of the line. */ -#define IPO_DELETELN 6 /* Delete a line. */ -#define IPO_INSERTLN 7 /* Insert a line. */ -#define IPO_MOVE 8 /* Move the cursor: IPO_INT, IPO_INT. */ -#define IPO_REDRAW 9 /* Redraw the screen. */ -#define IPO_REFRESH 10 /* Refresh the screen. */ -#define IPO_RENAME 11 /* Rename the screen: IPO_STR. */ -#define IPO_REWRITE 12 /* Rewrite a line: IPO_INT. */ - -#include "ip_extern.h" diff --git a/contrib/nvi/ip/ip_funcs.c b/contrib/nvi/ip/ip_funcs.c deleted file mode 100644 index c92f1ed..0000000 --- a/contrib/nvi/ip/ip_funcs.c +++ /dev/null @@ -1,443 +0,0 @@ -/*- - * Copyright (c) 1996 - * Keith Bostic. All rights reserved. - * - * See the LICENSE file for redistribution information. - */ - -#include "config.h" - -#ifndef lint -static const char sccsid[] = "@(#)ip_funcs.c 8.4 (Berkeley) 10/13/96"; -#endif /* not lint */ - -#include <sys/types.h> -#include <sys/queue.h> -#include <sys/time.h> - -#include <bitstring.h> -#include <stdio.h> - -#include "../common/common.h" -#include "../vi/vi.h" -#include "ip.h" - -static int ip_send __P((SCR *, char *, IP_BUF *)); - -/* - * ip_addstr -- - * Add len bytes from the string at the cursor, advancing the cursor. - * - * PUBLIC: int ip_addstr __P((SCR *, const char *, size_t)); - */ -int -ip_addstr(sp, str, len) - SCR *sp; - const char *str; - size_t len; -{ - IP_BUF ipb; - IP_PRIVATE *ipp; - int iv, rval; - - ipp = IPP(sp); - - /* - * If ex isn't in control, it's the last line of the screen and - * it's a split screen, use inverse video. - */ - iv = 0; - if (!F_ISSET(sp, SC_SCR_EXWROTE) && - ipp->row == LASTLINE(sp) && IS_SPLIT(sp)) { - iv = 1; - ip_attr(sp, SA_INVERSE, 1); - } - ipb.code = IPO_ADDSTR; - ipb.len = len; - ipb.str = str; - rval = ip_send(sp, "s", &ipb); - - if (iv) - ip_attr(sp, SA_INVERSE, 0); - return (rval); -} - -/* - * ip_attr -- - * Toggle a screen attribute on/off. - * - * PUBLIC: int ip_attr __P((SCR *, scr_attr_t, int)); - */ -int -ip_attr(sp, attribute, on) - SCR *sp; - scr_attr_t attribute; - int on; -{ - IP_BUF ipb; - - ipb.code = IPO_ATTRIBUTE; - ipb.val1 = attribute; - ipb.val2 = on; - - return (ip_send(sp, "12", &ipb)); -} - -/* - * ip_baud -- - * Return the baud rate. - * - * PUBLIC: int ip_baud __P((SCR *, u_long *)); - */ -int -ip_baud(sp, ratep) - SCR *sp; - u_long *ratep; -{ - *ratep = 9600; /* XXX: Translation: fast. */ - return (0); -} - -/* - * ip_bell -- - * Ring the bell/flash the screen. - * - * PUBLIC: int ip_bell __P((SCR *)); - */ -int -ip_bell(sp) - SCR *sp; -{ - IP_BUF ipb; - - ipb.code = IPO_BELL; - - return (ip_send(sp, NULL, &ipb)); -} - -/* - * ip_busy -- - * Display a busy message. - * - * PUBLIC: void ip_busy __P((SCR *, const char *, busy_t)); - */ -void -ip_busy(sp, str, bval) - SCR *sp; - const char *str; - busy_t bval; -{ - IP_BUF ipb; - - ipb.code = IPO_BUSY; - if (str == NULL) { - ipb.len = 0; - ipb.str = ""; - } else { - ipb.len = strlen(str); - ipb.str = str; - } - ipb.val1 = bval; - - (void)ip_send(sp, "s1", &ipb); -} - -/* - * ip_clrtoeol -- - * Clear from the current cursor to the end of the line. - * - * PUBLIC: int ip_clrtoeol __P((SCR *)); - */ -int -ip_clrtoeol(sp) - SCR *sp; -{ - IP_BUF ipb; - - ipb.code = IPO_CLRTOEOL; - - return (ip_send(sp, NULL, &ipb)); -} - -/* - * ip_cursor -- - * Return the current cursor position. - * - * PUBLIC: int ip_cursor __P((SCR *, size_t *, size_t *)); - */ -int -ip_cursor(sp, yp, xp) - SCR *sp; - size_t *yp, *xp; -{ - IP_PRIVATE *ipp; - - ipp = IPP(sp); - *yp = ipp->row; - *xp = ipp->col; - return (0); -} - -/* - * ip_deleteln -- - * Delete the current line, scrolling all lines below it. - * - * PUBLIC: int ip_deleteln __P((SCR *)); - */ -int -ip_deleteln(sp) - SCR *sp; -{ - IP_BUF ipb; - - /* - * This clause is required because the curses screen uses reverse - * video to delimit split screens. If the screen does not do this, - * this code won't be necessary. - * - * If the bottom line was in reverse video, rewrite it in normal - * video before it's scrolled. - */ - if (!F_ISSET(sp, SC_SCR_EXWROTE) && IS_SPLIT(sp)) { - ipb.code = IPO_REWRITE; - ipb.val1 = RLNO(sp, LASTLINE(sp)); - if (ip_send(sp, "1", &ipb)) - return (1); - } - - /* - * The bottom line is expected to be blank after this operation, - * and other screens must support that semantic. - */ - ipb.code = IPO_DELETELN; - return (ip_send(sp, NULL, &ipb)); -} - -/* - * ip_ex_adjust -- - * Adjust the screen for ex. - * - * PUBLIC: int ip_ex_adjust __P((SCR *, exadj_t)); - */ -int -ip_ex_adjust(sp, action) - SCR *sp; - exadj_t action; -{ - abort(); - /* NOTREACHED */ -} - -/* - * ip_insertln -- - * Push down the current line, discarding the bottom line. - * - * PUBLIC: int ip_insertln __P((SCR *)); - */ -int -ip_insertln(sp) - SCR *sp; -{ - IP_BUF ipb; - - ipb.code = IPO_INSERTLN; - - return (ip_send(sp, NULL, &ipb)); -} - -/* - * ip_keyval -- - * Return the value for a special key. - * - * PUBLIC: int ip_keyval __P((SCR *, scr_keyval_t, CHAR_T *, int *)); - */ -int -ip_keyval(sp, val, chp, dnep) - SCR *sp; - scr_keyval_t val; - CHAR_T *chp; - int *dnep; -{ - /* - * VEOF, VERASE and VKILL are required by POSIX 1003.1-1990, - * VWERASE is a 4BSD extension. - */ - switch (val) { - case KEY_VEOF: - *dnep = '\004'; /* ^D */ - break; - case KEY_VERASE: - *dnep = '\b'; /* ^H */ - break; - case KEY_VKILL: - *dnep = '\025'; /* ^U */ - break; -#ifdef VWERASE - case KEY_VWERASE: - *dnep = '\027'; /* ^W */ - break; -#endif - default: - *dnep = 1; - break; - } - return (0); -} - -/* - * ip_move -- - * Move the cursor. - * - * PUBLIC: int ip_move __P((SCR *, size_t, size_t)); - */ -int -ip_move(sp, lno, cno) - SCR *sp; - size_t lno, cno; -{ - IP_PRIVATE *ipp; - IP_BUF ipb; - - ipp = IPP(sp); - ipp->row = lno; - ipp->col = cno; - - ipb.code = IPO_MOVE; - ipb.val1 = RLNO(sp, lno); - ipb.val2 = cno; - return (ip_send(sp, "12", &ipb)); -} - -/* - * ip_refresh -- - * Refresh the screen. - * - * PUBLIC: int ip_refresh __P((SCR *, int)); - */ -int -ip_refresh(sp, repaint) - SCR *sp; - int repaint; -{ - IP_BUF ipb; - - ipb.code = repaint ? IPO_REDRAW : IPO_REFRESH; - - return (ip_send(sp, NULL, &ipb)); -} - -/* - * ip_rename -- - * Rename the file. - * - * PUBLIC: int ip_rename __P((SCR *)); - */ -int -ip_rename(sp) - SCR *sp; -{ - IP_BUF ipb; - - ipb.code = IPO_RENAME; - ipb.len = strlen(sp->frp->name); - ipb.str = sp->frp->name; - - return (ip_send(sp, "s", &ipb)); -} - -/* - * ip_suspend -- - * Suspend a screen. - * - * PUBLIC: int ip_suspend __P((SCR *, int *)); - */ -int -ip_suspend(sp, allowedp) - SCR *sp; - int *allowedp; -{ - *allowedp = 0; - return (0); -} - -/* - * ip_usage -- - * Print out the ip usage messages. - * - * PUBLIC: void ip_usage __P((void)); - */ -void -ip_usage() -{ -#define USAGE "\ -usage: vi [-eFlRrSv] [-c command] [-I ifd.ofd] [-t tag] [-w size] [file ...]\n" - (void)fprintf(stderr, "%s", USAGE); -#undef USAGE -} - -/* - * ip_send -- - * Construct and send an IP buffer. - */ -static int -ip_send(sp, fmt, ipbp) - SCR *sp; - char *fmt; - IP_BUF *ipbp; -{ - IP_PRIVATE *ipp; - size_t blen, off; - u_int32_t ilen; - int nlen, n, nw, rval; - char *bp, *p; - - ipp = IPP(sp); - - GET_SPACE_RET(sp, bp, blen, 128); - - p = bp; - nlen = 0; - *p++ = ipbp->code; - nlen += IPO_CODE_LEN; - - if (fmt != NULL) - for (; *fmt != '\0'; ++fmt) - switch (*fmt) { - case '1': /* Value 1. */ - ilen = htonl(ipbp->val1); - goto value; - case '2': /* Value 2. */ - ilen = htonl(ipbp->val2); -value: nlen += IPO_INT_LEN; - off = p - bp; - ADD_SPACE_RET(sp, bp, blen, nlen); - p = bp + off; - memmove(p, &ilen, IPO_INT_LEN); - p += IPO_INT_LEN; - break; - case 's': /* String. */ - ilen = ipbp->len; /* XXX: conversion. */ - ilen = htonl(ilen); - nlen += IPO_INT_LEN + ipbp->len; - off = p - bp; - ADD_SPACE_RET(sp, bp, blen, nlen); - p = bp + off; - memmove(p, &ilen, IPO_INT_LEN); - p += IPO_INT_LEN; - memmove(p, ipbp->str, ipbp->len); - p += ipbp->len; - break; - } - - - rval = 0; - for (n = p - bp, p = bp; n > 0; n -= nw, p += nw) - if ((nw = write(ipp->o_fd, p, n)) < 0) { - rval = 1; - break; - } - - FREE_SPACE(sp, bp, blen); - - return (rval); -} diff --git a/contrib/nvi/ip/ip_main.c b/contrib/nvi/ip/ip_main.c deleted file mode 100644 index 7ca9f55..0000000 --- a/contrib/nvi/ip/ip_main.c +++ /dev/null @@ -1,165 +0,0 @@ -/*- - * Copyright (c) 1996 - * Keith Bostic. All rights reserved. - * - * See the LICENSE file for redistribution information. - */ - -#include "config.h" - -#ifndef lint -static const char sccsid[] = "@(#)ip_main.c 8.3 (Berkeley) 10/13/96"; -#endif /* not lint */ - -#include <sys/types.h> -#include <sys/queue.h> - -#include <bitstring.h> -#include <ctype.h> -#include <errno.h> -#include <stdio.h> - -#include "../common/common.h" -#include "ip.h" - -static void ip_func_std __P((GS *)); -static IP_PRIVATE *ip_init __P((GS *, char *)); -static void perr __P((char *, char *)); - -/* - * main -- - * This is the main loop for the vi-as-library editor. - */ -int -ip_main(argc, argv, gp, ip_arg) - int argc; - char *argv[], *ip_arg; - GS *gp; -{ - EVENT ev; - IP_PRIVATE *ipp; - IP_BUF ipb; - int rval; - - /* Create and partially initialize the IP structure. */ - if ((ipp = ip_init(gp, ip_arg)) == NULL) - return (1); - - /* Add the terminal type to the global structure. */ - if ((OG_D_STR(gp, GO_TERM) = - OG_STR(gp, GO_TERM) = strdup("ip_curses")) == NULL) - perr(gp->progname, NULL); - - /* - * Figure out how big the screen is -- read events until we get - * the rows and columns. - */ - do { - if (ip_event(NULL, &ev, 0, 0)) - return (1); - } while (ev.e_event != E_EOF && ev.e_event != E_ERR && - ev.e_event != E_QUIT && ev.e_event != E_WRESIZE && - ev.e_event != E_SIGHUP && ev.e_event != E_SIGTERM); - if (ev.e_event != E_WRESIZE) - return (1); - - /* Run ex/vi. */ - rval = editor(gp, argc, argv); - - /* Clean up the screen. */ - (void)ip_quit(gp); - - /* Free the global and IP private areas. */ -#if defined(DEBUG) || defined(PURIFY) || defined(LIBRARY) - free(ipp); - free(gp); -#endif - - return (rval); -} - -/* - * ip_init -- - * Create and partially initialize the GS structure. - */ -static IP_PRIVATE * -ip_init(gp, ip_arg) - GS *gp; - char *ip_arg; -{ - IP_PRIVATE *ipp; - char *ep; - - /* Allocate the IP private structure. */ - CALLOC_NOMSG(NULL, ipp, IP_PRIVATE *, 1, sizeof(IP_PRIVATE)); - if (ipp == NULL) - perr(gp->progname, NULL); - gp->ip_private = ipp; - - /* - * Crack ip_arg -- it's of the form #.#, where the first number is the - * file descriptor from the screen, the second is the file descriptor - * to the screen. - */ - if (!isdigit(ip_arg[0])) - goto usage; - ipp->i_fd = strtol(ip_arg, &ep, 10); - if (ep[0] != '.' || !isdigit(ep[1])) - goto usage; - ipp->o_fd = strtol(++ep, &ep, 10); - if (ep[0] != '\0') { -usage: ip_usage(); - return (NULL); - } - - /* Initialize the list of ip functions. */ - ip_func_std(gp); - - return (ipp); -} - -/* - * ip_func_std -- - * Initialize the standard ip functions. - */ -static void -ip_func_std(gp) - GS *gp; -{ - gp->scr_addstr = ip_addstr; - gp->scr_attr = ip_attr; - gp->scr_baud = ip_baud; - gp->scr_bell = ip_bell; - gp->scr_busy = ip_busy; - gp->scr_clrtoeol = ip_clrtoeol; - gp->scr_cursor = ip_cursor; - gp->scr_deleteln = ip_deleteln; - gp->scr_event = ip_event; - gp->scr_ex_adjust = ip_ex_adjust; - gp->scr_fmap = ip_fmap; - gp->scr_insertln = ip_insertln; - gp->scr_keyval = ip_keyval; - gp->scr_move = ip_move; - gp->scr_msg = NULL; - gp->scr_optchange = ip_optchange; - gp->scr_refresh = ip_refresh; - gp->scr_rename = ip_rename; - gp->scr_screen = ip_screen; - gp->scr_suspend = ip_suspend; - gp->scr_usage = ip_usage; -} - -/* - * perr -- - * Print system error. - */ -static void -perr(name, msg) - char *name, *msg; -{ - (void)fprintf(stderr, "%s:", name); - if (msg != NULL) - (void)fprintf(stderr, "%s:", msg); - (void)fprintf(stderr, "%s\n", strerror(errno)); - exit(1); -} diff --git a/contrib/nvi/ip/ip_read.c b/contrib/nvi/ip/ip_read.c deleted file mode 100644 index 9fd9777..0000000 --- a/contrib/nvi/ip/ip_read.c +++ /dev/null @@ -1,307 +0,0 @@ -/*- - * Copyright (c) 1996 - * Keith Bostic. All rights reserved. - * - * See the LICENSE file for redistribution information. - */ - -#include "config.h" - -#ifndef lint -static const char sccsid[] = "@(#)ip_read.c 8.3 (Berkeley) 9/24/96"; -#endif /* not lint */ - -#include <sys/types.h> -#include <sys/queue.h> - -#include <bitstring.h> -#include <stdio.h> -#include <termios.h> -#include <time.h> - -#include "../common/common.h" -#include "../ex/script.h" -#include "ip.h" - -extern GS *__global_list; - -typedef enum { INP_OK=0, INP_EOF, INP_ERR, INP_TIMEOUT } input_t; - -static input_t ip_read __P((SCR *, IP_PRIVATE *, struct timeval *)); -static int ip_resize __P((SCR *, size_t, size_t)); -static int ip_trans __P((SCR *, IP_PRIVATE *, EVENT *)); - -/* - * ip_event -- - * Return a single event. - * - * PUBLIC: int ip_event __P((SCR *, EVENT *, u_int32_t, int)); - */ -int -ip_event(sp, evp, flags, ms) - SCR *sp; - EVENT *evp; - u_int32_t flags; - int ms; -{ - IP_PRIVATE *ipp; - struct timeval t, *tp; - - if (LF_ISSET(EC_INTERRUPT)) { /* XXX */ - evp->e_event = E_TIMEOUT; - return (0); - } - - ipp = sp == NULL ? GIPP(__global_list) : IPP(sp); - - /* Discard the last command. */ - if (ipp->iskip != 0) { - ipp->iblen -= ipp->iskip; - memmove(ipp->ibuf, ipp->ibuf + ipp->iskip, ipp->iblen); - ipp->iskip = 0; - } - - /* Set timer. */ - if (ms == 0) - tp = NULL; - else { - t.tv_sec = ms / 1000; - t.tv_usec = (ms % 1000) * 1000; - tp = &t; - } - - /* Read input events. */ - for (;;) { - switch (ip_read(sp, ipp, tp)) { - case INP_OK: - if (!ip_trans(sp, ipp, evp)) - continue; - break; - case INP_EOF: - evp->e_event = E_EOF; - break; - case INP_ERR: - evp->e_event = E_ERR; - break; - case INP_TIMEOUT: - evp->e_event = E_TIMEOUT; - break; - default: - abort(); - } - break; - } - return (0); -} - -/* - * ip_read -- - * Read characters from the input. - */ -static input_t -ip_read(sp, ipp, tp) - SCR *sp; - IP_PRIVATE *ipp; - struct timeval *tp; -{ - struct timeval poll; - GS *gp; - SCR *tsp; - fd_set rdfd; - input_t rval; - size_t blen; - int maxfd, nr; - char *bp; - - gp = sp == NULL ? __global_list : sp->gp; - bp = ipp->ibuf + ipp->iblen; - blen = sizeof(ipp->ibuf) - ipp->iblen; - - /* - * 1: A read with an associated timeout, e.g., trying to complete - * a map sequence. If input exists, we fall into #2. - */ - FD_ZERO(&rdfd); - poll.tv_sec = 0; - poll.tv_usec = 0; - if (tp != NULL) { - FD_SET(ipp->i_fd, &rdfd); - switch (select(ipp->i_fd + 1, - &rdfd, NULL, NULL, tp == NULL ? &poll : tp)) { - case 0: - return (INP_TIMEOUT); - case -1: - goto err; - default: - break; - } - } - - /* - * 2: Wait for input. - * - * Select on the command input and scripting window file descriptors. - * 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 (sp != NULL && F_ISSET(gp, G_SCRWIN)) { -loop: FD_ZERO(&rdfd); - FD_SET(ipp->i_fd, &rdfd); - maxfd = ipp->i_fd; - for (tsp = gp->dq.cqh_first; - tsp != (void *)&gp->dq; tsp = tsp->q.cqe_next) - if (F_ISSET(sp, SC_SCRIPT)) { - FD_SET(sp->script->sh_master, &rdfd); - if (sp->script->sh_master > maxfd) - maxfd = sp->script->sh_master; - } - switch (select(maxfd + 1, &rdfd, NULL, NULL, NULL)) { - case 0: - abort(); - case -1: - goto err; - default: - break; - } - if (!FD_ISSET(ipp->i_fd, &rdfd)) { - if (sscr_input(sp)) - return (INP_ERR); - goto loop; - } - } - - /* - * 3: Read the input. - */ - switch (nr = read(ipp->i_fd, bp, blen)) { - case 0: /* EOF. */ - rval = INP_EOF; - break; - case -1: /* Error or interrupt. */ -err: rval = INP_ERR; - msgq(sp, M_SYSERR, "input"); - break; - default: /* Input characters. */ - ipp->iblen += nr; - rval = INP_OK; - break; - } - return (rval); -} - -/* - * ip_trans -- - * Translate messages into events. - */ -static int -ip_trans(sp, ipp, evp) - SCR *sp; - IP_PRIVATE *ipp; - EVENT *evp; -{ - u_int32_t val1, val2; - - switch (ipp->ibuf[0]) { - case IPO_EOF: - evp->e_event = E_EOF; - ipp->iskip = IPO_CODE_LEN; - return (1); - case IPO_ERR: - evp->e_event = E_ERR; - ipp->iskip = IPO_CODE_LEN; - return (1); - case IPO_INTERRUPT: - evp->e_event = E_INTERRUPT; - ipp->iskip = IPO_CODE_LEN; - return (1); - case IPO_QUIT: - evp->e_event = E_QUIT; - ipp->iskip = IPO_CODE_LEN; - return (1); - case IPO_RESIZE: - if (ipp->iblen < IPO_CODE_LEN + IPO_INT_LEN * 2) - return (0); - evp->e_event = E_WRESIZE; - memcpy(&val1, ipp->ibuf + IPO_CODE_LEN, IPO_INT_LEN); - val1 = ntohl(val1); - memcpy(&val2, - ipp->ibuf + IPO_CODE_LEN + IPO_INT_LEN, IPO_INT_LEN); - val2 = ntohl(val2); - ip_resize(sp, val1, val2); - ipp->iskip = IPO_CODE_LEN + IPO_INT_LEN * 2; - return (1); - case IPO_SIGHUP: - evp->e_event = E_SIGHUP; - ipp->iskip = IPO_CODE_LEN; - return (1); - case IPO_SIGTERM: - evp->e_event = E_SIGTERM; - ipp->iskip = IPO_CODE_LEN; - return (1); - case IPO_STRING: - evp->e_event = E_STRING; -string: if (ipp->iblen < IPO_CODE_LEN + IPO_INT_LEN) - return (0); - memcpy(&val1, ipp->ibuf + IPO_CODE_LEN, IPO_INT_LEN); - val1 = ntohl(val1); - if (ipp->iblen < IPO_CODE_LEN + IPO_INT_LEN + val1) - return (0); - ipp->iskip = IPO_CODE_LEN + IPO_INT_LEN + val1; - evp->e_csp = ipp->ibuf + IPO_CODE_LEN + IPO_INT_LEN; - evp->e_len = val1; - return (1); - case IPO_WRITE: - evp->e_event = E_WRITE; - ipp->iskip = IPO_CODE_LEN; - return (1); - default: - /* - * XXX: Protocol is out of sync? - */ - abort(); - } - /* NOTREACHED */ -} - -/* - * ip_resize -- - * Reset the options for a resize event. - */ -static int -ip_resize(sp, lines, columns) - SCR *sp; - size_t lines, columns; -{ - GS *gp; - ARGS *argv[2], a, b; - char b1[1024]; - - /* - * XXX - * The IP screen has to know the lines and columns before anything - * else happens. So, we may not have a valid SCR pointer, and we - * have to deal with that. - */ - if (sp == NULL) { - gp = __global_list; - OG_VAL(gp, GO_LINES) = OG_D_VAL(gp, GO_LINES) = lines; - OG_VAL(gp, GO_COLUMNS) = OG_D_VAL(gp, GO_COLUMNS) = columns; - return (0); - } - - a.bp = b1; - b.bp = NULL; - a.len = b.len = 0; - argv[0] = &a; - argv[1] = &b; - - (void)snprintf(b1, sizeof(b1), "lines=%lu", (u_long)lines); - a.len = strlen(b1); - if (opts_set(sp, argv, NULL)) - return (1); - (void)snprintf(b1, sizeof(b1), "columns=%lu", (u_long)columns); - a.len = strlen(b1); - if (opts_set(sp, argv, NULL)) - return (1); - return (0); -} diff --git a/contrib/nvi/ip/ip_screen.c b/contrib/nvi/ip/ip_screen.c deleted file mode 100644 index 71578e0..0000000 --- a/contrib/nvi/ip/ip_screen.c +++ /dev/null @@ -1,87 +0,0 @@ -/*- - * Copyright (c) 1996 - * Keith Bostic. All rights reserved. - * - * See the LICENSE file for redistribution information. - */ - -#include "config.h" - -#ifndef lint -static const char sccsid[] = "@(#)ip_screen.c 8.2 (Berkeley) 10/13/96"; -#endif /* not lint */ - -#include <sys/types.h> -#include <sys/queue.h> - -#include <bitstring.h> -#include <stdio.h> - -#include "../common/common.h" -#include "ip.h" - -/* - * ip_screen -- - * Initialize/shutdown the IP screen. - * - * PUBLIC: int ip_screen __P((SCR *, u_int32_t)); - */ -int -ip_screen(sp, flags) - SCR *sp; - u_int32_t flags; -{ - GS *gp; - IP_PRIVATE *ipp; - - gp = sp->gp; - ipp = IPP(sp); - - /* See if the current information is incorrect. */ - if (F_ISSET(gp, G_SRESTART)) { - if (ip_quit(gp)) - return (1); - F_CLR(gp, G_SRESTART); - } - - /* See if we're already in the right mode. */ - if (LF_ISSET(SC_VI) && F_ISSET(ipp, IP_SCR_VI_INIT)) - return (0); - - /* Ex isn't possible. */ - if (LF_ISSET(SC_EX)) - return (1); - - /* Initialize terminal based information. */ - if (ip_term_init(sp)) - return (1); - - /* Put up the first file name. */ - if (ip_rename(sp)) - return (1); - - F_SET(ipp, IP_SCR_VI_INIT); - return (0); -} - -/* - * ip_quit -- - * Shutdown the screens. - * - * PUBLIC: int ip_quit __P((GS *)); - */ -int -ip_quit(gp) - GS *gp; -{ - IP_PRIVATE *ipp; - int rval; - - /* Clean up the terminal mappings. */ - rval = ip_term_end(gp); - - ipp = GIPP(gp); - F_CLR(ipp, IP_SCR_VI_INIT); - - return (rval); -} diff --git a/contrib/nvi/ip/ip_term.c b/contrib/nvi/ip/ip_term.c deleted file mode 100644 index 28e686d..0000000 --- a/contrib/nvi/ip/ip_term.c +++ /dev/null @@ -1,108 +0,0 @@ -/*- - * Copyright (c) 1996 - * Keith Bostic. All rights reserved. - * - * See the LICENSE file for redistribution information. - */ - -#include "config.h" - -#ifndef lint -static const char sccsid[] = "@(#)ip_term.c 8.2 (Berkeley) 10/13/96"; -#endif /* not lint */ - -#include <sys/types.h> -#include <sys/queue.h> - -#include <bitstring.h> -#include <stdio.h> - -#include "../common/common.h" -#include "ip.h" - -/* - * ip_term_init -- - * Initialize the terminal special keys. - * - * PUBLIC: int ip_term_init __P((SCR *)); - */ -int -ip_term_init(sp) - SCR *sp; -{ - SEQ *qp; - - /* - * Rework any function key mappings that were set before the - * screen was initialized. - */ - for (qp = sp->gp->seqq.lh_first; qp != NULL; qp = qp->q.le_next) - if (F_ISSET(qp, SEQ_FUNCMAP)) - (void)ip_fmap(sp, qp->stype, - qp->input, qp->ilen, qp->output, qp->olen); - return (0); -} - -/* - * ip_term_end -- - * End the special keys defined by the termcap/terminfo entry. - * - * PUBLIC: int ip_term_end __P((GS *)); - */ -int -ip_term_end(gp) - GS *gp; -{ - SEQ *qp, *nqp; - - /* Delete screen specific mappings. */ - for (qp = gp->seqq.lh_first; qp != NULL; qp = nqp) { - nqp = qp->q.le_next; - if (F_ISSET(qp, SEQ_SCREEN)) - (void)seq_mdel(qp); - } - return (0); -} - -/* - * ip_fmap -- - * Map a function key. - * - * PUBLIC: int ip_fmap __P((SCR *, seq_t, CHAR_T *, size_t, CHAR_T *, size_t)); - */ -int -ip_fmap(sp, stype, from, flen, to, tlen) - SCR *sp; - seq_t stype; - CHAR_T *from, *to; - size_t flen, tlen; -{ - /* Bind a function key to a string sequence. */ - return (1); -} - -/* - * ip_optchange -- - * IP screen specific "option changed" routine. - * - * PUBLIC: int ip_optchange __P((SCR *, int, char *, u_long *)); - */ -int -ip_optchange(sp, opt, str, valp) - SCR *sp; - int opt; - char *str; - u_long *valp; -{ - switch (opt) { - case O_COLUMNS: - case O_LINES: - F_SET(sp->gp, G_SRESTART); - F_CLR(sp, SC_SCR_EX | SC_SCR_VI); - break; - case O_TERM: - msgq(sp, M_ERR, "The screen type may not be changed"); - return (1); - } - return (0); -} |