v_put.c revision 19304
119304Speter/*-
219304Speter * Copyright (c) 1992, 1993, 1994
319304Speter *	The Regents of the University of California.  All rights reserved.
419304Speter * Copyright (c) 1992, 1993, 1994, 1995, 1996
519304Speter *	Keith Bostic.  All rights reserved.
619304Speter *
719304Speter * See the LICENSE file for redistribution information.
819304Speter */
919304Speter
1019304Speter#include "config.h"
1119304Speter
1219304Speter#ifndef lint
1319304Speterstatic const char sccsid[] = "@(#)v_put.c	10.5 (Berkeley) 3/6/96";
1419304Speter#endif /* not lint */
1519304Speter
1619304Speter#include <sys/types.h>
1719304Speter#include <sys/queue.h>
1819304Speter#include <sys/time.h>
1919304Speter
2019304Speter#include <bitstring.h>
2119304Speter#include <limits.h>
2219304Speter#include <stdio.h>
2319304Speter
2419304Speter#include "../common/common.h"
2519304Speter#include "vi.h"
2619304Speter
2719304Speterstatic void	inc_buf __P((SCR *, VICMD *));
2819304Speter
2919304Speter/*
3019304Speter * v_Put -- [buffer]P
3119304Speter *	Insert the contents of the buffer before the cursor.
3219304Speter *
3319304Speter * PUBLIC: int v_Put __P((SCR *, VICMD *));
3419304Speter */
3519304Speterint
3619304Speterv_Put(sp, vp)
3719304Speter	SCR *sp;
3819304Speter	VICMD *vp;
3919304Speter{
4019304Speter	u_long cnt;
4119304Speter
4219304Speter	if (F_ISSET(vp, VC_ISDOT))
4319304Speter		inc_buf(sp, vp);
4419304Speter
4519304Speter	/*
4619304Speter	 * !!!
4719304Speter	 * Historic vi did not support a count with the 'p' and 'P'
4819304Speter	 * commands.  It's useful, so we do.
4919304Speter	 */
5019304Speter	for (cnt = F_ISSET(vp, VC_C1SET) ? vp->count : 1; cnt--;) {
5119304Speter		if (put(sp, NULL,
5219304Speter		    F_ISSET(vp, VC_BUFFER) ? &vp->buffer : NULL,
5319304Speter		    &vp->m_start, &vp->m_final, 0))
5419304Speter			return (1);
5519304Speter		vp->m_start = vp->m_final;
5619304Speter		if (INTERRUPTED(sp))
5719304Speter			return (1);
5819304Speter	}
5919304Speter	return (0);
6019304Speter}
6119304Speter
6219304Speter/*
6319304Speter * v_put -- [buffer]p
6419304Speter *	Insert the contents of the buffer after the cursor.
6519304Speter *
6619304Speter * PUBLIC: int v_put __P((SCR *, VICMD *));
6719304Speter */
6819304Speterint
6919304Speterv_put(sp, vp)
7019304Speter	SCR *sp;
7119304Speter	VICMD *vp;
7219304Speter{
7319304Speter	u_long cnt;
7419304Speter
7519304Speter	if (F_ISSET(vp, VC_ISDOT))
7619304Speter		inc_buf(sp, vp);
7719304Speter
7819304Speter	/*
7919304Speter	 * !!!
8019304Speter	 * Historic vi did not support a count with the 'p' and 'P'
8119304Speter	 * commands.  It's useful, so we do.
8219304Speter	 */
8319304Speter	for (cnt = F_ISSET(vp, VC_C1SET) ? vp->count : 1; cnt--;) {
8419304Speter		if (put(sp, NULL,
8519304Speter		    F_ISSET(vp, VC_BUFFER) ? &vp->buffer : NULL,
8619304Speter		    &vp->m_start, &vp->m_final, 1))
8719304Speter			return (1);
8819304Speter		vp->m_start = vp->m_final;
8919304Speter		if (INTERRUPTED(sp))
9019304Speter			return (1);
9119304Speter	}
9219304Speter	return (0);
9319304Speter}
9419304Speter
9519304Speter/*
9619304Speter * !!!
9719304Speter * Historical whackadoo.  The dot command `puts' the numbered buffer
9819304Speter * after the last one put.  For example, `"4p.' would put buffer #4
9919304Speter * and buffer #5.  If the user continued to enter '.', the #9 buffer
10019304Speter * would be repeatedly output.  This was not documented, and is a bit
10119304Speter * tricky to reconstruct.  Historical versions of vi also dropped the
10219304Speter * contents of the default buffer after each put, so after `"4p' the
10319304Speter * default buffer would be empty.  This makes no sense to me, so we
10419304Speter * don't bother.  Don't assume sequential order of numeric characters.
10519304Speter *
10619304Speter * And, if that weren't exciting enough, failed commands don't normally
10719304Speter * set the dot command.  Well, boys and girls, an exception is that
10819304Speter * the buffer increment gets done regardless of the success of the put.
10919304Speter */
11019304Speterstatic void
11119304Speterinc_buf(sp, vp)
11219304Speter	SCR *sp;
11319304Speter	VICMD *vp;
11419304Speter{
11519304Speter	CHAR_T v;
11619304Speter
11719304Speter	switch (vp->buffer) {
11819304Speter	case '1':
11919304Speter		v = '2';
12019304Speter		break;
12119304Speter	case '2':
12219304Speter		v = '3';
12319304Speter		break;
12419304Speter	case '3':
12519304Speter		v = '4';
12619304Speter		break;
12719304Speter	case '4':
12819304Speter		v = '5';
12919304Speter		break;
13019304Speter	case '5':
13119304Speter		v = '6';
13219304Speter		break;
13319304Speter	case '6':
13419304Speter		v = '7';
13519304Speter		break;
13619304Speter	case '7':
13719304Speter		v = '8';
13819304Speter		break;
13919304Speter	case '8':
14019304Speter		v = '9';
14119304Speter		break;
14219304Speter	default:
14319304Speter		return;
14419304Speter	}
14519304Speter	VIP(sp)->sdot.buffer = vp->buffer = v;
14619304Speter}
147