Annotation of 43BSD/contrib/jove/move.c, revision 1.1

1.1     ! root        1: /*************************************************************************
        !             2:  * This program is copyright (C) 1985, 1986 by Jonathan Payne.  It is    *
        !             3:  * provided to you without charge for use only on a licensed Unix        *
        !             4:  * system.  You may copy JOVE provided that this notice is included with *
        !             5:  * the copy.  You may not sell copies of this program or versions        *
        !             6:  * modified for use on microcomputer systems, unless the copies are      *
        !             7:  * included with a Unix system distribution and the source is provided.  *
        !             8:  *************************************************************************/
        !             9: 
        !            10: #include "jove.h"
        !            11: #include "ctype.h"
        !            12: 
        !            13: static int     line_pos;
        !            14: 
        !            15: ForChar()
        !            16: {
        !            17:        register int    num = exp;
        !            18: 
        !            19:        if (exp < 0) {
        !            20:                exp = -exp;
        !            21:                BackChar();
        !            22:                return;
        !            23:        }
        !            24:        exp = 1;
        !            25:        while (--num >= 0) {
        !            26:                if (eolp()) {                   /* Go to the next Line */
        !            27:                        if (curline->l_next == 0)
        !            28:                                break;
        !            29:                        SetLine(curline->l_next);
        !            30:                } else
        !            31:                        curchar++;
        !            32:        }
        !            33: }
        !            34: 
        !            35: BackChar()
        !            36: {
        !            37:        register int    num = exp;
        !            38: 
        !            39:        if (exp < 0) {
        !            40:                exp = -exp;
        !            41:                ForChar();
        !            42:                return;
        !            43:        }
        !            44:        exp = 1;
        !            45:        while (--num >= 0) {
        !            46:                if (bolp()) {
        !            47:                        if (curline->l_prev == 0)
        !            48:                                break;
        !            49:                        SetLine(curline->l_prev);
        !            50:                        Eol();
        !            51:                } else
        !            52:                        --curchar;
        !            53:        }
        !            54: }
        !            55: 
        !            56: NextLine()
        !            57: {
        !            58:        if ((curline == curbuf->b_last) && eolp())
        !            59:                complain(NullStr);
        !            60:        line_move(FORWARD, YES);
        !            61: }
        !            62: 
        !            63: PrevLine()
        !            64: {
        !            65:        if ((curline == curbuf->b_first) && bolp())
        !            66:                complain(NullStr);
        !            67:        line_move(BACKWARD, YES);
        !            68: }
        !            69: 
        !            70: /* moves to a different line in DIR; LINE_CMD says whether this is
        !            71:    being called from NextLine() or PrevLine(), in which case it tries
        !            72:    to line up the column with the column of the current line */
        !            73: 
        !            74: line_move(dir, line_cmd)
        !            75: {
        !            76:        Line    *(*proc)() = (dir == FORWARD) ? next_line : prev_line;
        !            77:        Line    *line;
        !            78: 
        !            79:        line = (*proc)(curline, exp);
        !            80:        if (line == curline) {
        !            81:                (dir == FORWARD) ? Eol() : Bol();
        !            82:                return;
        !            83:        }
        !            84: 
        !            85:        if (line_cmd) {
        !            86:                this_cmd = LINECMD;
        !            87:                if (last_cmd != LINECMD)
        !            88:                        line_pos = calc_pos(linebuf, curchar);
        !            89:        }
        !            90:        SetLine(line);          /* curline is in linebuf now */
        !            91:        if (line_cmd)
        !            92:                curchar = how_far(curline, line_pos);
        !            93: }
        !            94: 
        !            95: /* returns what cur_char should be for that position col */
        !            96: 
        !            97: how_far(line, col)
        !            98: Line   *line;
        !            99: {
        !           100:        register char   *lp;
        !           101:        register int    pos,
        !           102:                        c;
        !           103:        char    *base;
        !           104: 
        !           105:        base = lp = lcontents(line);
        !           106:        pos = 0;
        !           107: 
        !           108:        while (pos < col && (c = (*lp & 0177))) {
        !           109:                if (c == '\t')
        !           110:                        pos += (tabstop - (pos % tabstop));
        !           111:                else if (isctrl(c))
        !           112:                        pos += 2;
        !           113:                else
        !           114:                        pos++;
        !           115:                lp++;
        !           116:        }
        !           117: 
        !           118:        return lp - base;
        !           119: }
        !           120: 
        !           121: Bol()
        !           122: {
        !           123:        curchar = 0;
        !           124: }
        !           125: 
        !           126: Eol()
        !           127: {
        !           128:        curchar = strlen(linebuf);
        !           129: }
        !           130: 
        !           131: Eof()
        !           132: {
        !           133:        PushPntp(curbuf->b_last);
        !           134:        ToLast();
        !           135: }
        !           136: 
        !           137: Bof()
        !           138: {
        !           139:        PushPntp(curbuf->b_first);
        !           140:        ToFirst();
        !           141: }
        !           142: 
        !           143: /* Move forward (if dir > 0) or backward (if dir < 0) a sentence.  Deals
        !           144:    with all the kludgery involved with paragraphs, and moving backwards
        !           145:    is particularly yucky. */
        !           146: 
        !           147: to_sent(dir)
        !           148: {
        !           149:        Bufpos  *new,
        !           150:                old;
        !           151:        extern char     *ParaStr;
        !           152: 
        !           153:        DOTsave(&old);
        !           154: 
        !           155:        new = dosearch("^[ \t]*$\\|[?.!]", dir, 1);
        !           156:        if (new == 0) {
        !           157:                (dir < 0) ? ToFirst() : ToLast();
        !           158:                return;
        !           159:        }
        !           160:        SetDot(new);
        !           161:        if (dir < 0) {
        !           162:                to_word(1);
        !           163:                if ((old.p_line == curline && old.p_char <= curchar) ||
        !           164:                    (inorder(new->p_line, new->p_char, old.p_line, old.p_char) &&
        !           165:                     inorder(old.p_line, old.p_char, curline, curchar))) {
        !           166:                        SetDot(new);
        !           167:                        to_sent(dir);
        !           168:                }
        !           169:                return;         /* We're there? */
        !           170:        }
        !           171:        if (blnkp(linebuf)) {
        !           172:                Bol();
        !           173:                BackChar();
        !           174:                if (old.p_line == curline && old.p_char >= curchar) {
        !           175:                        to_word(1);     /* Oh brother this is painful */
        !           176:                        to_sent(1);
        !           177:                }
        !           178:        } else {
        !           179:                extern int      REbom;
        !           180: 
        !           181:                curchar = REbom + 1;    /* Just after the [?.!] */
        !           182:                if (LookingAt("[\")]  *\\|[\")]$", linebuf, curchar))
        !           183:                        curchar++;
        !           184:                else if (!eolp() && !LookingAt("  *", linebuf, curchar))
        !           185:                        to_sent(dir);
        !           186:        }
        !           187: }
        !           188: 
        !           189: Bos()
        !           190: {
        !           191:        int     num = exp;
        !           192: 
        !           193:        if (exp < 0) {
        !           194:                exp = -exp;
        !           195:                Eos();
        !           196:                return;
        !           197:        }
        !           198: 
        !           199:        exp = 1;
        !           200: 
        !           201:        while (--num >= 0) {
        !           202:                to_sent(-1);
        !           203:                if (bobp())
        !           204:                        break;
        !           205:        }
        !           206: }
        !           207: 
        !           208: Eos()
        !           209: {
        !           210:        int     num = exp;
        !           211: 
        !           212:        if (exp < 0) {
        !           213:                exp = -exp;
        !           214:                Bos();
        !           215:                return;
        !           216:        }
        !           217: 
        !           218:        exp = 1;
        !           219: 
        !           220:        while (--num >= 0) {
        !           221:                to_sent(1);
        !           222:                if (eobp())
        !           223:                        break;
        !           224:        }
        !           225: }
        !           226: 
        !           227: ForWord()
        !           228: {
        !           229:        register char   c;
        !           230:        register int    num = exp;
        !           231: 
        !           232:        if (exp < 0) {
        !           233:                exp = -exp;
        !           234:                BackWord();
        !           235:                return;
        !           236:        }
        !           237:        exp = 1;
        !           238:        while (--num >= 0) {
        !           239:                to_word(1);
        !           240:                while ((c = linebuf[curchar]) != 0 && isword(c))
        !           241:                        curchar++;
        !           242:                if (eobp())
        !           243:                        break;
        !           244:        }
        !           245:        this_cmd = 0;   /* Semi kludge to stop some unfavorable behavior */
        !           246: }
        !           247: 
        !           248: BackWord()
        !           249: {
        !           250:        register int    num = exp;
        !           251:        register char   c;
        !           252: 
        !           253:        if (exp < 0) {
        !           254:                exp = -exp;
        !           255:                ForWord();
        !           256:                return;
        !           257:        }
        !           258:        exp = 1;
        !           259:        while (--num >= 0) {
        !           260:                to_word(-1);
        !           261:                while (!bolp() && (c = linebuf[curchar - 1], isword(c)))
        !           262:                        --curchar;
        !           263:                if (bobp())
        !           264:                        break;
        !           265:        }
        !           266:        this_cmd = 0;
        !           267: }

unix.superglobalmegacorp.com

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