1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
|
/*-
* Copyright (c) 1992, 1993, 1994
* The Regents of the University of California. All rights reserved.
* Copyright (c) 1992, 1993, 1994, 1995, 1996
* Keith Bostic. All rights reserved.
*
* See the LICENSE file for redistribution information.
*/
#include "config.h"
#ifndef lint
static const char sccsid[] = "@(#)v_put.c 10.5 (Berkeley) 3/6/96";
#endif /* not lint */
#include <sys/types.h>
#include <sys/queue.h>
#include <sys/time.h>
#include <bitstring.h>
#include <limits.h>
#include <stdio.h>
#include "../common/common.h"
#include "vi.h"
static void inc_buf __P((SCR *, VICMD *));
/*
* v_Put -- [buffer]P
* Insert the contents of the buffer before the cursor.
*
* PUBLIC: int v_Put __P((SCR *, VICMD *));
*/
int
v_Put(sp, vp)
SCR *sp;
VICMD *vp;
{
u_long cnt;
if (F_ISSET(vp, VC_ISDOT))
inc_buf(sp, vp);
/*
* !!!
* Historic vi did not support a count with the 'p' and 'P'
* commands. It's useful, so we do.
*/
for (cnt = F_ISSET(vp, VC_C1SET) ? vp->count : 1; cnt--;) {
if (put(sp, NULL,
F_ISSET(vp, VC_BUFFER) ? &vp->buffer : NULL,
&vp->m_start, &vp->m_final, 0))
return (1);
vp->m_start = vp->m_final;
if (INTERRUPTED(sp))
return (1);
}
return (0);
}
/*
* v_put -- [buffer]p
* Insert the contents of the buffer after the cursor.
*
* PUBLIC: int v_put __P((SCR *, VICMD *));
*/
int
v_put(sp, vp)
SCR *sp;
VICMD *vp;
{
u_long cnt;
if (F_ISSET(vp, VC_ISDOT))
inc_buf(sp, vp);
/*
* !!!
* Historic vi did not support a count with the 'p' and 'P'
* commands. It's useful, so we do.
*/
for (cnt = F_ISSET(vp, VC_C1SET) ? vp->count : 1; cnt--;) {
if (put(sp, NULL,
F_ISSET(vp, VC_BUFFER) ? &vp->buffer : NULL,
&vp->m_start, &vp->m_final, 1))
return (1);
vp->m_start = vp->m_final;
if (INTERRUPTED(sp))
return (1);
}
return (0);
}
/*
* !!!
* Historical whackadoo. The dot command `puts' the numbered buffer
* after the last one put. For example, `"4p.' would put buffer #4
* and buffer #5. If the user continued to enter '.', the #9 buffer
* would be repeatedly output. This was not documented, and is a bit
* tricky to reconstruct. Historical versions of vi also dropped the
* contents of the default buffer after each put, so after `"4p' the
* default buffer would be empty. This makes no sense to me, so we
* don't bother. Don't assume sequential order of numeric characters.
*
* And, if that weren't exciting enough, failed commands don't normally
* set the dot command. Well, boys and girls, an exception is that
* the buffer increment gets done regardless of the success of the put.
*/
static void
inc_buf(sp, vp)
SCR *sp;
VICMD *vp;
{
CHAR_T v;
switch (vp->buffer) {
case '1':
v = '2';
break;
case '2':
v = '3';
break;
case '3':
v = '4';
break;
case '4':
v = '5';
break;
case '5':
v = '6';
break;
case '6':
v = '7';
break;
case '7':
v = '8';
break;
case '8':
v = '9';
break;
default:
return;
}
VIP(sp)->sdot.buffer = vp->buffer = v;
}
|