ovmain( x, f, n )
{ switch (x)
{ case 0:
return (showcpos( f, n ));
case 1:
return ( twiddle( f, n ));
case 2:
return ( deblank( f, n ));
}
}
/*
* Display the current position of the cursor,
* in origin 1 X-Y coordinates, the character that is
* under the cursor (in octal), and the fraction of the
* text that is before the cursor. The displayed column
* is not the current column, but the column that would
* be used on an infinite width display. Normally this
* is bound to "C-X =".
*/
showcpos(f, n)
{
register LINE *clp;
register int nch;
register int cbo;
register int nbc;
register int cac;
register int ratio;
register int col;
register int i;
register int c;
int curln, lines;
extern int currow;
clp = lforw(curbp->b_linep); /* Grovel the data. */
cbo = nch = lines = 0;
for (;;)
{ lines++;
if ( clp == curwp->w_dotp )
{ nbc = nch + ( cbo = curwp->w_doto );
curln = lines;
if (cbo == llength(clp))
cac = '\n';
else
cac = lgetc(clp, cbo);
}
nch += llength( clp ) + 1; /* 1 allows for newline. */
if (clp == curbp->b_linep) break;
clp = lforw(clp);
}
col = currow + 1; /* Get real column. */
ratio = 0; /* Ratio before dot. */
if (nch != 0)
ratio = nbc / ( nch / 100 );
mlwrite("X=%d Y=%d CH=0x%d .=%d (%d%% of %d) line %d of %d",
col+1, currow+1, cac, nbc, ratio, nch, curln, lines);
return (TRUE);
}
/*
* Twiddle the two characters on either side of
* dot. If dot is at the end of the line twiddle the
* two characters before it. Return with an error if dot
* is at the beginning of line; it seems to be a bit
* pointless to make this work. This fixes up a very
* common typo with a single stroke. Normally bound
* to "C-T". This always works within a line, so
* "WFEDIT" is good enough.
*/
twiddle(f, n)
{
register LINE *dotp;
register int doto;
register int cl;
register int cr;
/*
* Delete blank lines around dot.
* What this command does depends if dot is
* sitting on a blank line. If dot is sitting on a
* blank line, this command deletes all the blank lines
* above and below the current line. If it is sitting
* on a non blank line then it deletes all of the
* blank lines after the line. Normally this command
* is bound to "C-X C-O". Any argument is ignored.
*/
deblank(f, n)
{
register LINE *lp1;
register LINE *lp2;
register int nld;