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 >
C/C++ Source or Header  |  1992-03-11  |  3KB  |  123 lines

  1. #include    "stdio.h"
  2. #include    "ed.h"
  3.  
  4. ovmain( x, f, n )
  5. {    switch (x)
  6.     {    case 0:
  7.             return (showcpos( f, n ));
  8.         case 1:
  9.             return ( twiddle( f, n ));
  10.         case 2:
  11.             return ( deblank( f, n ));
  12.     }
  13. }
  14.  
  15. /*
  16.  * Display the current position of the cursor,
  17.  * in origin 1 X-Y coordinates, the character that is
  18.  * under the cursor (in octal), and the fraction of the
  19.  * text that is before the cursor. The displayed column
  20.  * is not the current column, but the column that would
  21.  * be used on an infinite width display. Normally this
  22.  * is bound to "C-X =".
  23.  */
  24. showcpos(f, n)
  25. {
  26.     register LINE    *clp;
  27.     register int    nch;
  28.     register int    cbo;
  29.     register int    nbc;
  30.     register int    cac;
  31.     register int    ratio;
  32.     register int    col;
  33.     register int    i;
  34.     register int    c;
  35.     int curln, lines;
  36.     extern int currow;
  37.  
  38.     clp = lforw(curbp->b_linep);        /* Grovel the data.    */
  39.     cbo = nch = lines = 0;
  40.     for (;;)
  41.     {    lines++;
  42.         if ( clp == curwp->w_dotp )
  43.         {    nbc = nch + ( cbo = curwp->w_doto );
  44.             curln = lines;
  45.             if (cbo == llength(clp))
  46.                 cac = '\n';
  47.             else
  48.                 cac = lgetc(clp, cbo);
  49.         }
  50.         nch += llength( clp ) + 1;    /* 1 allows for newline. */
  51.         if (clp == curbp->b_linep) break;
  52.         clp = lforw(clp);
  53.     }
  54.     col = currow + 1;            /* Get real column.    */
  55.     ratio = 0;                /* Ratio before dot.    */
  56.     if (nch != 0)
  57.         ratio = nbc / ( nch / 100 );
  58.     mlwrite("X=%d Y=%d CH=0x%d .=%d (%d%% of %d) line %d of %d",
  59.         col+1, currow+1, cac, nbc, ratio, nch, curln, lines);
  60.     return (TRUE);
  61. }
  62.  
  63. /*
  64.  * Twiddle the two characters on either side of
  65.  * dot. If dot is at the end of the line twiddle the
  66.  * two characters before it. Return with an error if dot
  67.  * is at the beginning of line; it seems to be a bit
  68.  * pointless to make this work. This fixes up a very
  69.  * common typo with a single stroke. Normally bound
  70.  * to "C-T". This always works within a line, so
  71.  * "WFEDIT" is good enough.
  72.  */
  73. twiddle(f, n)
  74. {
  75.     register LINE    *dotp;
  76.     register int    doto;
  77.     register int    cl;
  78.     register int    cr;
  79.  
  80.     dotp = curwp->w_dotp;
  81.     doto = curwp->w_doto;
  82.     if (doto==llength(dotp) && --doto<0)
  83.         return (FALSE);
  84.     cr = lgetc(dotp, doto);
  85.     if (--doto < 0)
  86.         return (FALSE);
  87.     cl = lgetc(dotp, doto);
  88.     lputc(dotp, doto+0, cr);
  89.     lputc(dotp, doto+1, cl);
  90.     lchange(WFEDIT);
  91.     return (TRUE);
  92. }
  93.  
  94. /*
  95.  * Delete blank lines around dot.
  96.  * What this command does depends if dot is
  97.  * sitting on a blank line. If dot is sitting on a
  98.  * blank line, this command deletes all the blank lines
  99.  * above and below the current line. If it is sitting
  100.  * on a non blank line then it deletes all of the
  101.  * blank lines after the line. Normally this command
  102.  * is bound to "C-X C-O". Any argument is ignored.
  103.  */
  104. deblank(f, n)
  105. {
  106.     register LINE    *lp1;
  107.     register LINE    *lp2;
  108.     register int    nld;
  109.  
  110.     lp1 = curwp->w_dotp;
  111.     while (llength(lp1)==0 && (lp2=lback(lp1))!=curbp->b_linep)
  112.         lp1 = lp2;
  113.     lp2 = lp1;
  114.     nld = 0;
  115.     while ((lp2=lforw(lp2))!=curbp->b_linep && llength(lp2)==0)
  116.         ++nld;
  117.     if (nld == 0)
  118.         return (TRUE);
  119.     curwp->w_dotp = lforw(lp1);
  120.     curwp->w_doto = 0;
  121.     return (ldelete(nld));
  122. }
  123.