summaryrefslogtreecommitdiff
path: root/src/vi/ex-070224/ex_v.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/vi/ex-070224/ex_v.c')
-rw-r--r--src/vi/ex-070224/ex_v.c547
1 files changed, 0 insertions, 547 deletions
diff --git a/src/vi/ex-070224/ex_v.c b/src/vi/ex-070224/ex_v.c
deleted file mode 100644
index 969336c..0000000
--- a/src/vi/ex-070224/ex_v.c
+++ /dev/null
@@ -1,547 +0,0 @@
-/*
- * This code contains changes by
- * Gunnar Ritter, Freiburg i. Br., Germany, 2002. All rights reserved.
- *
- * Conditions 1, 2, and 4 and the no-warranty notice below apply
- * to these changes.
- *
- *
- * Copyright (c) 1980, 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.
- *
- *
- * Copyright(C) Caldera International Inc. 2001-2002. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * Redistributions of source code and documentation must retain the
- * above copyright notice, this list of conditions and the following
- * disclaimer.
- * 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.
- * All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed or owned by Caldera
- * International, Inc.
- * Neither the name of Caldera International, Inc. nor the names of
- * other contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * USE OF THE SOFTWARE PROVIDED FOR UNDER THIS LICENSE BY CALDERA
- * INTERNATIONAL, INC. 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 CALDERA INTERNATIONAL, INC. 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
-#ifdef DOSCCS
-static char sccsid[] = "@(#)ex_v.c 1.19 (gritter) 8/4/05";
-#endif
-#endif
-
-/* from ex_v.c 7.8.1 (2.11BSD GTE) 12/9/94 */
-
-#include "ex.h"
-#include "ex_re.h"
-#include "ex_tty.h"
-#include "ex_vis.h"
-
-/*
- * Entry points to open and visual from command mode processor.
- * The open/visual code breaks down roughly as follows:
- *
- * ex_v.c entry points, checking of terminal characteristics
- *
- * ex_vadj.c logical screen control, use of intelligent operations
- * insert/delete line and coordination with screen image;
- * updating of screen after changes.
- *
- * ex_vget.c input of single keys and reading of input lines
- * from the echo area, handling of memory for repeated
- * commands and small saved texts from inserts and partline
- * deletes, notification of multi line changes in the echo
- * area.
- *
- * ex_vmain.c main command decoding, some command processing.
- *
- * ex_voperate.c decoding of operator/operand sequences and
- * contextual scans, implementation of word motions.
- *
- * ex_vops.c major operator interfaces, undos, motions, deletes,
- * changes, opening new lines, shifts, replacements and yanks
- * coordinating logical and physical changes.
- *
- * ex_vops2.c subroutines for operator interfaces in ex_vops.c,
- * insert mode, read input line processing at lowest level.
- *
- * ex_vops3.c structured motion definitions of ( ) { } and [ ] operators,
- * indent for lisp routines, () and {} balancing.
- *
- * ex_vput.c output routines, clearing, physical mapping of logical cursor
- * positioning, cursor motions, handling of insert character
- * and delete character functions of intelligent and unintelligent
- * terminals, visual mode tracing routines (for debugging),
- * control of screen image and its updating.
- *
- * ex_vwind.c window level control of display, forward and backward rolls,
- * absolute motions, contextual displays, line depth determination
- */
-
-JMP_BUF venv;
-static cell *atube;
-
-/*
- * Determine and set the size for visual mode buffers.
- */
-static void
-tubesizes(void)
-{
- TUBELINES = TLINES;
- /*
- * TUBECOLS should stay at 160 at least since this defines the
- * maximum length of opening on hardcopies and allows two lines
- * of open on terminals like adm3's (glass tty's) where it
- * switches to pseudo hardcopy mode when a line gets longer
- * than 80 characters.
- */
- TUBECOLS = TCOLUMNS < 160 ? 160 : TCOLUMNS;
- TUBESIZE = TLINES * TCOLUMNS;
- free(vlinfo);
- free(vtube);
- free(atube);
- vlinfo = malloc((TUBELINES+2) * sizeof *vlinfo);
- vtube = malloc(TUBELINES * sizeof *vtube);
- atube = malloc((TUBESIZE + LBSIZE) * sizeof *atube);
- if (vlinfo == NULL || vtube == NULL || atube == NULL)
- error("Screen too large");
-}
-
-/*
- * Enter open mode
- */
-void
-oop(void)
-{
- register char *ic;
- struct termios f; /* mjm: was register */
- int resize;
-
- resize = SETJMP(venv);
- if (resize) {
- setsize();
- initev = (char *)0;
- inopen = 0;
- addr1 = addr2 = dot;
- }
- tubesizes();
-#ifdef SIGWINCH
- signal(SIGWINCH, onwinch);
-#endif
- ovbeg();
- if (peekchar() == '/') {
- ignore(compile(getchar(), 1));
- savere(&scanre);
- if (execute(0, dot) == 0)
- error(catgets(catd, 1, 207,
- "Fail|Pattern not found on addressed line"));
- ic = loc1;
- if (ic > linebuf && *ic == 0)
- ic--;
- } else {
- getDOT();
- ic = vskipwh(linebuf);
- }
- newline();
-
- /*
- * If overstrike then have to HARDOPEN
- * else if can move cursor up off current line can use CRTOPEN (~~vi1)
- * otherwise (ugh) have to use ONEOPEN (like adm3)
- */
- if (OS && !EO)
- bastate = HARDOPEN;
- else if (CA || UP)
- bastate = CRTOPEN;
- else
- bastate = ONEOPEN;
- setwind();
-
- /*
- * To avoid bombing on glass-crt's when the line is too long
- * pretend that such terminals are 160 columns wide.
- * If a line is too wide for display, we will dynamically
- * switch to hardcopy open mode.
- */
- if (state != CRTOPEN)
- WCOLS = TUBECOLS;
- if (!inglobal)
- savevis();
- vok(atube);
- if (state != CRTOPEN)
- TCOLUMNS = WCOLS;
- Outchar = vputchar;
- f = ostart();
- if (state == CRTOPEN) {
- if (outcol == UKCOL)
- outcol = 0;
- vmoveitup(1, 1);
- } else
- outline = destline = WBOT;
- vshow(dot, NOLINE);
- vnline(ic);
- vmain();
- if (state != CRTOPEN)
- vclean();
- Command = "open";
- ovend(f);
-#ifdef SIGWINCH
- signal(SIGWINCH, SIG_DFL);
-#endif
-}
-
-void
-ovbeg(void)
-{
-
- if (!value(OPEN))
- error(catgets(catd, 1, 208,
- "Can't use open/visual unless open option is set"));
- if (inopen)
- error(catgets(catd, 1, 209,
- "Recursive open/visual not allowed"));
- Vlines = lineDOL();
- fixzero();
- setdot();
- pastwh();
- dot = addr2;
-}
-
-void
-ovend(struct termios f)
-{
-
- splitw++;
- vgoto(WECHO, 0);
- vclreol();
- vgoto(WECHO, 0);
- holdcm = 0;
- splitw = 0;
- ostop(f);
- setoutt();
- undvis();
- TCOLUMNS = OCOLUMNS;
- inopen = 0;
- flusho();
- netchHAD(Vlines);
-}
-
-/*
- * Enter visual mode
- */
-void
-vop(void)
-{
- register int c;
- struct termios f; /* mjm: was register */
- int resize;
-
- if (!CA && UP == NOSTR) {
- if (initev) {
-toopen:
- merror(catgets(catd, 1, 210, "[Using open mode]"));
- putNFL();
- oop();
- return;
- }
- error(catgets(catd, 1, 211,
- "Visual needs addressible cursor or upline capability"));
- }
- if (OS && !EO) {
- if (initev)
- goto toopen;
- error(catgets(catd, 1, 212,
- "Can't use visual on a terminal which overstrikes"));
- }
- if (!CL) {
- if (initev)
- goto toopen;
- error(catgets(catd, 1, 213,
- "Visual requires clear screen capability"));
- }
- if (NS && !SF) {
- if (initev)
- goto toopen;
- error(catgets(catd, 1, 214, "Visual requires scrolling"));
- }
- resize = SETJMP(venv);
- if (resize) {
- setsize();
- initev = (char *)0;
- inopen = 0;
- addr1 = addr2 = dot;
- }
- tubesizes();
-#ifdef SIGWINCH
- signal(SIGWINCH, onwinch);
-#endif
- ovbeg();
- bastate = VISUAL;
- c = 0;
- if (any(peekchar(), "+-^."))
- c = getchar();
- pastwh();
- vsetsiz(isdigit(peekchar()) ? getnum() : value(WINDOW));
- setwind();
- newline();
- vok(atube);
- if (!inglobal)
- savevis();
- Outchar = vputchar;
- vmoving = 0;
- f = ostart();
- if (initev == 0) {
- vcontext(dot, c);
- vnline(NOSTR);
- }
- vmain();
- Command = "visual";
- ovend(f);
-#ifdef SIGWINCH
- signal(SIGWINCH, SIG_DFL);
-#endif
-}
-
-/*
- * Hack to allow entry to visual with
- * empty buffer since routines internally
- * demand at least one line.
- */
-void
-fixzero(void)
-{
-
- if (dol == zero) {
- register bool ochng = chng;
-
- vdoappend("");
- if (!ochng)
- synced();
- fixedzero++;
- addr1 = addr2 = one;
- } else if (addr2 == zero)
- addr2 = one;
-}
-
-/*
- * Save lines before visual between unddol and truedol.
- * Accomplish this by throwing away current [unddol,truedol]
- * and then saving all the lines in the buffer and moving
- * unddol back to dol. Don't do this if in a global.
- *
- * If you do
- * g/xxx/vi.
- * and then do a
- * :e xxxx
- * at some point, and then quit from the visual and undo
- * you get the old file back. Somewhat weird.
- */
-void
-savevis(void)
-{
-
- if (inglobal)
- return;
- truedol = unddol;
- saveall();
- unddol = dol;
- undkind = UNDNONE;
-}
-
-/*
- * Restore a sensible state after a visual/open, moving the saved
- * stuff back to [unddol,dol], and killing the partial line kill indicators.
- */
-void
-undvis(void)
-{
-
- if (ruptible)
- signal(SIGINT, onintr);
- squish();
- pkill[0] = pkill[1] = 0;
- unddol = truedol;
- unddel = zero;
- undap1 = one;
- undap2 = dol + 1;
- undkind = UNDALL;
- if (undadot <= zero || undadot > dol)
- undadot = zero+1;
-}
-
-/*
- * Set the window parameters based on the base state bastate
- * and the available buffer space.
- */
-void
-setwind(void)
-{
-
- WCOLS = TCOLUMNS;
- switch (bastate) {
-
- case ONEOPEN:
- if (AM)
- WCOLS--;
- /* fall into ... */
-
- case HARDOPEN:
- basWTOP = WTOP = WBOT = WECHO = 0;
- ZERO = 0;
- holdcm++;
- break;
-
- case CRTOPEN:
- basWTOP = TLINES - 2;
- /* fall into */
-
- case VISUAL:
- ZERO = TLINES - TUBESIZE / WCOLS;
- if (ZERO < 0)
- ZERO = 0;
- if (ZERO > basWTOP)
- error(catgets(catd, 1, 215,
- "Screen too large for internal buffer"));
- WTOP = basWTOP; WBOT = TLINES - 2; WECHO = TLINES - 1;
- break;
- }
- state = bastate;
- basWLINES = WLINES = WBOT - WTOP + 1;
-}
-
-/*
- * Can we hack an open/visual on this terminal?
- * If so, then divide the screen buffer up into lines,
- * and initialize a bunch of state variables before we start.
- */
-void
-vok(register cell *atube)
-{
- register int i;
-
- if (WCOLS == 1000)
- serror(catgets(catd, 1, 216,
- "Don't know enough about your terminal to use %s"), Command);
- if (WCOLS > TUBECOLS)
- error(catgets(catd, 1, 217, "Terminal too wide"));
- if (WLINES >= TUBELINES || WCOLS * (WECHO - ZERO + 1) > TUBESIZE)
- error(catgets(catd, 1, 218, "Screen too large"));
-
- vtube0 = atube;
- vclrcell(atube, WCOLS * (WECHO - ZERO + 1));
- for (i = 0; i < ZERO; i++)
- vtube[i] = (cell *) 0;
- for (; i <= WECHO; i++)
- vtube[i] = atube, atube += WCOLS;
- for (; i < TUBELINES; i++)
- vtube[i] = (cell *) 0;
- vutmp = (char *)atube;
- vundkind = VNONE;
- vUNDdot = 0;
- OCOLUMNS = TCOLUMNS;
- inopen = 1;
- signal(SIGINT, vintr);
- vmoving = 0;
- splitw = 0;
- doomed = 0;
- holdupd = 0;
- Peekkey = 0;
- vcnt = vcline = 0;
- if (vSCROLL == 0)
- vSCROLL = value(SCROLL);
- /*old vSCROLL = (value(WINDOW)+1)/2;*//* round up so dft=6,11 */
-}
-
-void
-vintr(int signum)
-{
- extern JMP_BUF readbuf;
- extern int doingread;
-
- signal(SIGINT, vintr);
- if (vcatch)
- onintr(SIGINT);
- ungetkey(ATTN);
- draino();
- if (doingread) {
- doingread = 0;
- LONGJMP(readbuf, 1);
- }
-}
-
-/*
- * Set the size of the screen to size lines, to take effect the
- * next time the screen is redrawn.
- */
-void
-vsetsiz(int size)
-{
- register int b;
-
- if (bastate != VISUAL)
- return;
- b = TLINES - 1 - size;
- if (b >= TLINES - 1)
- b = TLINES - 2;
- if (b < 0)
- b = 0;
- basWTOP = b;
- basWLINES = WBOT - b + 1;
-}
-
-#ifdef SIGWINCH
-void
-onwinch(int signum)
-{
- vsave();
- setty(normf);
- LONGJMP(venv, 1);
-}
-#endif