Annotation of coherent/g/usr/bin/me/region.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * The routines in this file deal with the region, that magic space
                      3:  * between "." and mark.  Some functions are commands.
                      4:  * Some functions are just for internal use.
                      5:  */
                      6: #include       <stdio.h>
                      7: #include       "ed.h"
                      8: 
                      9: /*
                     10:  * Kill the region. Ask "getregion" to figure out the bounds of the region.
                     11:  * Move "." to the start, and kill the characters.
                     12:  * Bound to "C-W".
                     13:  */
                     14: killregion(f, n)
                     15: {
                     16:        register int    s;
                     17:        REGION          region;
                     18: 
                     19:        if ((s=getregion(&region)) != TRUE)
                     20:                return (s);
                     21:        if ((lastflag&CFKILL) == 0)             /* This is a kill type  */
                     22:                kdelete();                      /* command, so do magic */
                     23:        thisflag |= CFKILL;                     /* kill buffer stuff.   */
                     24:        curwp->w_dotp = region.r_linep;
                     25:        curwp->w_doto = region.r_offset;
                     26:        return (ldelete(region.r_size, TRUE));
                     27: }
                     28: 
                     29: /*
                     30:  * Copy all of the characters in the region to the kill buffer.
                     31:  * Don't move dot at all.  This is a bit like a kill region followed
                     32:  * by a yank but does not mark the buffer as changed.  Bound to "M-W".
                     33:  */
                     34: copyregion(f, n)
                     35: {
                     36:        register LINE   *linep;
                     37:        register int    loffs;
                     38:        register int    s;
                     39:        REGION          region;
                     40: 
                     41:        if ((s=getregion(&region)) != TRUE)
                     42:                return (s);
                     43:        if ((lastflag&CFKILL) == 0)             /* Kill type command.   */
                     44:                kdelete();
                     45:        thisflag |= CFKILL;
                     46:        linep = region.r_linep;                 /* Current line.        */
                     47:        loffs = region.r_offset;                /* Current offset.      */
                     48:        while (region.r_size--) {
                     49:                if (loffs == llength(linep)) {  /* End of line.         */
                     50:                        if ((s=kinsert('\n')) != TRUE)
                     51:                                return (s);
                     52:                        linep = lforw(linep);
                     53:                        loffs = 0;
                     54:                } else {                        /* Middle of line.      */
                     55:                        if ((s=kinsert(lgetc(linep, loffs))) != TRUE)
                     56:                                return (s);
                     57:                        ++loffs;
                     58:                }
                     59:        }
                     60:        return (TRUE);
                     61: }
                     62: 
                     63: /*
                     64:  * Lower case region.
                     65:  * Zap all of the upper case characters in the region to lower case.
                     66:  * Use the region code to set the limits.  Scan the buffer, doing the changes.
                     67:  * Call "lchange" to ensure that redisplay is done in all buffers.
                     68:  * Bound to "C-X C-L".
                     69:  */
                     70: lowerregion(f, n)
                     71: {
                     72:        register int    s;
                     73:        REGION          region;
                     74: 
                     75:        if ((s=getregion(&region)) != TRUE)
                     76:                return (s);
                     77:        curwp->w_dotp = region.r_linep;
                     78:        curwp->w_doto = region.r_offset;
                     79:        while (region.r_size--)
                     80:                lowChar();
                     81:        return (TRUE);
                     82: }
                     83: 
                     84: /*
                     85:  * Upper case region.
                     86:  * Zap all of the lower case characters in the region to upper case.
                     87:  * Use the region code to set the limits.  Scan the buffer, doing the changes.
                     88:  * Call "lchange" to ensure that redisplay is done in all buffers.
                     89:  * Bound to "C-X C-U".
                     90:  */
                     91: upperregion(f, n)
                     92: {
                     93:        register int    s;
                     94:        REGION          region;
                     95: 
                     96:        if ((s=getregion(&region)) != TRUE)
                     97:                return (s);
                     98:        curwp->w_dotp = region.r_linep;
                     99:        curwp->w_doto = region.r_offset;
                    100:        while (region.r_size--)
                    101:                capChar();
                    102:        return (TRUE);
                    103: }
                    104: 
                    105: /*
                    106:  * This routine figures out the bounds of the region in the current window,
                    107:  * and fills in the fields of the "REGION" structure pointed to by "rp".
                    108:  * Because the dot and mark are usually very close together, we scan outward
                    109:  * from dot looking for mark.  This should save time.  Return a standard code.
                    110:  * Callers of this routine should be prepared to get an "ABORT" status;
                    111:  * we might make this have the conform thing later.
                    112:  */
                    113: getregion(rp)
                    114: register REGION        *rp;
                    115: {
                    116:        register LINE   *flp;
                    117:        register LINE   *blp;
                    118:        register int    fsize;
                    119:        register int    bsize;
                    120: 
                    121:        if (curwp->w_markp == NULL) {
                    122:                mlwrite("No mark set in this window");
                    123:                return (FALSE);
                    124:        }
                    125:        if (curwp->w_dotp == curwp->w_markp) {
                    126:                rp->r_linep = curwp->w_dotp;
                    127:                if (curwp->w_doto < curwp->w_marko) {
                    128:                        rp->r_offset = curwp->w_doto;
                    129:                        rp->r_size = curwp->w_marko-curwp->w_doto;
                    130:                } else {
                    131:                        rp->r_offset = curwp->w_marko;
                    132:                        rp->r_size = curwp->w_doto-curwp->w_marko;
                    133:                }
                    134:                return (TRUE);
                    135:        }
                    136:        blp = curwp->w_dotp;
                    137:        bsize = curwp->w_doto;
                    138:        flp = curwp->w_dotp;
                    139:        fsize = llength(flp)-curwp->w_doto+1;
                    140:        while (flp!=curbp->b_linep || lback(blp)!=curbp->b_linep) {
                    141:                if (flp != curbp->b_linep) {
                    142:                        flp = lforw(flp);
                    143:                        if (flp == curwp->w_markp) {
                    144:                                rp->r_linep = curwp->w_dotp;
                    145:                                rp->r_offset = curwp->w_doto;
                    146:                                rp->r_size = fsize+curwp->w_marko;
                    147:                                return (TRUE);
                    148:                        }
                    149:                        fsize += llength(flp)+1;
                    150:                }
                    151:                if (lback(blp) != curbp->b_linep) {
                    152:                        blp = lback(blp);
                    153:                        bsize += llength(blp)+1;
                    154:                        if (blp == curwp->w_markp) {
                    155:                                rp->r_linep = blp;
                    156:                                rp->r_offset = curwp->w_marko;
                    157:                                rp->r_size = bsize - curwp->w_marko;
                    158:                                return (TRUE);
                    159:                        }
                    160:                }
                    161:        }
                    162:        mlwrite("Bug: lost mark");
                    163:        return (FALSE);
                    164: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.