home *** CD-ROM | disk | FTP | other *** search
- /* getreg.c is included by overlaid region commands.
- * This routine figures out the
- * bounds of the region in the current window, and
- * fills in the fields of the "REGION" structure pointed
- * to by "rp". Because the dot and mark are usually very
- * close together, we scan outward from dot looking for
- * mark. This should save time. Return a standard code.
- * Callers of this routine should be prepared to get
- * an "ABORT" status; we might make this have the
- * conform thing later.
- */
- getregion(rp)
- register REGION *rp;
- {
- register LINE *flp;
- register LINE *blp;
- register int fsize;
- register int bsize;
-
- if (curwp->w_markp == NULL) {
- mlwrite("No mark set in this window");
- return (FALSE);
- }
- if (curwp->w_dotp == curwp->w_markp) {
- rp->r_linep = curwp->w_dotp;
- if (curwp->w_doto < curwp->w_marko) {
- rp->r_offset = curwp->w_doto;
- rp->r_size = curwp->w_marko-curwp->w_doto;
- } else {
- rp->r_offset = curwp->w_marko;
- rp->r_size = curwp->w_doto-curwp->w_marko;
- }
- return (TRUE);
- }
- blp = curwp->w_dotp;
- bsize = curwp->w_doto;
- flp = curwp->w_dotp;
- fsize = llength(flp)-curwp->w_doto+1;
- while (flp!=curbp->b_linep || lback(blp)!=curbp->b_linep) {
- if (flp != curbp->b_linep) {
- flp = lforw(flp);
- if (flp == curwp->w_markp) {
- rp->r_linep = curwp->w_dotp;
- rp->r_offset = curwp->w_doto;
- rp->r_size = fsize+curwp->w_marko;
- return (TRUE);
- }
- fsize += llength(flp)+1;
- }
- if (lback(blp) != curbp->b_linep) {
- blp = lback(blp);
- bsize += llength(blp)+1;
- if (blp == curwp->w_markp) {
- rp->r_linep = blp;
- rp->r_offset = curwp->w_marko;
- rp->r_size = bsize - curwp->w_marko;
- return (TRUE);
- }
- }
- }
- mlwrite("Bug: lost mark");
- return (FALSE);
- }