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