Annotation of coherent/d/usr/bin/elvis/move4.c, revision 1.1

1.1     ! root        1: /* move4.c */
        !             2: 
        !             3: /* Author:
        !             4:  *     Steve Kirkendall
        !             5:  *     16820 SW Tallac Way
        !             6:  *     Beaverton, OR 97006
        !             7:  *     [email protected], or ...uunet!tektronix!psueea!jove!kirkenda
        !             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: /*ARGSUSED*/
        !            49: MARK m_z(m, cnt, key)
        !            50:        MARK    m;      /* the cursor */
        !            51:        long    cnt;    /* the line number we're repositioning */
        !            52:        int     key;    /* key struck after the z */
        !            53: {
        !            54:        long    newtop;
        !            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, but ignore it */
        !            72:        while (key >= '0' && key <= '9')
        !            73:        {
        !            74:                key = getkey(0);
        !            75:        }
        !            76: 
        !            77:        /* figure out which line will have to be at the top of the screen */
        !            78:        switch (key)
        !            79:        {
        !            80:          case '\n':
        !            81: #if OSK
        !            82:          case '\l':
        !            83: #else
        !            84:          case '\r':
        !            85: #endif
        !            86:          case '+':
        !            87:                break;
        !            88: 
        !            89:          case '.':
        !            90:          case 'z':
        !            91:                newtop -= LINES / 2;
        !            92:                break;
        !            93: 
        !            94:          case '-':
        !            95:                newtop -= LINES - 1;
        !            96:                break;
        !            97: 
        !            98:          default:
        !            99:                return MARK_UNSET;
        !           100:        }
        !           101: 
        !           102:        /* make the new topline take effect */
        !           103:        if (newtop >= 1)
        !           104:        {
        !           105:                topline = newtop;
        !           106:        }
        !           107:        else
        !           108:        {
        !           109:                topline = 1L;
        !           110:        }
        !           111:        mustredraw = TRUE;
        !           112: 
        !           113:        /* The cursor doesn't move */
        !           114:        return m;
        !           115: }
        !           116: 
        !           117: 
        !           118: /* This function scrolls the screen.  It does this by calling redraw() with
        !           119:  * an off-screen line as the argument.  It will move the cursor if necessary
        !           120:  * so that the cursor is on the new screen.
        !           121:  */
        !           122: /*ARGSUSED*/
        !           123: MARK m_scroll(m, cnt, key)
        !           124:        MARK    m;      /* the cursor position */
        !           125:        long    cnt;    /* for some keys: the number of lines to scroll */
        !           126:        int     key;    /* keystroke that causes this movement */
        !           127: {
        !           128:        MARK    tmp;    /* a temporary mark, used as arg to redraw() */
        !           129: 
        !           130:        /* adjust cnt, and maybe *o_scroll, depending of key */
        !           131:        switch (key)
        !           132:        {
        !           133:          case ctrl('F'):
        !           134:          case ctrl('B'):
        !           135:                DEFAULT(1);
        !           136:                mustredraw = TRUE;
        !           137:                cnt = cnt * (LINES - 1) - 1; /* keeps one old line on screen */
        !           138:                break;
        !           139: 
        !           140:          case ctrl('E'):
        !           141:          case ctrl('Y'):
        !           142:                DEFAULT(1);
        !           143:                break;
        !           144: 
        !           145:          case ctrl('U'):
        !           146:          case ctrl('D'):
        !           147:                if (cnt == 0) /* default */
        !           148:                {
        !           149:                        cnt = *o_scroll;
        !           150:                }
        !           151:                else
        !           152:                {
        !           153:                        if (cnt > LINES - 1)
        !           154:                        {
        !           155:                                cnt = LINES - 1;
        !           156:                        }
        !           157:                        *o_scroll = cnt;
        !           158:                }
        !           159:                break;
        !           160:        }
        !           161: 
        !           162:        /* scroll up or down, depending on key */
        !           163:        switch (key)
        !           164:        {
        !           165:          case ctrl('B'):
        !           166:          case ctrl('Y'):
        !           167:          case ctrl('U'):
        !           168:                cnt = topline - cnt;
        !           169:                if (cnt < 1L)
        !           170:                {
        !           171:                        cnt = 1L;
        !           172:                        m = MARK_FIRST;
        !           173:                }
        !           174:                tmp = MARK_AT_LINE(cnt) + markidx(m);
        !           175:                redraw(tmp, FALSE);
        !           176:                if (markline(m) > botline)
        !           177:                {
        !           178:                        m = MARK_AT_LINE(botline);
        !           179:                }
        !           180:                break;
        !           181: 
        !           182:          case ctrl('F'):
        !           183:          case ctrl('E'):
        !           184:          case ctrl('D'):
        !           185:                cnt = botline + cnt;
        !           186:                if (cnt > nlines)
        !           187:                {
        !           188:                        cnt = nlines;
        !           189:                        m = MARK_LAST;
        !           190:                }
        !           191:                tmp = MARK_AT_LINE(cnt) + markidx(m);
        !           192:                redraw(tmp, FALSE);
        !           193:                if (markline(m) < topline)
        !           194:                {
        !           195:                        m = MARK_AT_LINE(topline);
        !           196:                }
        !           197:                break;
        !           198:        }
        !           199: 
        !           200:        /* arrange for ctrl-B and ctrl-F to redraw the smart line */
        !           201:        if (key == ctrl('B') || key == ctrl('F'))
        !           202:        {
        !           203:                changes++;
        !           204: 
        !           205:                /* also, erase the statusline.  This happens naturally for
        !           206:                 * the scrolling commands, but the paging commands need to
        !           207:                 * explicitly clear the statusline.
        !           208:                 */
        !           209:                msg("");
        !           210:        }
        !           211: 
        !           212:        return m;
        !           213: }

unix.superglobalmegacorp.com

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