summaryrefslogtreecommitdiff
path: root/common/put.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/put.c')
-rw-r--r--common/put.c46
1 files changed, 30 insertions, 16 deletions
diff --git a/common/put.c b/common/put.c
index f39948808e7d..9862682c9bbb 100644
--- a/common/put.c
+++ b/common/put.c
@@ -26,16 +26,16 @@
* put --
* Put text buffer contents into the file.
*
- * PUBLIC: int put(SCR *, CB *, CHAR_T *, MARK *, MARK *, int);
+ * PUBLIC: int put(SCR *, CB *, CHAR_T *, MARK *, MARK *, int, int);
*/
int
-put(SCR *sp, CB *cbp, CHAR_T *namep, MARK *cp, MARK *rp, int append)
+put(SCR *sp, CB *cbp, CHAR_T *namep, MARK *cp, MARK *rp, int append, int cnt)
{
CHAR_T name;
TEXT *ltp, *tp;
recno_t lno;
size_t blen, clen, len;
- int rval;
+ int rval, i, isempty;
CHAR_T *bp, *t;
CHAR_T *p;
@@ -77,11 +77,16 @@ put(SCR *sp, CB *cbp, CHAR_T *namep, MARK *cp, MARK *rp, int append)
if (cp->lno == 1) {
if (db_last(sp, &lno))
return (1);
- if (lno == 0) {
- for (; tp != NULL;
- ++lno, ++sp->rptlines[L_ADDED], tp = TAILQ_NEXT(tp, q))
- if (db_append(sp, 1, lno, tp->lb, tp->len))
- return (1);
+ if (lno == 0 && F_ISSET(cbp, CB_LMODE)) {
+ for (i = cnt; i > 0; i--) {
+ for (; tp != NULL;
+ ++lno, ++sp->rptlines[L_ADDED],
+ tp = TAILQ_NEXT(tp, q))
+ if (db_append(sp, 1, lno, tp->lb,
+ tp->len))
+ return (1);
+ tp = TAILQ_FIRST(cbp->textq);
+ }
rp->lno = 1;
rp->cno = 0;
return (0);
@@ -92,10 +97,14 @@ put(SCR *sp, CB *cbp, CHAR_T *namep, MARK *cp, MARK *rp, int append)
if (F_ISSET(cbp, CB_LMODE)) {
lno = append ? cp->lno : cp->lno - 1;
rp->lno = lno + 1;
- for (; tp != NULL;
- ++lno, ++sp->rptlines[L_ADDED], tp = TAILQ_NEXT(tp, q))
- if (db_append(sp, 1, lno, tp->lb, tp->len))
- return (1);
+ for (i = cnt; i > 0; i--) {
+ for (; tp != NULL;
+ ++lno, ++sp->rptlines[L_ADDED],
+ tp = TAILQ_NEXT(tp, q))
+ if (db_append(sp, 1, lno, tp->lb, tp->len))
+ return (1);
+ tp = TAILQ_FIRST(cbp->textq);
+ }
rp->cno = 0;
(void)nonblank(sp, rp->lno, &rp->cno);
return (0);
@@ -111,8 +120,11 @@ put(SCR *sp, CB *cbp, CHAR_T *namep, MARK *cp, MARK *rp, int append)
* Get the first line.
*/
lno = cp->lno;
- if (db_get(sp, lno, DBG_FATAL, &p, &len))
- return (1);
+ if (db_eget(sp, lno, &p, &len, &isempty)) {
+ if (!isempty)
+ return (1);
+ len = 0;
+ }
GET_SPACE_RETW(sp, bp, blen, tp->len + len + 1);
t = bp;
@@ -126,8 +138,10 @@ put(SCR *sp, CB *cbp, CHAR_T *namep, MARK *cp, MARK *rp, int append)
/* First line from the CB. */
if (tp->len != 0) {
- MEMCPY(t, tp->lb, tp->len);
- t += tp->len;
+ for (i = cnt; i > 0; i--) {
+ MEMCPY(t, tp->lb, tp->len);
+ t += tp->len;
+ }
}
/* Calculate length left in the original line. */