xref: /netbsd-src/external/bsd/nvi/dist/ex/ex_delete.c (revision 2f698edb5c1cb2dcd9e762b0abb50c41dde8b6b7)
1*2f698edbSchristos /*	$NetBSD: ex_delete.c,v 1.3 2014/01/26 21:43:45 christos Exp $	*/
2dbd550edSchristos /*-
3dbd550edSchristos  * Copyright (c) 1992, 1993, 1994
4dbd550edSchristos  *	The Regents of the University of California.  All rights reserved.
5dbd550edSchristos  * Copyright (c) 1992, 1993, 1994, 1995, 1996
6dbd550edSchristos  *	Keith Bostic.  All rights reserved.
7dbd550edSchristos  *
8dbd550edSchristos  * See the LICENSE file for redistribution information.
9dbd550edSchristos  */
10dbd550edSchristos 
11dbd550edSchristos #include "config.h"
12dbd550edSchristos 
13*2f698edbSchristos #include <sys/cdefs.h>
14*2f698edbSchristos #if 0
15dbd550edSchristos #ifndef lint
16dbd550edSchristos static const char sccsid[] = "Id: ex_delete.c,v 10.11 2001/06/25 15:19:15 skimo Exp  (Berkeley) Date: 2001/06/25 15:19:15 ";
17dbd550edSchristos #endif /* not lint */
18*2f698edbSchristos #else
19*2f698edbSchristos __RCSID("$NetBSD: ex_delete.c,v 1.3 2014/01/26 21:43:45 christos Exp $");
20*2f698edbSchristos #endif
21dbd550edSchristos 
22dbd550edSchristos #include <sys/types.h>
23dbd550edSchristos #include <sys/queue.h>
24dbd550edSchristos 
25dbd550edSchristos #include <bitstring.h>
26dbd550edSchristos #include <limits.h>
27dbd550edSchristos #include <stdio.h>
28dbd550edSchristos 
29dbd550edSchristos #include "../common/common.h"
30dbd550edSchristos 
31dbd550edSchristos /*
32dbd550edSchristos  * ex_delete: [line [,line]] d[elete] [buffer] [count] [flags]
33dbd550edSchristos  *
34dbd550edSchristos  *	Delete lines from the file.
35dbd550edSchristos  *
36dbd550edSchristos  * PUBLIC: int ex_delete __P((SCR *, EXCMD *));
37dbd550edSchristos  */
38dbd550edSchristos int
ex_delete(SCR * sp,EXCMD * cmdp)39dbd550edSchristos ex_delete(SCR *sp, EXCMD *cmdp)
40dbd550edSchristos {
41dbd550edSchristos 	db_recno_t lno;
42dbd550edSchristos 
43dbd550edSchristos 	NEEDFILE(sp, cmdp);
44dbd550edSchristos 
45dbd550edSchristos 	/*
46dbd550edSchristos 	 * !!!
47dbd550edSchristos 	 * Historically, lines deleted in ex were not placed in the numeric
48dbd550edSchristos 	 * buffers.  We follow historic practice so that we don't overwrite
49dbd550edSchristos 	 * vi buffers accidentally.
50dbd550edSchristos 	 */
51dbd550edSchristos 	if (cut(sp,
52dbd550edSchristos 	    FL_ISSET(cmdp->iflags, E_C_BUFFER) ? &cmdp->buffer : NULL,
53dbd550edSchristos 	    &cmdp->addr1, &cmdp->addr2, CUT_LINEMODE))
54dbd550edSchristos 		return (1);
55dbd550edSchristos 
56dbd550edSchristos 	/* Delete the lines. */
57dbd550edSchristos 	if (del(sp, &cmdp->addr1, &cmdp->addr2, 1))
58dbd550edSchristos 		return (1);
59dbd550edSchristos 
60dbd550edSchristos 	/* Set the cursor to the line after the last line deleted. */
61dbd550edSchristos 	sp->lno = cmdp->addr1.lno;
62dbd550edSchristos 
63dbd550edSchristos 	/* Or the last line in the file if deleted to the end of the file. */
64dbd550edSchristos 	if (db_last(sp, &lno))
65dbd550edSchristos 		return (1);
66dbd550edSchristos 	if (sp->lno > lno)
67dbd550edSchristos 		sp->lno = lno;
68dbd550edSchristos 	return (0);
69dbd550edSchristos }
70