aboutsummaryrefslogtreecommitdiff
path: root/usr.bin/vi/nvi/v_z.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.bin/vi/nvi/v_z.c')
-rw-r--r--usr.bin/vi/nvi/v_z.c133
1 files changed, 133 insertions, 0 deletions
diff --git a/usr.bin/vi/nvi/v_z.c b/usr.bin/vi/nvi/v_z.c
new file mode 100644
index 000000000000..31937ffc951c
--- /dev/null
+++ b/usr.bin/vi/nvi/v_z.c
@@ -0,0 +1,133 @@
+/*-
+ * 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[] = "@(#)v_z.c 8.8 (Berkeley) 12/2/93";
+#endif /* not lint */
+
+#include <sys/types.h>
+
+#include "vi.h"
+#include "vcmd.h"
+
+/*
+ * v_z -- [count]z[count][-.+^<CR>]
+ * Move the screen.
+ */
+int
+v_z(sp, ep, vp, fm, tm, rp)
+ SCR *sp;
+ EXF *ep;
+ VICMDARG *vp;
+ MARK *fm, *tm, *rp;
+{
+ recno_t last, lno;
+ u_int value;
+
+ /*
+ * The first count is the line to use. If the value doesn't
+ * exist, use the last line.
+ */
+ if (F_ISSET(vp, VC_C1SET)) {
+ lno = vp->count;
+ if (file_lline(sp, ep, &last))
+ return (1);
+ if (lno > last)
+ lno = last;
+ } else
+ lno = fm->lno;
+
+ /* Set return cursor values. */
+ rp->lno = lno;
+ rp->cno = fm->cno;
+
+ /*
+ * The second count is the displayed window size, i.e. the 'z'
+ * command is another way to get artificially small windows.
+ *
+ * !!!
+ * A window size of 0 was historically allowed, and simply ignored.
+ * Also, this could be much more simply done by modifying the value
+ * of the O_WINDOW option, but that's not how it worked historically.
+ */
+ if (F_ISSET(vp, VC_C2SET) &&
+ vp->count2 != 0 && sp->s_rrel(sp, vp->count2))
+ return (1);
+
+ switch (vp->character) {
+ case '-': /* Put the line at the bottom. */
+ if (sp->s_fill(sp, ep, lno, P_BOTTOM))
+ return (1);
+ break;
+ case '.': /* Put the line in the middle. */
+ if (sp->s_fill(sp, ep, lno, P_MIDDLE))
+ return (1);
+ break;
+ default: /* Put the line at the top for <cr>. */
+ value = term_key_val(sp, vp->character);
+ if (value != K_CR && value != K_NL) {
+ msgq(sp, M_ERR, "usage: %s.", vp->kp->usage);
+ return (1);
+ }
+ /* FALLTHROUGH */
+ case '+': /* Put the line at the top. */
+ if (sp->s_fill(sp, ep, lno, P_TOP))
+ return (1);
+ break;
+ case '^': /* Print the screen before the z- screen. */
+ /*
+ * !!!
+ * Historic practice isn't real clear on this one. It seems
+ * that the command "70z^" is the same as ":70<cr>z-z^" with
+ * an off-by-one difference. So, until I find documentation
+ * to the contrary, the z^ command in this implementation
+ * displays the screen immediately before the current one.
+ * Fill the screen with the selected line at the bottom, then,
+ * scroll the screen down a page, and move to the middle line
+ * of the screen. Historic vi moved the cursor to some random
+ * place in the screen, as far as I can tell.
+ */
+ if (sp->s_fill(sp, ep, lno, P_BOTTOM))
+ return (1);
+ if (sp->s_down(sp, ep, rp, sp->t_maxrows - 1, 1))
+ return (1);
+ if (sp->s_position(sp, ep, rp, 0, P_MIDDLE))
+ return (1);
+ break;
+ }
+
+ /* If the map changes, have to redraw the entire screen. */
+ F_SET(sp, S_REDRAW);
+
+ return (0);
+}