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