BSD 2 development
[unix-history] / src / ex / ex_put.c.new
fgoto()
{
register int l, c;
if (destcol > COLUMNS - 1) {
destline += destcol / COLUMNS;
destcol %= COLUMNS;
}
if (outcol > COLUMNS - 1) {
l = (outcol + 1) / COLUMNS;
outline += l;
outcol %= COLUMNS;
if (AM == 0) {
while (l > 0) {
if (pfast)
putch('\r');
putch('\n');
l--;
}
outcol = 0;
}
if (outline > LINES - 1) {
destline -= outline - (LINES - 1);
outline = LINES - 1;
}
}
if (destline > LINES - 1) {
l = destline;
destline = LINES - 1;
if (outline < LINES - 1) {
c = destcol;
if (pfast == 0 && (!CA || holdcm))
destcol = 0;
fgoto();
destcol = c;
}
while (l > LINES - 1) {
putch('\n');
l--;
if (pfast == 0)
outcol = 0;
}
}
if (destline < outline && !(CA && !holdcm || UP != NOSTR))
destline = outline;
if (CA && !holdcm) {
char *cgp;
cgp = tgoto(CM, destcol, destline);
if (plod(strlen(cgp)) > 0)
plod(0);
else
tputs(cgp, 0, putch);
} else
plod(0);
outline = destline;
outcol = destcol;
}
/*
* Tab to column col by flushing and then setting destcol.
* Used by "set all".
*/
tab(col)
int col;
{
flush1();
destcol = col;
}
/*
* Move (slowly) to destination.
* Hard thing here is using home cursor on really deficient terminals.
* Otherwise just use cursor motions, hacking use of tabs and overtabbing
* and backspace.
*/
static int plodcnt, plodflg;
plodput(c)
{
if (plodflg)
plodcnt--;
else
putch(c);
}
plod(cnt)
{
register int i, j, k;
int soutcol, soutline, sdestcol, sdestline;
plodcnt = plodflg = cnt;
soutcol = outcol;
soutline = outline;
sdestcol = destcol;
sdestline = destline;
if (HO) {
if (GT)
i = (destcol >> 3) + (destcol & 07);
else
i = destcol;
if (destcol >= outcol)
if (GT && (j = ((destcol - (outcol &~ 07)) >> 3)))
j += destcol & 07;
else
j = destcol - outcol;
else
if (outcol - destcol <= i && (BS || BC))
i = j = outcol - destcol;
else
j = i + 1;
k = outline - destline;
if (k < 0)
k = -k;
j += k;
if (i + destline < j) {
tputs(HO, 0, plodput);
outcol = outline = 0;
} else if (LL) {
k = (LINES - 1) - destline;
if (i + k + 2 < j) {
tputs(LL, 0, plodput);
outcol = 0;
outline = LINES - 1;
}
}
}
if (GT)
i = (destcol >> 3) + (destcol & 07);
else
i = destcol;
if (BT && outcol > destcol) {
j = (((outcol+7) & ~7) - destcol - 1) >> 3;
j *= (k = strlen(BT));
if ((k = (destcol&7)+k) > 4)
j += 8 - (destcol&7);
else
j += k;
}
else
j = outcol - destcol;
if ((!NONL || outline >= destline) && (!NC || outline < destline) &&
(j > i + 1 || outcol > destcol && !BS && !BC)) {
plodput('\r');
if (NC) {
plodput('\n');
outline++;
}
outcol = 0;
}
while (outline < destline) {
outline++;
plodput('\n');
if (plodflg && plodcnt < 0)
goto out;
if (NONL || pfast == 0)
outcol = 0;
}
if (BT)
k = strlen(BT);
while (outcol > destcol) {
if (plodflg && plodcnt < 0)
goto out;
if (BT && outcol - destcol > 4+k) {
tputs(BT, 0, plodput);
outcol--;
outcol &= ~7;
continue;
}
outcol--;
if (BC)
tputs(BC, 0, plodput);
else
plodput('\b');
}
while (outline > destline) {
outline--;
tputs(UP, 0, plodput);
if (plodflg && plodcnt < 0)
goto out;
}
if (GT && destcol - outcol > 1) {
while ((i = ((outcol + 8) &~ 7)) <= destcol) {
if (TA)
tputs(TA, 0, plodput);
else
plodput('\t');
outcol = i;
}
if (destcol - outcol > 4 && (BC || BS)) {
if (TA)
tputs(TA, 0, plodput);
else
plodput('\t');
outcol = i;
while (outcol > destcol) {
outcol--;
if (BC)
tputs(BC, 0, plodput);
else
plodput('\b');
}
}
}
while (outcol < destcol) {
if (inopen && ND)
tputs(ND, 0, plodput);
else
plodput(' ');
outcol++;
if (plodflg && plodcnt < 0)
goto out;
}
out:
if (plodflg) {
outcol = soutcol;
outline = soutline;
destcol = sdestcol;
destline = sdestline;
}
return(plodcnt);
}