summaryrefslogtreecommitdiff
path: root/usr.bin/vi/nex/ex_shift.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.bin/vi/nex/ex_shift.c')
-rw-r--r--usr.bin/vi/nex/ex_shift.c193
1 files changed, 0 insertions, 193 deletions
diff --git a/usr.bin/vi/nex/ex_shift.c b/usr.bin/vi/nex/ex_shift.c
deleted file mode 100644
index 8a0b858cbb6f..000000000000
--- a/usr.bin/vi/nex/ex_shift.c
+++ /dev/null
@@ -1,193 +0,0 @@
-/*-
- * Copyright (c) 1992, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char sccsid[] = "@(#)ex_shift.c 8.12 (Berkeley) 12/29/93";
-#endif /* not lint */
-
-#include <sys/types.h>
-
-#include <stdlib.h>
-#include <string.h>
-
-#include "vi.h"
-#include "excmd.h"
-
-enum which {LEFT, RIGHT};
-static int shift __P((SCR *, EXF *, EXCMDARG *, enum which));
-
-int
-ex_shiftl(sp, ep, cmdp)
- SCR *sp;
- EXF *ep;
- EXCMDARG *cmdp;
-{
- return (shift(sp, ep, cmdp, LEFT));
-}
-
-int
-ex_shiftr(sp, ep, cmdp)
- SCR *sp;
- EXF *ep;
- EXCMDARG *cmdp;
-{
- return (shift(sp, ep, cmdp, RIGHT));
-}
-
-static int
-shift(sp, ep, cmdp, rl)
- SCR *sp;
- EXF *ep;
- EXCMDARG *cmdp;
- enum which rl;
-{
- recno_t from, to;
- size_t blen, len, newcol, newidx, oldcol, oldidx, sw;
- int curset;
- char *p, *bp, *tbp;
-
- if (O_VAL(sp, O_SHIFTWIDTH) == 0) {
- msgq(sp, M_INFO, "shiftwidth option set to 0");
- return (0);
- }
-
- /*
- * The historic version of vi permitted the user to string any number
- * of '>' or '<' characters together, resulting in an indent of the
- * appropriate levels. There's a special hack in ex_cmd() so that
- * cmdp->argv[0] points to the string of '>' or '<' characters.
- *
- * Q: What's the difference between the people adding features
- * to vi and the Girl Scouts?
- * A: The Girl Scouts have mint cookies and adult supervision.
- */
- for (p = cmdp->argv[0]->bp, sw = 0; *p == '>' || *p == '<'; ++p)
- sw += O_VAL(sp, O_SHIFTWIDTH);
-
- GET_SPACE_RET(sp, bp, blen, 256);
-
- curset = 0;
- for (from = cmdp->addr1.lno, to = cmdp->addr2.lno; from <= to; ++from) {
- if ((p = file_gline(sp, ep, from, &len)) == NULL)
- goto err;
- if (!len) {
- if (sp->lno == from)
- curset = 1;
- continue;
- }
-
- /*
- * Calculate the old indent amount and the number of
- * characters it used.
- */
- for (oldidx = 0, oldcol = 0; oldidx < len; ++oldidx)
- if (p[oldidx] == ' ')
- ++oldcol;
- else if (p[oldidx] == '\t')
- oldcol += O_VAL(sp, O_TABSTOP) -
- oldcol % O_VAL(sp, O_TABSTOP);
- else
- break;
-
- /* Calculate the new indent amount. */
- if (rl == RIGHT)
- newcol = oldcol + sw;
- else {
- newcol = oldcol < sw ? 0 : oldcol - sw;
- if (newcol == oldcol) {
- if (sp->lno == from)
- curset = 1;
- continue;
- }
- }
-
- /* Get a buffer that will hold the new line. */
- ADD_SPACE_RET(sp, bp, blen, newcol + len);
-
- /*
- * Build a new indent string and count the number of
- * characters it uses.
- */
- for (tbp = bp, newidx = 0;
- newcol >= O_VAL(sp, O_TABSTOP); ++newidx) {
- *tbp++ = '\t';
- newcol -= O_VAL(sp, O_TABSTOP);
- }
- for (; newcol > 0; --newcol, ++newidx)
- *tbp++ = ' ';
-
- /* Add the original line. */
- memmove(tbp, p + oldidx, len - oldidx);
-
- /* Set the replacement line. */
- if (file_sline(sp, ep, from, bp, (tbp + (len - oldidx)) - bp)) {
-err: FREE_SPACE(sp, bp, blen);
- return (1);
- }
-
- /*
- * !!!
- * The shift command in historic vi had the usual bizarre
- * collection of cursor semantics. If called from vi, the
- * cursor was repositioned to the first non-blank character
- * of the lowest numbered line shifted. If called from ex,
- * the cursor was repositioned to the first non-blank of the
- * highest numbered line shifted. Here, if the cursor isn't
- * part of the set of lines that are moved, move it to the
- * first non-blank of the last line shifted. (This makes
- * ":3>>" in vi work reasonably.) If the cursor is part of
- * the shifted lines, it doesn't get moved at all. This
- * permits shifting of marked areas, i.e. ">'a." shifts the
- * marked area twice, something that couldn't be done with
- * historic vi.
- */
- if (sp->lno == from) {
- curset = 1;
- if (newidx > oldidx)
- sp->cno += newidx - oldidx;
- else if (sp->cno >= oldidx - newidx)
- sp->cno -= oldidx - newidx;
- }
- }
- if (!curset) {
- sp->lno = to;
- sp->cno = 0;
- (void)nonblank(sp, ep, to, &sp->cno);
- }
-
- FREE_SPACE(sp, bp, blen);
-
- sp->rptlines[rl == RIGHT ? L_RSHIFT : L_LSHIFT] +=
- cmdp->addr2.lno - cmdp->addr1.lno + 1;
- return (0);
-}