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 / getreg.c < prev    next >
Text File  |  1992-03-11  |  2KB  |  64 lines

  1. /* getreg.c is included by overlaid region commands.
  2.  * This routine figures out the
  3.  * bounds of the region in the current window, and
  4.  * fills in the fields of the "REGION" structure pointed
  5.  * to by "rp". Because the dot and mark are usually very
  6.  * close together, we scan outward from dot looking for
  7.  * mark. This should save time. Return a standard code.
  8.  * Callers of this routine should be prepared to get
  9.  * an "ABORT" status; we might make this have the
  10.  * conform thing later.
  11.  */
  12. getregion(rp)
  13. register REGION    *rp;
  14. {
  15.     register LINE    *flp;
  16.     register LINE    *blp;
  17.     register int    fsize;
  18.     register int    bsize;
  19.  
  20.     if (curwp->w_markp == NULL) {
  21.         mlwrite("No mark set in this window");
  22.         return (FALSE);
  23.     }
  24.     if (curwp->w_dotp == curwp->w_markp) {
  25.         rp->r_linep = curwp->w_dotp;
  26.         if (curwp->w_doto < curwp->w_marko) {
  27.             rp->r_offset = curwp->w_doto;
  28.             rp->r_size = curwp->w_marko-curwp->w_doto;
  29.         } else {
  30.             rp->r_offset = curwp->w_marko;
  31.             rp->r_size = curwp->w_doto-curwp->w_marko;
  32.         }
  33.         return (TRUE);
  34.     }
  35.     blp = curwp->w_dotp;
  36.     bsize = curwp->w_doto;
  37.     flp = curwp->w_dotp;
  38.     fsize = llength(flp)-curwp->w_doto+1;
  39.     while (flp!=curbp->b_linep || lback(blp)!=curbp->b_linep) {
  40.         if (flp != curbp->b_linep) {
  41.             flp = lforw(flp);
  42.             if (flp == curwp->w_markp) {
  43.                 rp->r_linep = curwp->w_dotp;
  44.                 rp->r_offset = curwp->w_doto;
  45.                 rp->r_size = fsize+curwp->w_marko;
  46.                 return (TRUE);
  47.             }
  48.             fsize += llength(flp)+1;
  49.         }
  50.         if (lback(blp) != curbp->b_linep) {
  51.             blp = lback(blp);
  52.             bsize += llength(blp)+1;
  53.             if (blp == curwp->w_markp) {
  54.                 rp->r_linep = blp;
  55.                 rp->r_offset = curwp->w_marko;
  56.                 rp->r_size = bsize - curwp->w_marko;
  57.                 return (TRUE);
  58.             }
  59.         }
  60.     }
  61.     mlwrite("Bug: lost mark");
  62.     return (FALSE);
  63. }
  64.