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