home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.update.uu.se
/
ftp.update.uu.se.2014.03.zip
/
ftp.update.uu.se
/
pub
/
rainbow
/
cpm
/
emacs
/
emacssrc.lzh
/
ovmisc1.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-03-11
|
3KB
|
123 lines
#include "stdio.h"
#include "ed.h"
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;
dotp = curwp->w_dotp;
doto = curwp->w_doto;
if (doto==llength(dotp) && --doto<0)
return (FALSE);
cr = lgetc(dotp, doto);
if (--doto < 0)
return (FALSE);
cl = lgetc(dotp, doto);
lputc(dotp, doto+0, cr);
lputc(dotp, doto+1, cl);
lchange(WFEDIT);
return (TRUE);
}
/*
* 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;
lp1 = curwp->w_dotp;
while (llength(lp1)==0 && (lp2=lback(lp1))!=curbp->b_linep)
lp1 = lp2;
lp2 = lp1;
nld = 0;
while ((lp2=lforw(lp2))!=curbp->b_linep && llength(lp2)==0)
++nld;
if (nld == 0)
return (TRUE);
curwp->w_dotp = lforw(lp1);
curwp->w_doto = 0;
return (ldelete(nld));
}