home *** CD-ROM | disk | FTP | other *** search
- #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));
- }