/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2005 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/* All Rights Reserved */
/* Copyright (c) 1981 Regents of the University of California */
#pragma ident "%Z%%M% %I% %E% SMI"
#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.
*
* ex_v.c entry points, checking of terminal characteristics
*
* ex_vadj.c logical screen control, use of intelligent operations
* updating of screen after changes.
*
* ex_vget.c input of single keys and reading of input lines
* from the echo area, handling of \ escapes on input for
* uppercase only terminals, 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
*/
void setsize();
void winch();
void vintr();
int windowchg;
int sigok;
/* reinitialize window size after SIGWINCH */
void windowinit()
{
windowchg = 0;
setsize();
setwind();
}
void redraw()
{
vsave();
windowinit();
vclear();
vclean();
} else {
vfixcurs();
}
}
/*ARGSUSED*/
void
#ifdef __STDC__
#else
int sig;
#endif
{
int l;
#ifdef XPG4
#endif /* XPG4 */
if (sigok) {
redraw();
}
}
else
windowchg++;
}
void
setsize()
{
int l;
}
#ifdef XPG4
if (envlines != -1) {
}
if (envcolumns != -1) {
}
}
}
#endif /* XPG4 */
if (lines <= 1)
lines = 24;
l = lines;
if (columns <= 4)
columns = 1000;
}
/*
* Enter open mode
*/
void
oop(void)
{
unsigned char *ic;
ttymode f; /* was register */
int resize;
windowchg = 0;
ovbeg();
if (peekchar() == '/') {
gettext("Pattern not found on addressed line"));
ic--;
} else {
getDOT();
}
donewline();
/*
* If overstrike then have to HARDOPEN
* else if can move cursor up off current line can use CRTOPEN (~~vi1)
* otherwise have to use ONEOPEN (like adm3)
*/
if (over_strike && !erase_overstrike)
else if (cursor_address || cursor_up)
else
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 (!inglobal)
savevis();
f = ostart();
outcol = 0;
} else
vmain();
vclean();
Command = (unsigned char *)"open";
ovend(f);
}
void
ovbeg(void)
{
if (inopen)
fixzero();
setdot();
pastwh();
}
void
{
splitw++;
vclreol();
holdcm = 0;
splitw = 0;
ostop(f);
setoutt();
undvis();
inopen = 0;
flusho();
}
/*
* Enter visual mode
*/
void
vop(void)
{
int c;
ttymode f; /* was register */
extern unsigned char termtype[];
if (!cursor_address && !cursor_up) {
if (initev) {
if (generic_type)
putNFL();
putNFL();
oop();
return;
}
}
if (over_strike && !erase_overstrike) {
if (initev)
goto toopen;
}
if (!clear_screen) {
if (initev)
goto toopen;
}
if (!scroll_forward) {
if (initev)
goto toopen;
}
windowchg = 0;
ovbeg();
c = 0;
c = getchar();
pastwh();
setwind();
donewline();
if (!inglobal)
savevis();
vmoving = 0;
f = ostart();
if (initev == 0) {
}
vmain();
Command = (unsigned char *)"visual";
ovend(f);
}
/*
* Hack to allow entry to visual with
* empty buffer since routines internally
* demand at least one line.
*/
void
fixzero(void)
{
vdoappend((unsigned char *)"");
if (!ochng)
sync();
}
/*
* 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
* 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;
saveall();
}
/*
* stuff back to [unddol,dol], and killing the partial line kill indicators.
*/
void
undvis(void)
{
if (ruptible)
squish();
}
/*
* Set the window parameters based on the base state bastate
* and the available buffer space.
*/
void
setwind(void)
{
switch (bastate) {
case ONEOPEN:
if (auto_right_margin)
WCOLS--;
/* fall into ... */
case HARDOPEN:
ZERO = 0;
holdcm++;
break;
case CRTOPEN:
/* fall into */
case VISUAL:
if (ZERO < 0)
ZERO = 0;
break;
}
}
/*
* If so, then divide the screen buffer up into lines,
* and initialize a bunch of state variables before we start.
*/
void
{
int i;
static int beenhere;
if (WCOLS == 1000)
serror((unsigned char *)
gettext("Don't know enough about your terminal to use %s"),
Command);
if(beenhere)
for (i = 0; i < ZERO; i++)
for (; i <= WECHO; i++)
if(beenhere++) {
for (; i < TUBELINES; i++)
}
if(!undo) {
vUNDdot = 0;
}
inopen = 1;
#ifdef CBREAK
#endif
vmoving = 0;
splitw = 0;
doomed = 0;
holdupd = 0;
if(!undo)
Peekkey = 0;
if (vSCROLL == 0)
}
#ifdef CBREAK
/*ARGSUSED*/
void
#ifdef __STDC__
#else
int sig;
#endif
{
if (vcatch)
onintr(0);
draino();
}
#endif
/*
* Set the size of the screen to size lines, to take effect the
* next time the screen is redrawn.
*/
void
{
int b;
return;
if (b >= lines - 1)
b = lines - 2;
if (b < 0)
b = 0;
basWTOP = b;
}