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: ex_delete.c,v 10.11 2001/06/25 15:19:15 skimo Exp $";
1419304Speter#endif /* not lint */
1519304Speter
1619304Speter#include <sys/types.h>
1719304Speter#include <sys/queue.h>
18254225Speter#include <sys/time.h>
1919304Speter
2019304Speter#include <bitstring.h>
2119304Speter#include <limits.h>
2219304Speter#include <stdio.h>
2319304Speter
2419304Speter#include "../common/common.h"
2519304Speter
2619304Speter/*
2719304Speter * ex_delete: [line [,line]] d[elete] [buffer] [count] [flags]
2819304Speter *
2919304Speter *	Delete lines from the file.
3019304Speter *
31281373Sbapt * PUBLIC: int ex_delete(SCR *, EXCMD *);
3219304Speter */
3319304Speterint
34254225Speterex_delete(SCR *sp, EXCMD *cmdp)
3519304Speter{
3619304Speter	recno_t lno;
3719304Speter
3819304Speter	NEEDFILE(sp, cmdp);
3919304Speter
4019304Speter	/*
4119304Speter	 * !!!
4219304Speter	 * Historically, lines deleted in ex were not placed in the numeric
4319304Speter	 * buffers.  We follow historic practice so that we don't overwrite
4419304Speter	 * vi buffers accidentally.
4519304Speter	 */
4619304Speter	if (cut(sp,
4719304Speter	    FL_ISSET(cmdp->iflags, E_C_BUFFER) ? &cmdp->buffer : NULL,
4819304Speter	    &cmdp->addr1, &cmdp->addr2, CUT_LINEMODE))
4919304Speter		return (1);
5019304Speter
5119304Speter	/* Delete the lines. */
5219304Speter	if (del(sp, &cmdp->addr1, &cmdp->addr2, 1))
5319304Speter		return (1);
5419304Speter
5519304Speter	/* Set the cursor to the line after the last line deleted. */
5619304Speter	sp->lno = cmdp->addr1.lno;
5719304Speter
5819304Speter	/* Or the last line in the file if deleted to the end of the file. */
5919304Speter	if (db_last(sp, &lno))
6019304Speter		return (1);
6119304Speter	if (sp->lno > lno)
6219304Speter		sp->lno = lno;
6319304Speter	return (0);
6419304Speter}
65