Home | History | Annotate | Line # | Download | only in ip
ip_funcs.c revision 1.4.30.1
      1  1.4.30.1  christos /*	$NetBSD: ip_funcs.c,v 1.4.30.1 2019/06/10 21:51:36 christos Exp $	*/
      2       1.1  christos /*-
      3       1.1  christos  * Copyright (c) 1996
      4       1.1  christos  *	Keith Bostic.  All rights reserved.
      5       1.1  christos  *
      6       1.1  christos  * See the LICENSE file for redistribution information.
      7       1.1  christos  */
      8       1.1  christos 
      9       1.1  christos #include "config.h"
     10       1.1  christos 
     11       1.4  christos #include <sys/cdefs.h>
     12       1.4  christos #if 0
     13       1.1  christos #ifndef lint
     14       1.1  christos static const char sccsid[] = "Id: ip_funcs.c,v 8.23 2001/06/25 15:19:23 skimo Exp  (Berkeley) Date: 2001/06/25 15:19:23 ";
     15       1.1  christos #endif /* not lint */
     16       1.4  christos #else
     17  1.4.30.1  christos __RCSID("$NetBSD: ip_funcs.c,v 1.4.30.1 2019/06/10 21:51:36 christos Exp $");
     18       1.4  christos #endif
     19       1.1  christos 
     20       1.1  christos #include <sys/types.h>
     21       1.1  christos #include <sys/queue.h>
     22       1.1  christos #include <sys/time.h>
     23       1.1  christos 
     24       1.1  christos #include <bitstring.h>
     25       1.1  christos #include <stdio.h>
     26       1.1  christos #include <stdlib.h>
     27       1.2  christos #include <unistd.h>
     28       1.1  christos #include <string.h>
     29       1.1  christos 
     30       1.1  christos #include "../common/common.h"
     31       1.1  christos #include "../vi/vi.h"
     32       1.1  christos #include "../ipc/ip.h"
     33       1.1  christos 
     34       1.1  christos /*
     35       1.1  christos  * ip_addstr --
     36       1.1  christos  *	Add len bytes from the string at the cursor, advancing the cursor.
     37       1.1  christos  *
     38       1.1  christos  * PUBLIC: int ip_waddstr __P((SCR *, const CHAR_T *, size_t));
     39       1.1  christos  */
     40       1.1  christos int
     41       1.1  christos ip_waddstr(SCR *sp, const CHAR_T *str, size_t len)
     42       1.1  christos {
     43       1.1  christos 	IP_BUF ipb;
     44       1.1  christos 	IP_PRIVATE *ipp;
     45       1.2  christos 	int rval;
     46       1.1  christos 
     47       1.1  christos 	ipp = IPP(sp);
     48       1.1  christos 
     49       1.3  christos 	memset(&ipb, 0, sizeof(ipb));
     50       1.1  christos 	ipb.code = SI_WADDSTR;
     51       1.1  christos 	ipb.len1 = len * sizeof(CHAR_T);
     52       1.2  christos 	ipb.str1 = __UNCONST(str);
     53       1.1  christos 	rval = vi_send(ipp->o_fd, "a", &ipb);
     54       1.1  christos 	/* XXXX */
     55       1.1  christos 	ipp->col += len;
     56       1.1  christos 
     57       1.1  christos 	return (rval);
     58       1.1  christos }
     59       1.1  christos 
     60       1.1  christos /*
     61       1.1  christos  * ip_addstr --
     62       1.1  christos  *	Add len bytes from the string at the cursor, advancing the cursor.
     63       1.1  christos  *
     64       1.1  christos  * PUBLIC: int ip_addstr __P((SCR *, const char *, size_t));
     65       1.1  christos  */
     66       1.1  christos int
     67       1.1  christos ip_addstr(SCR *sp, const char *str, size_t len)
     68       1.1  christos {
     69       1.1  christos 	IP_BUF ipb;
     70       1.1  christos 	IP_PRIVATE *ipp;
     71       1.1  christos 	int iv, rval;
     72       1.1  christos 
     73       1.1  christos 	ipp = IPP(sp);
     74       1.1  christos 
     75       1.1  christos 	/*
     76       1.1  christos 	 * If ex isn't in control, it's the last line of the screen and
     77       1.1  christos 	 * it's a split screen, use inverse video.
     78       1.1  christos 	 */
     79       1.3  christos 	memset(&ipb, 0, sizeof(ipb));
     80       1.1  christos 	iv = 0;
     81       1.1  christos 	if (!F_ISSET(sp, SC_SCR_EXWROTE) &&
     82       1.1  christos 	    ipp->row == LASTLINE(sp) && IS_SPLIT(sp)) {
     83       1.1  christos 		iv = 1;
     84       1.1  christos 		ip_attr(sp, SA_INVERSE, 1);
     85       1.1  christos 	}
     86       1.1  christos 	ipb.code = SI_ADDSTR;
     87       1.1  christos 	ipb.len1 = len;
     88       1.1  christos 	ipb.str1 = str;
     89       1.1  christos 	rval = vi_send(ipp->o_fd, "a", &ipb);
     90       1.1  christos 	/* XXXX */
     91       1.1  christos 	ipp->col += len;
     92       1.1  christos 
     93       1.1  christos 	if (iv)
     94       1.1  christos 		ip_attr(sp, SA_INVERSE, 0);
     95       1.1  christos 	return (rval);
     96       1.1  christos }
     97       1.1  christos 
     98       1.1  christos /*
     99       1.1  christos  * ip_attr --
    100       1.1  christos  *	Toggle a screen attribute on/off.
    101       1.1  christos  *
    102       1.1  christos  * PUBLIC: int ip_attr __P((SCR *, scr_attr_t, int));
    103       1.1  christos  */
    104       1.1  christos int
    105       1.1  christos ip_attr(SCR *sp, scr_attr_t attribute, int on)
    106       1.1  christos {
    107       1.1  christos 	IP_BUF ipb;
    108       1.1  christos 	IP_PRIVATE *ipp = IPP(sp);
    109       1.1  christos 
    110       1.3  christos 	memset(&ipb, 0, sizeof(ipb));
    111       1.1  christos 	if (attribute == SA_ALTERNATE) {
    112       1.1  christos 		if (on) F_SET(ipp, IP_ON_ALTERNATE);
    113       1.1  christos 		else F_CLR(ipp, IP_ON_ALTERNATE);
    114       1.1  christos 	}
    115       1.1  christos 
    116       1.1  christos 	ipb.code = SI_ATTRIBUTE;
    117       1.1  christos 	ipb.val1 = attribute;
    118       1.1  christos 	ipb.val2 = on;
    119       1.1  christos 
    120       1.1  christos 	return (vi_send(ipp->o_fd, "12", &ipb));
    121       1.1  christos }
    122       1.1  christos 
    123       1.1  christos /*
    124       1.1  christos  * ip_baud --
    125       1.1  christos  *	Return the baud rate.
    126       1.1  christos  *
    127       1.1  christos  * PUBLIC: int ip_baud __P((SCR *, u_long *));
    128       1.1  christos  */
    129       1.1  christos int
    130       1.1  christos ip_baud(SCR *sp, u_long *ratep)
    131       1.1  christos {
    132       1.1  christos 	*ratep = 9600;		/* XXX: Translation: fast. */
    133       1.1  christos 	return (0);
    134       1.1  christos }
    135       1.1  christos 
    136       1.1  christos /*
    137       1.1  christos  * ip_bell --
    138       1.1  christos  *	Ring the bell/flash the screen.
    139       1.1  christos  *
    140       1.1  christos  * PUBLIC: int ip_bell __P((SCR *));
    141       1.1  christos  */
    142       1.1  christos int
    143       1.1  christos ip_bell(SCR *sp)
    144       1.1  christos {
    145       1.1  christos 	IP_BUF ipb;
    146       1.1  christos 	IP_PRIVATE *ipp = IPP(sp);
    147       1.1  christos 
    148       1.3  christos 	memset(&ipb, 0, sizeof(ipb));
    149       1.1  christos 	ipb.code = SI_BELL;
    150       1.1  christos 
    151       1.1  christos 	return (vi_send(ipp->o_fd, NULL, &ipb));
    152       1.1  christos }
    153       1.1  christos 
    154       1.1  christos /*
    155       1.1  christos  * ip_busy --
    156       1.1  christos  *	Display a busy message.
    157       1.1  christos  *
    158       1.1  christos  * PUBLIC: void ip_busy __P((SCR *, const char *, busy_t));
    159       1.1  christos  */
    160       1.1  christos void
    161       1.1  christos ip_busy(SCR *sp, const char *str, busy_t bval)
    162       1.1  christos {
    163       1.1  christos 	IP_BUF ipb;
    164       1.1  christos 	IP_PRIVATE *ipp = IPP(sp);
    165       1.1  christos 
    166       1.3  christos 	memset(&ipb, 0, sizeof(ipb));
    167       1.1  christos 	switch (bval) {
    168       1.1  christos 	case BUSY_ON:
    169       1.1  christos 		ipb.code = SI_BUSY_ON;
    170       1.1  christos 		ipb.str1 = str;
    171       1.1  christos 		ipb.len1 = strlen(str);
    172       1.1  christos 		(void)vi_send(ipp->o_fd, "a", &ipb);
    173       1.1  christos 		break;
    174       1.1  christos 	case BUSY_OFF:
    175       1.1  christos 		ipb.code = SI_BUSY_OFF;
    176       1.1  christos 		(void)vi_send(ipp->o_fd, NULL, &ipb);
    177       1.1  christos 		break;
    178       1.1  christos 	case BUSY_UPDATE:
    179       1.1  christos 		break;
    180       1.1  christos 	}
    181       1.1  christos 	return;
    182       1.1  christos }
    183       1.1  christos 
    184       1.1  christos /*
    185       1.1  christos  * ip_child --
    186       1.1  christos  *	Prepare child.
    187       1.1  christos  *
    188       1.1  christos  * PUBLIC: int ip_child __P((SCR *));
    189       1.1  christos  */
    190       1.1  christos int
    191       1.1  christos ip_child(SCR *sp)
    192       1.1  christos {
    193       1.1  christos 	IP_PRIVATE *ipp = IPP(sp);
    194       1.1  christos 
    195       1.1  christos 	if (ipp->t_fd != -1) {
    196       1.1  christos 	    dup2(ipp->t_fd, 0);
    197       1.1  christos 	    dup2(ipp->t_fd, 1);
    198       1.1  christos 	    dup2(ipp->t_fd, 2);
    199       1.1  christos 	    close(ipp->t_fd);
    200       1.1  christos 	}
    201       1.1  christos 	return 0;
    202       1.1  christos }
    203       1.1  christos 
    204       1.1  christos /*
    205       1.1  christos  * ip_clrtoeol --
    206       1.1  christos  *	Clear from the current cursor to the end of the line.
    207       1.1  christos  *
    208       1.1  christos  * PUBLIC: int ip_clrtoeol __P((SCR *));
    209       1.1  christos  */
    210       1.1  christos int
    211       1.1  christos ip_clrtoeol(SCR *sp)
    212       1.1  christos {
    213       1.1  christos 	IP_BUF ipb;
    214       1.1  christos  	IP_PRIVATE *ipp = IPP(sp);
    215       1.1  christos 
    216       1.1  christos  	/* Temporary hack until we can pass screen pointers
    217       1.1  christos  	 * or name screens
    218       1.1  christos  	 */
    219       1.3  christos 	memset(&ipb, 0, sizeof(ipb));
    220       1.1  christos  	if (IS_VSPLIT(sp)) {
    221       1.1  christos  		size_t x, y, spcnt;
    222       1.1  christos  		int error;
    223       1.1  christos 
    224       1.1  christos  		y = ipp->row;
    225       1.1  christos  		x = ipp->col;
    226       1.1  christos  		error = 0;
    227       1.1  christos  		for (spcnt = sp->cols - x;
    228       1.1  christos  		     spcnt > 0 && ! error; --spcnt)
    229       1.1  christos  			error = ip_addstr(sp, " ", 1);
    230       1.1  christos  		if (sp->coff == 0)
    231       1.1  christos  			error |= ip_addstr(sp, "|", 1);
    232       1.1  christos  		error |= ip_move(sp, y, x);
    233       1.1  christos  		return error;
    234       1.1  christos  	}
    235       1.1  christos 
    236       1.1  christos 	ipb.code = SI_CLRTOEOL;
    237       1.1  christos 
    238       1.1  christos 	return (vi_send(ipp->o_fd, NULL, &ipb));
    239       1.1  christos }
    240       1.1  christos 
    241       1.1  christos /*
    242       1.1  christos  * ip_cursor --
    243       1.1  christos  *	Return the current cursor position.
    244       1.1  christos  *
    245       1.1  christos  * PUBLIC: int ip_cursor __P((SCR *, size_t *, size_t *));
    246       1.1  christos  */
    247       1.1  christos int
    248       1.1  christos ip_cursor(SCR *sp, size_t *yp, size_t *xp)
    249       1.1  christos {
    250       1.1  christos 	IP_PRIVATE *ipp;
    251       1.1  christos 
    252       1.1  christos 	ipp = IPP(sp);
    253       1.1  christos 	*yp = ipp->row;
    254       1.1  christos 	*xp = ipp->col;
    255       1.1  christos 	return (0);
    256       1.1  christos }
    257       1.1  christos 
    258       1.1  christos /*
    259       1.1  christos  * ip_deleteln --
    260       1.1  christos  *	Delete the current line, scrolling all lines below it.
    261       1.1  christos  *
    262       1.1  christos  * PUBLIC: int ip_deleteln __P((SCR *));
    263       1.1  christos  */
    264       1.1  christos int
    265       1.1  christos ip_deleteln(SCR *sp)
    266       1.1  christos {
    267       1.1  christos 	IP_BUF ipb;
    268       1.1  christos 	IP_PRIVATE *ipp = IPP(sp);
    269       1.1  christos 
    270       1.1  christos 	/*
    271       1.1  christos 	 * This clause is required because the curses screen uses reverse
    272       1.1  christos 	 * video to delimit split screens.  If the screen does not do this,
    273       1.1  christos 	 * this code won't be necessary.
    274       1.1  christos 	 *
    275       1.1  christos 	 * If the bottom line was in reverse video, rewrite it in normal
    276       1.1  christos 	 * video before it's scrolled.
    277       1.1  christos 	 */
    278       1.3  christos 	memset(&ipb, 0, sizeof(ipb));
    279       1.1  christos 	if (!F_ISSET(sp, SC_SCR_EXWROTE) && IS_SPLIT(sp)) {
    280       1.1  christos 		ipb.code = SI_REWRITE;
    281       1.1  christos 		ipb.val1 = RLNO(sp, LASTLINE(sp));
    282       1.1  christos 		if (vi_send(ipp->o_fd, "1", &ipb))
    283       1.1  christos 			return (1);
    284       1.1  christos 	}
    285       1.1  christos 
    286       1.1  christos 	/*
    287       1.1  christos 	 * The bottom line is expected to be blank after this operation,
    288       1.1  christos 	 * and other screens must support that semantic.
    289       1.1  christos 	 */
    290       1.1  christos 	ipb.code = SI_DELETELN;
    291       1.1  christos 	return (vi_send(ipp->o_fd, NULL, &ipb));
    292       1.1  christos }
    293       1.1  christos 
    294       1.1  christos /*
    295       1.1  christos  * ip_discard --
    296       1.1  christos  *	Discard a screen.
    297       1.1  christos  *
    298       1.1  christos  * PUBLIC: int ip_discard __P((SCR *, SCR **));
    299       1.1  christos  */
    300       1.1  christos int
    301       1.1  christos ip_discard(SCR *discardp, SCR **acquirep)
    302       1.1  christos {
    303       1.1  christos 	return (0);
    304       1.1  christos }
    305       1.1  christos 
    306       1.1  christos /*
    307       1.1  christos  * ip_ex_adjust --
    308       1.1  christos  *	Adjust the screen for ex.
    309       1.1  christos  *
    310       1.1  christos  * PUBLIC: int ip_ex_adjust __P((SCR *, exadj_t));
    311       1.1  christos  */
    312       1.1  christos int
    313       1.1  christos ip_ex_adjust(SCR *sp, exadj_t action)
    314       1.1  christos {
    315       1.1  christos 	abort();
    316       1.1  christos 	/* NOTREACHED */
    317       1.1  christos }
    318       1.1  christos 
    319  1.4.30.1  christos #ifdef IMCTRL
    320  1.4.30.1  christos /*
    321  1.4.30.1  christos  * ip_imctrl --
    322  1.4.30.1  christos  *	XXX not implemented yet.
    323  1.4.30.1  christos  *
    324  1.4.30.1  christos  * PUBLIC: #ifdef IMCTRL
    325  1.4.30.1  christos  * PUBLIC: void ip_imctrl __P((SCR *, imctrl_t));
    326  1.4.30.1  christos  * PUBLIC: #endif
    327  1.4.30.1  christos  */
    328  1.4.30.1  christos void
    329  1.4.30.1  christos ip_imctrl(SCR *sp, imctrl_t action)
    330  1.4.30.1  christos {
    331  1.4.30.1  christos 
    332  1.4.30.1  christos 	return;
    333  1.4.30.1  christos }
    334  1.4.30.1  christos #endif
    335  1.4.30.1  christos 
    336       1.1  christos /*
    337       1.1  christos  * ip_insertln --
    338       1.1  christos  *	Push down the current line, discarding the bottom line.
    339       1.1  christos  *
    340       1.1  christos  * PUBLIC: int ip_insertln __P((SCR *));
    341       1.1  christos  */
    342       1.1  christos int
    343       1.1  christos ip_insertln(SCR *sp)
    344       1.1  christos {
    345       1.1  christos 	IP_BUF ipb;
    346       1.1  christos 	IP_PRIVATE *ipp = IPP(sp);
    347       1.1  christos 
    348       1.3  christos 	memset(&ipb, 0, sizeof(ipb));
    349       1.1  christos 	ipb.code = SI_INSERTLN;
    350       1.1  christos 
    351       1.1  christos 	return (vi_send(ipp->o_fd, NULL, &ipb));
    352       1.1  christos }
    353       1.1  christos 
    354       1.1  christos /*
    355       1.1  christos  * ip_keyval --
    356       1.1  christos  *	Return the value for a special key.
    357       1.1  christos  *
    358       1.1  christos  * PUBLIC: int ip_keyval __P((SCR *, scr_keyval_t, CHAR_T *, int *));
    359       1.1  christos  */
    360       1.1  christos int
    361       1.1  christos ip_keyval(SCR *sp, scr_keyval_t val, CHAR_T *chp, int *dnep)
    362       1.1  christos {
    363       1.1  christos 	/*
    364       1.1  christos 	 * VEOF, VERASE and VKILL are required by POSIX 1003.1-1990,
    365       1.1  christos 	 * VWERASE is a 4BSD extension.
    366       1.1  christos 	 */
    367       1.1  christos 	switch (val) {
    368       1.1  christos 	case KEY_VEOF:
    369       1.1  christos 		*dnep = '\004';		/* ^D */
    370       1.1  christos 		break;
    371       1.1  christos 	case KEY_VERASE:
    372       1.1  christos 		*dnep = '\b';		/* ^H */
    373       1.1  christos 		break;
    374       1.1  christos 	case KEY_VKILL:
    375       1.1  christos 		*dnep = '\025';		/* ^U */
    376       1.1  christos 		break;
    377       1.1  christos #ifdef VWERASE
    378       1.1  christos 	case KEY_VWERASE:
    379       1.1  christos 		*dnep = '\027';		/* ^W */
    380       1.1  christos 		break;
    381       1.1  christos #endif
    382       1.1  christos 	default:
    383       1.1  christos 		*dnep = 1;
    384       1.1  christos 		break;
    385       1.1  christos 	}
    386       1.1  christos 	return (0);
    387       1.1  christos }
    388       1.1  christos 
    389       1.1  christos /*
    390       1.1  christos  * ip_move --
    391       1.1  christos  *	Move the cursor.
    392       1.1  christos  *
    393       1.1  christos  * PUBLIC: int ip_move __P((SCR *, size_t, size_t));
    394       1.1  christos  */
    395       1.1  christos int
    396       1.1  christos ip_move(SCR *sp, size_t lno, size_t cno)
    397       1.1  christos {
    398       1.1  christos 	IP_PRIVATE *ipp;
    399       1.1  christos 	IP_BUF ipb;
    400       1.1  christos 
    401       1.1  christos 	ipp = IPP(sp);
    402       1.1  christos 	ipp->row = lno;
    403       1.1  christos 	ipp->col = cno;
    404       1.1  christos 
    405       1.3  christos 	memset(&ipb, 0, sizeof(ipb));
    406       1.1  christos 	ipb.code = SI_MOVE;
    407       1.1  christos 	ipb.val1 = RLNO(sp, lno);
    408       1.1  christos 	ipb.val2 = RCNO(sp, cno);
    409       1.1  christos 	return (vi_send(ipp->o_fd, "12", &ipb));
    410       1.1  christos }
    411       1.1  christos 
    412       1.1  christos /*
    413       1.1  christos  * PUBLIC: void ip_msg __P((SCR *, mtype_t, char *, size_t));
    414       1.1  christos  */
    415       1.1  christos void
    416       1.1  christos ip_msg(SCR *sp, mtype_t mtype, char *line, size_t len)
    417       1.1  christos {
    418       1.1  christos 	IP_PRIVATE *ipp = IPP(sp);
    419       1.1  christos 
    420       1.1  christos 	if (F_ISSET(ipp, IP_ON_ALTERNATE))
    421       1.1  christos 		vs_msg(sp, mtype, line, len);
    422       1.1  christos 	else {
    423       1.1  christos 		write(ipp->t_fd, line, len);
    424       1.1  christos 		F_CLR(sp, SC_EX_WAIT_NO);
    425       1.1  christos 	}
    426       1.1  christos }
    427       1.1  christos 
    428       1.1  christos /*
    429       1.1  christos  * ip_refresh --
    430       1.1  christos  *	Refresh the screen.
    431       1.1  christos  *
    432       1.1  christos  * PUBLIC: int ip_refresh __P((SCR *, int));
    433       1.1  christos  */
    434       1.1  christos int
    435       1.1  christos ip_refresh(SCR *sp, int repaint)
    436       1.1  christos {
    437       1.1  christos 	IP_BUF ipb;
    438       1.1  christos 	IP_PRIVATE *ipp;
    439       1.1  christos 	db_recno_t total;
    440       1.1  christos 
    441       1.1  christos 	ipp = IPP(sp);
    442       1.1  christos 
    443       1.1  christos 	/*
    444       1.1  christos 	 * If the scroll bar information has changed since we last sent
    445       1.1  christos 	 * it, resend it.  Currently, we send three values:
    446       1.1  christos 	 *
    447       1.1  christos 	 * top		The line number of the first line in the screen.
    448       1.1  christos 	 * num		The number of lines visible on the screen.
    449       1.1  christos 	 * total	The number of lines in the file.
    450       1.1  christos 	 *
    451       1.1  christos 	 * XXX
    452       1.1  christos 	 * This is a gross violation of layering... we're looking at data
    453       1.1  christos 	 * structures at which we have absolutely no business whatsoever
    454       1.1  christos 	 * looking...
    455       1.1  christos 	 */
    456       1.3  christos 	memset(&ipb, 0, sizeof(ipb));
    457       1.1  christos 	ipb.val1 = HMAP->lno;
    458       1.1  christos 	ipb.val2 = TMAP->lno - HMAP->lno;
    459       1.1  christos 	if (sp->ep != NULL && sp->ep->db != NULL)
    460       1.1  christos 		(void)db_last(sp, &total);
    461       1.1  christos 	ipb.val3 = total == 0 ? 1 : total;
    462       1.1  christos 	if (ipb.val1 != ipp->sb_top ||
    463       1.1  christos 	    ipb.val2 != ipp->sb_num || ipb.val3 != ipp->sb_total) {
    464       1.1  christos 		ipb.code = SI_SCROLLBAR;
    465       1.1  christos 		(void)vi_send(ipp->o_fd, "123", &ipb);
    466       1.1  christos 		ipp->sb_top = ipb.val1;
    467       1.1  christos 		ipp->sb_num = ipb.val2;
    468       1.1  christos 		ipp->sb_total = ipb.val3;
    469       1.1  christos 	}
    470       1.1  christos 
    471       1.1  christos 	/* Refresh/repaint the screen. */
    472       1.1  christos 	ipb.code = repaint ? SI_REDRAW : SI_REFRESH;
    473       1.1  christos 	return (vi_send(ipp->o_fd, NULL, &ipb));
    474       1.1  christos }
    475       1.1  christos 
    476       1.1  christos /*
    477       1.1  christos  * ip_rename --
    478       1.1  christos  *	Rename the file.
    479       1.1  christos  *
    480       1.1  christos  * PUBLIC: int ip_rename __P((SCR *, char *, int));
    481       1.1  christos  */
    482       1.1  christos int
    483       1.1  christos ip_rename(SCR *sp, char *name, int on)
    484       1.1  christos {
    485       1.1  christos 	IP_BUF ipb;
    486       1.1  christos 	IP_PRIVATE *ipp = IPP(sp);
    487       1.1  christos 
    488       1.3  christos 	memset(&ipb, 0, sizeof(ipb));
    489       1.1  christos 	ipb.code = SI_RENAME;
    490       1.1  christos 	ipb.str1 = name;
    491       1.1  christos 	ipb.len1 = name ? strlen(name) : 0;
    492       1.1  christos 	return (vi_send(ipp->o_fd, "a", &ipb));
    493       1.1  christos }
    494       1.1  christos 
    495       1.1  christos /*
    496       1.1  christos  * ip_reply --
    497       1.1  christos  *	Reply to a message.
    498       1.1  christos  *
    499       1.1  christos  * PUBLIC: int ip_reply __P((SCR *, int, char *));
    500       1.1  christos  */
    501       1.1  christos int
    502       1.1  christos ip_reply(SCR *sp, int status, char *msg)
    503       1.1  christos {
    504       1.1  christos 	IP_BUF ipb;
    505       1.1  christos 	IP_PRIVATE *ipp = IPP(sp);
    506       1.1  christos 
    507       1.3  christos 	memset(&ipb, 0, sizeof(ipb));
    508       1.1  christos 	ipb.code = SI_REPLY;
    509       1.1  christos 	ipb.val1 = status;
    510       1.1  christos 	ipb.str1 = msg == NULL ? "" : msg;
    511       1.1  christos 	ipb.len1 = strlen(ipb.str1);
    512       1.1  christos 	return (vi_send(ipp->o_fd, "1a", &ipb));
    513       1.1  christos }
    514       1.1  christos 
    515       1.1  christos /*
    516       1.1  christos  * ip_split --
    517       1.1  christos  *	Split a screen.
    518       1.1  christos  *
    519       1.1  christos  * PUBLIC: int ip_split __P((SCR *, SCR *));
    520       1.1  christos  */
    521       1.1  christos int
    522       1.1  christos ip_split(SCR *origp, SCR *newp)
    523       1.1  christos {
    524       1.1  christos 	return (0);
    525       1.1  christos }
    526       1.1  christos 
    527       1.1  christos /*
    528       1.1  christos  * ip_suspend --
    529       1.1  christos  *	Suspend a screen.
    530       1.1  christos  *
    531       1.1  christos  * PUBLIC: int ip_suspend __P((SCR *, int *));
    532       1.1  christos  */
    533       1.1  christos int
    534       1.1  christos ip_suspend(SCR *sp, int *allowedp)
    535       1.1  christos {
    536       1.1  christos 	*allowedp = 0;
    537       1.1  christos 	return (0);
    538       1.1  christos }
    539       1.1  christos 
    540       1.1  christos /*
    541       1.1  christos  * ip_usage --
    542       1.1  christos  *      Print out the ip usage messages.
    543       1.1  christos  *
    544       1.1  christos  * PUBLIC: void ip_usage __P((void));
    545       1.1  christos  */
    546       1.1  christos void
    547       1.1  christos ip_usage(void)
    548       1.1  christos {
    549       1.1  christos #define USAGE "\
    550       1.1  christos usage: vi [-eFlRrSv] [-c command] [-I ifd.ofd] [-t tag] [-w size] [file ...]\n"
    551       1.1  christos         (void)fprintf(stderr, "%s", USAGE);
    552       1.1  christos #undef  USAGE
    553       1.1  christos }
    554