Annotation of 43BSD/contrib/jove/marks.c, revision 1.1.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: int    MarksShouldFloat = 1;
                     11: 
                     12: #include "jove.h"
                     13: 
                     14: Mark *
                     15: MakeMark(line, column, type)
                     16: register Line  *line;
                     17: {
                     18:        register Mark   *newmark = (Mark *) emalloc(sizeof *newmark);
                     19: 
                     20:        MarkSet(newmark, line, column);
                     21:        newmark->m_next = curbuf->b_marks;
                     22:        newmark->m_floater = type;
                     23:        curbuf->b_marks = newmark;
                     24:        return newmark;
                     25: }
                     26: 
                     27: DelMark(m)
                     28: register Mark  *m;
                     29: {
                     30:        register Mark   *mp = curbuf->b_marks;
                     31: 
                     32:        if (m == mp)
                     33:                curbuf->b_marks = m->m_next;
                     34:        else {
                     35:                while (mp != 0 && mp->m_next != m)
                     36:                        mp = mp->m_next;
                     37:                if (mp == 0)
                     38:                        complain("Unknown mark!");
                     39:                mp->m_next = m->m_next;
                     40:        }
                     41:        free((char *) m);
                     42: }
                     43: 
                     44: AllMarkSet(b, line, col)
                     45: Buffer *b;
                     46: register Line  *line;
                     47: {
                     48:        register Mark   *mp;
                     49: 
                     50:        for (mp = b->b_marks; mp != 0; mp = mp->m_next)
                     51:                MarkSet(mp, line, col);
                     52: }
                     53: 
                     54: MarkSet(m, line, column)
                     55: Mark   *m;
                     56: Line   *line;
                     57: {
                     58:        m->m_line = line;
                     59:        m->m_char = column;
                     60: }
                     61: 
                     62: PopMark()
                     63: {
                     64:        int     pmark;
                     65: 
                     66:        if (curmark == 0)
                     67:                return;
                     68:        if (curbuf->b_markring[(curbuf->b_themark + 1) % NMARKS] == 0) {
                     69:                pmark = curbuf->b_themark;
                     70:                do {
                     71:                        if (--pmark < 0)
                     72:                                pmark = NMARKS - 1;
                     73:                } while (curbuf->b_markring[pmark] != 0);
                     74: 
                     75:                curbuf->b_markring[pmark] = MakeMark(curline, curchar, MarksShouldFloat);
                     76:                ToMark(curmark);
                     77:                DelMark(curmark);
                     78:                curmark = 0;
                     79:        } else
                     80:                PtToMark();
                     81: 
                     82:        pmark = curbuf->b_themark - 1;
                     83:        if (pmark < 0)
                     84:                pmark = NMARKS - 1;
                     85:        curbuf->b_themark = pmark;
                     86: }
                     87: 
                     88: SetMark()
                     89: {
                     90:        if (exp_p)
                     91:                PopMark();
                     92:        else
                     93:                DoSetMark(curline, curchar);
                     94: }
                     95: 
                     96: DoSetMark(l, c)
                     97: Line   *l;
                     98: {
                     99:        curbuf->b_themark = (curbuf->b_themark + 1) % NMARKS;
                    100:        if (curmark == 0)
                    101:                curmark = MakeMark(l, c, MarksShouldFloat);
                    102:        else
                    103:                MarkSet(curmark, l, c);
                    104:        s_mess("[Point pushed]");
                    105: }
                    106: 
                    107: /* Move point to Mark */
                    108: 
                    109: ToMark(m)
                    110: Mark   *m;
                    111: {
                    112:        int     len;
                    113: 
                    114:        if (m == 0)
                    115:                return;
                    116:        DotTo(m->m_line, m->m_char);
                    117:        if (curchar > (len = length(curline)))
                    118:                curchar = len;
                    119: }
                    120: 
                    121: Mark *
                    122: CurMark()
                    123: {
                    124:        if (curmark == 0)
                    125:                complain("No mark.");
                    126:        return curmark;
                    127: }
                    128: 
                    129: PtToMark()
                    130: {
                    131:        Line    *mline;
                    132:        int     mchar;
                    133:        Mark    *m = CurMark();
                    134: 
                    135:        mline = curline;
                    136:        mchar = curchar;
                    137: 
                    138:        ToMark(m);
                    139:        MarkSet(m, mline, mchar);
                    140: }
                    141: 
                    142: /* Fix marks for after a deletion.  For now, even marks that don't
                    143:    float will actually float, because we can't allow marks to point
                    144:    to non-existant lines. */
                    145: 
                    146: DFixMarks(line1, char1, line2, char2)
                    147: register Line  *line1,
                    148:                *line2;
                    149: {
                    150:        register Mark   *m;
                    151:        Line    *lp = line1;
                    152: 
                    153:        if (curbuf->b_marks == 0)
                    154:                return;
                    155:        while (lp != line2->l_next) {
                    156:                for (m = curbuf->b_marks; m != 0; m = m->m_next) {
                    157: /*                     if (!m->m_floater)
                    158:                                continue; */
                    159:                        if (m->m_line == lp)
                    160:                                m->m_char |= (1 << 15);
                    161:                }
                    162:                lp = lp->l_next;
                    163:        }
                    164:        for (m = curbuf->b_marks; m; m = m->m_next) {
                    165: /*             if (!m->m_floater)
                    166:                        continue; */
                    167:                if ((m->m_char & (1 << 15)) == 0)
                    168:                        continue;       /* Not effected */
                    169:                m->m_char &= ~(1 << 15);
                    170:                if (m->m_line == line1 && m->m_char < char1)
                    171:                        continue;       /* This mark is not affected */
                    172:                if (line1 == line2) {
                    173:                        if (m->m_char >= char1 && m->m_char <= char2)
                    174:                                m->m_char = char1;
                    175:                        else if (m->m_char > char2)
                    176:                                m->m_char -= (char2 - char1);
                    177:                        /* Same line move the mark backward */
                    178:                } else if (m->m_line == line2) {
                    179:                        if (m->m_char > char2)
                    180:                                m->m_char = char1 + (m->m_char - char2);
                    181:                        else
                    182:                                m->m_char = char1;
                    183:                        m->m_line = line1;
                    184:                } else {
                    185:                        m->m_char = char1;
                    186:                        m->m_line = line1;
                    187:                }
                    188:        }
                    189: }
                    190: 
                    191: /* Fix marks after an insertion.  Marks that don't float are ignored
                    192:    on insertion, which means PtToMark has to be careful ... */
                    193: 
                    194: IFixMarks(line1, char1, line2, char2)
                    195: register Line  *line1,
                    196:                *line2;
                    197: {
                    198:        register Mark   *m;
                    199: 
                    200:        for (m = curbuf->b_marks; m != 0; m = m->m_next) {
                    201:                if (!m->m_floater)
                    202:                        continue;
                    203:                if (m->m_line == line1) {
                    204:                        if (m->m_char > char1) {
                    205:                                m->m_line = line2;
                    206:                                if (line1 == line2)
                    207:                                        m->m_char += (char2 - char1);
                    208:                                else
                    209:                                        m->m_char = char2 + (m->m_char - char1);
                    210:                        }
                    211:                } 
                    212:        }
                    213: }

unix.superglobalmegacorp.com

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