003 File Manager
Current Path:
/usr/src/contrib/nvi/common
usr
/
src
/
contrib
/
nvi
/
common
/
📁
..
📄
args.h
(844 B)
📄
common.h
(2.54 KB)
📄
conv.c
(9.52 KB)
📄
conv.h
(1.32 KB)
📄
cut.c
(8.38 KB)
📄
cut.h
(2.52 KB)
📄
delete.c
(3.47 KB)
📄
encoding.c
(5.48 KB)
📄
exf.c
(38.68 KB)
📄
exf.h
(2.69 KB)
📄
extern.h
(4.88 KB)
📄
gs.h
(6.72 KB)
📄
key.c
(23.01 KB)
📄
key.h
(8.61 KB)
📄
line.c
(12.69 KB)
📄
log.c
(16.88 KB)
📄
log.h
(487 B)
📄
main.c
(12.91 KB)
📄
mark.c
(6.3 KB)
📄
mark.h
(1.46 KB)
📄
mem.h
(6.5 KB)
📄
msg.c
(20.35 KB)
📄
msg.h
(2.19 KB)
📄
multibyte.h
(3.1 KB)
📄
options.awk
(166 B)
📄
options.c
(29.22 KB)
📄
options.h
(3.58 KB)
📄
options_def.h
(1.73 KB)
📄
options_f.c
(5.98 KB)
📄
put.c
(5.85 KB)
📄
recover.c
(21.47 KB)
📄
screen.c
(4.48 KB)
📄
screen.h
(8.2 KB)
📄
search.c
(10.59 KB)
📄
seq.c
(7.81 KB)
📄
seq.h
(1.53 KB)
📄
util.c
(7.28 KB)
📄
util.h
(2.89 KB)
Editing: delete.c
/*- * 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" #include <sys/types.h> #include <sys/queue.h> #include <sys/time.h> #include <bitstring.h> #include <errno.h> #include <limits.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include "common.h" /* * del -- * Delete a range of text. * * PUBLIC: int del(SCR *, MARK *, MARK *, int); */ int del(SCR *sp, MARK *fm, MARK *tm, int lmode) { recno_t lno; size_t blen, len, nlen, tlen; CHAR_T *bp, *p; int eof, rval; bp = NULL; /* Case 1 -- delete in line mode. */ if (lmode) { for (lno = tm->lno; lno >= fm->lno; --lno) { if (db_delete(sp, lno)) return (1); ++sp->rptlines[L_DELETED]; if (lno % INTERRUPT_CHECK == 0 && INTERRUPTED(sp)) break; } goto done; } /* * Case 2 -- delete to EOF. This is a special case because it's * easier to pick it off than try and find it in the other cases. */ if (db_last(sp, &lno)) return (1); if (tm->lno >= lno) { if (tm->lno == lno) { if (db_get(sp, lno, DBG_FATAL, &p, &len)) return (1); eof = tm->cno != ENTIRE_LINE && tm->cno >= len ? 1 : 0; } else eof = 1; if (eof) { for (lno = tm->lno; lno > fm->lno; --lno) { if (db_delete(sp, lno)) return (1); ++sp->rptlines[L_DELETED]; if (lno % INTERRUPT_CHECK == 0 && INTERRUPTED(sp)) break; } if (db_get(sp, fm->lno, DBG_FATAL, &p, &len)) return (1); GET_SPACE_RETW(sp, bp, blen, fm->cno); MEMCPY(bp, p, fm->cno); if (db_set(sp, fm->lno, bp, fm->cno)) return (1); goto done; } } /* Case 3 -- delete within a single line. */ if (tm->lno == fm->lno) { if (db_get(sp, fm->lno, DBG_FATAL, &p, &len)) return (1); if (len != 0) { GET_SPACE_RETW(sp, bp, blen, len); if (fm->cno != 0) MEMCPY(bp, p, fm->cno); MEMCPY(bp + fm->cno, p + (tm->cno + 1), len - (tm->cno + 1)); if (db_set(sp, fm->lno, bp, len - ((tm->cno - fm->cno) + 1))) goto err; } goto done; } /* * Case 4 -- delete over multiple lines. * * Copy the start partial line into place. */ if ((tlen = fm->cno) != 0) { if (db_get(sp, fm->lno, DBG_FATAL, &p, NULL)) return (1); GET_SPACE_RETW(sp, bp, blen, tlen + 256); MEMCPY(bp, p, tlen); } /* Copy the end partial line into place. */ if (db_get(sp, tm->lno, DBG_FATAL, &p, &len)) goto err; if (len != 0 && tm->cno != len - 1) { /* * XXX * We can overflow memory here, if the total length is greater * than SIZE_T_MAX. The only portable way I've found to test * is depending on the overflow being less than the value. */ nlen = (len - (tm->cno + 1)) + tlen; if (tlen > nlen) { msgq(sp, M_ERR, "002|Line length overflow"); goto err; } if (tlen == 0) { GET_SPACE_RETW(sp, bp, blen, nlen); } else ADD_SPACE_RETW(sp, bp, blen, nlen); MEMCPY(bp + tlen, p + (tm->cno + 1), len - (tm->cno + 1)); tlen += len - (tm->cno + 1); } /* Set the current line. */ if (db_set(sp, fm->lno, bp, tlen)) goto err; /* Delete the last and intermediate lines. */ for (lno = tm->lno; lno > fm->lno; --lno) { if (db_delete(sp, lno)) goto err; ++sp->rptlines[L_DELETED]; if (lno % INTERRUPT_CHECK == 0 && INTERRUPTED(sp)) break; } done: rval = 0; if (0) err: rval = 1; if (bp != NULL) FREE_SPACEW(sp, bp, blen); return (rval); }
Upload File
Create Folder