Annotation of coherent/g/usr/bin/vi/move4.c, revision 1.1.1.1

1.1       root        1: /* move4.c */
                      2: 
                      3: /* Author:
                      4:  *     Steve Kirkendall
                      5:  *     14407 SW Teal Blvd. #C
                      6:  *     Beaverton, OR 97005
                      7:  *     [email protected]
                      8:  */
                      9: 
                     10: 
                     11: /* This file contains movement functions which are screen-relative */
                     12: 
                     13: #include "config.h"
                     14: #include "vi.h"
                     15: 
                     16: /* This moves the cursor to a particular row on the screen */
                     17: /*ARGSUSED*/
                     18: MARK m_row(m, cnt, key)
                     19:        MARK    m;      /* the cursor position */
                     20:        long    cnt;    /* the row we'll move to */
                     21:        int     key;    /* the keystroke of this move - H/L/M */
                     22: {
                     23:        DEFAULT(1);
                     24: 
                     25:        /* calculate destination line based on key */
                     26:        cnt--;
                     27:        switch (key)
                     28:        {
                     29:          case 'H':
                     30:                cnt = topline + cnt;
                     31:                break;
                     32: 
                     33:          case 'M':
                     34:                cnt = topline + (LINES - 1) / 2;
                     35:                break;
                     36: 
                     37:          case 'L':
                     38:                cnt = botline - cnt;
                     39:                break;
                     40:        }
                     41: 
                     42:        /* return the mark of the destination line */
                     43:        return MARK_AT_LINE(cnt);
                     44: }
                     45: 
                     46: 
                     47: /* This function repositions the current line to show on a given row */
                     48: MARK m_z(m, cnt, key)
                     49:        MARK    m;      /* the cursor */
                     50:        long    cnt;    /* the line number we're repositioning */
                     51:        int     key;    /* key struck after the z */
                     52: {
                     53:        long    newtop;
                     54:        int     i;
                     55: 
                     56:        /* Which line are we talking about? */
                     57:        if (cnt < 0 || cnt > nlines)
                     58:        {
                     59:                return MARK_UNSET;
                     60:        }
                     61:        if (cnt)
                     62:        {
                     63:                m = MARK_AT_LINE(cnt);
                     64:                newtop = cnt;
                     65:        }
                     66:        else
                     67:        {
                     68:                newtop = markline(m);
                     69:        }
                     70: 
                     71:        /* allow a "window size" number to be entered */
                     72:        for (i = 0; key >= '0' && key <= '9'; key = getkey(0))
                     73:        {
                     74:                i = i * 10 + key - '0';
                     75:        }
                     76: #ifndef CRUNCH
                     77:        if (i > 0 && i <= LINES - 1)
                     78:        {
                     79:                *o_window = i;
                     80:                wset = TRUE;
                     81:        }
                     82: #else
                     83:        /* the number is ignored if -DCRUNCH */
                     84: #endif
                     85: 
                     86:        /* figure out which line will have to be at the top of the screen */
                     87:        switch (key)
                     88:        {
                     89:          case '\n':
                     90: #if OSK
                     91:          case '\l':
                     92: #else
                     93:          case '\r':
                     94: #endif
                     95:          case '+':
                     96:                break;
                     97: 
                     98:          case '.':
                     99:          case 'z':
                    100:                newtop -= LINES / 2;
                    101:                break;
                    102: 
                    103:          case '-':
                    104:                newtop -= LINES - 1;
                    105:                break;
                    106: 
                    107:          default:
                    108:                return MARK_UNSET;
                    109:        }
                    110: 
                    111:        /* make the new topline take effect */
                    112:        redraw(MARK_UNSET, FALSE);
                    113:        if (newtop >= 1)
                    114:        {
                    115:                topline = newtop;
                    116:        }
                    117:        else
                    118:        {
                    119:                topline = 1L;
                    120:        }
                    121:        redrawrange(0L, INFINITY, INFINITY);
                    122: 
                    123:        /* The cursor doesn't move */
                    124:        return m;
                    125: }
                    126: 
                    127: 
                    128: /* This function scrolls the screen.  It does this by calling redraw() with
                    129:  * an off-screen line as the argument.  It will move the cursor if necessary
                    130:  * so that the cursor is on the new screen.
                    131:  */
                    132: /*ARGSUSED*/
                    133: MARK m_scroll(m, cnt, key)
                    134:        MARK    m;      /* the cursor position */
                    135:        long    cnt;    /* for some keys: the number of lines to scroll */
                    136:        int     key;    /* keystroke that causes this movement */
                    137: {
                    138:        MARK    tmp;    /* a temporary mark, used as arg to redraw() */
                    139: 
                    140:        /* adjust cnt, and maybe *o_scroll, depending of key */
                    141:        switch (key)
                    142:        {
                    143:          case ctrl('F'):
                    144:          case ctrl('B'):
                    145:                DEFAULT(1);
                    146:                redrawrange(0L, INFINITY, INFINITY); /* force complete redraw */
                    147:                cnt = cnt * (LINES - 1) - 2; /* keeps two old lines on screen */
                    148:                break;
                    149: 
                    150:          case ctrl('E'):
                    151:          case ctrl('Y'):
                    152:                DEFAULT(1);
                    153:                break;
                    154: 
                    155:          case ctrl('U'):
                    156:          case ctrl('D'):
                    157:                if (cnt == 0) /* default */
                    158:                {
                    159:                        cnt = *o_scroll;
                    160:                }
                    161:                else
                    162:                {
                    163:                        if (cnt > LINES - 1)
                    164:                        {
                    165:                                cnt = LINES - 1;
                    166:                        }
                    167:                        *o_scroll = cnt;
                    168:                }
                    169:                break;
                    170:        }
                    171: 
                    172:        /* scroll up or down, depending on key */
                    173:        switch (key)
                    174:        {
                    175:          case ctrl('B'):
                    176:          case ctrl('Y'):
                    177:          case ctrl('U'):
                    178:                cnt = topline - cnt;
                    179:                if (cnt < 1L)
                    180:                {
                    181:                        cnt = 1L;
                    182:                        m = MARK_FIRST;
                    183:                }
                    184:                tmp = MARK_AT_LINE(cnt) + markidx(m);
                    185:                redraw(tmp, FALSE);
                    186:                if (markline(m) > botline)
                    187:                {
                    188:                        m = MARK_AT_LINE(botline);
                    189:                }
                    190:                break;
                    191: 
                    192:          case ctrl('F'):
                    193:          case ctrl('E'):
                    194:          case ctrl('D'):
                    195:                cnt = botline + cnt;
                    196:                if (cnt > nlines)
                    197:                {
                    198:                        cnt = nlines;
                    199:                        m = MARK_LAST;
                    200:                }
                    201:                tmp = MARK_AT_LINE(cnt) + markidx(m);
                    202:                redraw(tmp, FALSE);
                    203:                if (markline(m) < topline)
                    204:                {
                    205:                        m = MARK_AT_LINE(topline);
                    206:                }
                    207:                break;
                    208:        }
                    209: 
                    210:        return m;
                    211: }

unix.superglobalmegacorp.com

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