1BSD/ex-1.1/exv.c
#include "ex.h"
#include "ex_vis.h"
#include "ex_tty.h"
/*
* Ex - a text editor
* Bill Joy UCB June 1977
*/
vop()
{
#ifndef VISUAL
error("No visual in this version");
}
#endif
#ifdef VISUAL
register int c;
char atube[TUBESIZE + LBSIZE], *ic;
int lines;
if (!CA)
error("Visual requires addressible cursor");
if (!CLEAR)
error("Visual requires clear screen capability");
if (!value(OPEN))
error("Can't use visual mode unless open option is set");
VLINES = LINES - 1;
vok(atube);
visual = 1;
VCOLUMNS = COLUMNS;
setdot();
if (addr2 == zero && dol > zero)
addr1 = one, addr2 = one;
nonzero();
c = getchar();
switch (c) {
case '^':
if (addr2 == one)
error("At TOP|At top-of-file");
case '-':
case '.':
vch = c;
break;
case '+':
if (addr2 == dol)
error("At EOF|At end-of-file");
addr2++;
vch = 0;
break;
default:
ungetchar(c);
vch = 0;
break;
}
skipwh();
ZERO = VLINES - (digit(peekchar()) ? getnum() : value(WINDOW));
if (ZERO >= VLINES)
ZERO = VLINES - 1;
if (ZERO < 0)
ZERO = 0;
newline();
Outchar = &vputchar;
if (!inglobal)
saveall();
lines = dol - zero;
dot = addr2;
vmoving = 0;
if (!value(VISUALMESSAGE) && TMODE & 077) {
chmod(TTYNAM, TMODE &~ 077);
diddle++;
}
ostart();
do {
ic = vinit();
if (vcnt == 0)
error("Can't fit any complete lines on screen");
} while (vmain(ic) == 1);
splitw++;
vigoto(LINES - 1, value(PROMPT));
vclreol();
splitw = 0;
ostop();
setoutt();
inopen = 0;
netchHAD(lines);
undiddle();
}
vinit()
{
register int *tp;
register int voy, vny;
char *ic;
int nvc;
vcook();
holdat = 1;
vclear();
getDOT();
switch (vch) {
case '^':
dot = vback((VLINES - ZERO) - vdepth());
getDOT();
case '-':
tp = vback((VLINES - ZERO) - vdepth());
break;
case '.':
tp = vback((VLINES - ZERO) / 2 - vdepth());
break;
default:
tp = dot;
}
vcline = 0;
vcnt = 0;
vny = ZERO;
for (; tp <= dol; tp++) {
voy = vny;
getline(*tp);
if (tp == dot) {
nvc = vcline;
ic = vskipwh(linebuf);
}
vny = voy + vdepth();
if (vny > VLINES)
break;
vopen(tp, voy);
vcline++;
}
vcline = nvc;
flusho();
holdat = 0;
vsync(vlast);
vraw();
return (ic);
}
vcook()
{
gTTY(1);
tty[2] =& ~RAW;
sTTY(1);
}
vraw()
{
gTTY(1);
tty[2] =| RAW;
sTTY(1);
}
vok(atube)
register char *atube;
{
register int i;
if (COLUMNS == 1000)
error("Don't know enough about your terminal to use %s", Command);
if (COLUMNS > TUBECOLS)
error("Terminal too wide");
if (LINES > TUBELINES || COLUMNS * LINES > TUBESIZE)
error("Screen too large for my buffer");
vtube0 = atube;
for (i = 0; i < TUBELINES; i++) {
vtube[i] = atube;
atube =+ COLUMNS;
}
vutmp = atube;
vundkind = VNONE;
ZERO = 0;
inopen = 1;
vmoving = 0;
splitw = 0;
nextic = 0;
if (vSCROLL == 0)
vSCROLL = value(SCROLL);
}
#endif
undiddle()
{
if (diddle)
chmod(TTYNAM, TMODE);
diddle = 0;
}