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
13254225Speterstatic const char sccsid[] = "$Id: v_put.c,v 10.6 2001/06/25 15:19:34 skimo Exp $";
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
27281373Sbaptstatic void	inc_buf(SCR *, VICMD *);
2819304Speter
2919304Speter/*
3019304Speter * v_Put -- [buffer]P
3119304Speter *	Insert the contents of the buffer before the cursor.
3219304Speter *
33281373Sbapt * PUBLIC: int v_Put(SCR *, VICMD *);
3419304Speter */
3519304Speterint
36254225Speterv_Put(SCR *sp, VICMD *vp)
3719304Speter{
3819304Speter	u_long cnt;
3919304Speter
4019304Speter	if (F_ISSET(vp, VC_ISDOT))
4119304Speter		inc_buf(sp, vp);
4219304Speter
4319304Speter	/*
4419304Speter	 * !!!
4519304Speter	 * Historic vi did not support a count with the 'p' and 'P'
4619304Speter	 * commands.  It's useful, so we do.
4719304Speter	 */
4819304Speter	for (cnt = F_ISSET(vp, VC_C1SET) ? vp->count : 1; cnt--;) {
4919304Speter		if (put(sp, NULL,
5019304Speter		    F_ISSET(vp, VC_BUFFER) ? &vp->buffer : NULL,
5119304Speter		    &vp->m_start, &vp->m_final, 0))
5219304Speter			return (1);
5319304Speter		vp->m_start = vp->m_final;
5419304Speter		if (INTERRUPTED(sp))
5519304Speter			return (1);
5619304Speter	}
5719304Speter	return (0);
5819304Speter}
5919304Speter
6019304Speter/*
6119304Speter * v_put -- [buffer]p
6219304Speter *	Insert the contents of the buffer after the cursor.
6319304Speter *
64281373Sbapt * PUBLIC: int v_put(SCR *, VICMD *);
6519304Speter */
6619304Speterint
67254225Speterv_put(SCR *sp, VICMD *vp)
6819304Speter{
6919304Speter	u_long cnt;
7019304Speter
7119304Speter	if (F_ISSET(vp, VC_ISDOT))
7219304Speter		inc_buf(sp, vp);
7319304Speter
7419304Speter	/*
7519304Speter	 * !!!
7619304Speter	 * Historic vi did not support a count with the 'p' and 'P'
7719304Speter	 * commands.  It's useful, so we do.
7819304Speter	 */
7919304Speter	for (cnt = F_ISSET(vp, VC_C1SET) ? vp->count : 1; cnt--;) {
8019304Speter		if (put(sp, NULL,
8119304Speter		    F_ISSET(vp, VC_BUFFER) ? &vp->buffer : NULL,
8219304Speter		    &vp->m_start, &vp->m_final, 1))
8319304Speter			return (1);
8419304Speter		vp->m_start = vp->m_final;
8519304Speter		if (INTERRUPTED(sp))
8619304Speter			return (1);
8719304Speter	}
8819304Speter	return (0);
8919304Speter}
9019304Speter
9119304Speter/*
9219304Speter * !!!
9319304Speter * Historical whackadoo.  The dot command `puts' the numbered buffer
9419304Speter * after the last one put.  For example, `"4p.' would put buffer #4
9519304Speter * and buffer #5.  If the user continued to enter '.', the #9 buffer
9619304Speter * would be repeatedly output.  This was not documented, and is a bit
9719304Speter * tricky to reconstruct.  Historical versions of vi also dropped the
9819304Speter * contents of the default buffer after each put, so after `"4p' the
9919304Speter * default buffer would be empty.  This makes no sense to me, so we
10019304Speter * don't bother.  Don't assume sequential order of numeric characters.
10119304Speter *
10219304Speter * And, if that weren't exciting enough, failed commands don't normally
10319304Speter * set the dot command.  Well, boys and girls, an exception is that
10419304Speter * the buffer increment gets done regardless of the success of the put.
10519304Speter */
10619304Speterstatic void
107254225Speterinc_buf(SCR *sp, VICMD *vp)
10819304Speter{
10919304Speter	CHAR_T v;
11019304Speter
11119304Speter	switch (vp->buffer) {
11219304Speter	case '1':
11319304Speter		v = '2';
11419304Speter		break;
11519304Speter	case '2':
11619304Speter		v = '3';
11719304Speter		break;
11819304Speter	case '3':
11919304Speter		v = '4';
12019304Speter		break;
12119304Speter	case '4':
12219304Speter		v = '5';
12319304Speter		break;
12419304Speter	case '5':
12519304Speter		v = '6';
12619304Speter		break;
12719304Speter	case '6':
12819304Speter		v = '7';
12919304Speter		break;
13019304Speter	case '7':
13119304Speter		v = '8';
13219304Speter		break;
13319304Speter	case '8':
13419304Speter		v = '9';
13519304Speter		break;
13619304Speter	default:
13719304Speter		return;
13819304Speter	}
13919304Speter	VIP(sp)->sdot.buffer = vp->buffer = v;
14019304Speter}
141