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