#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)); }  .