Annotation of 43BSDReno/contrib/jove/marks.c, revision 1.1.1.1

1.1       root        1: /***************************************************************************
                      2:  * This program is Copyright (C) 1986, 1987, 1988 by Jonathan Payne.  JOVE *
                      3:  * is provided to you without charge, and with no warranty.  You may give  *
                      4:  * away copies of JOVE, including sources, provided that this notice is    *
                      5:  * included in all the files.                                              *
                      6:  ***************************************************************************/
                      7: 
                      8: #include "jove.h"
                      9: 
                     10: int    MarksShouldFloat = 1;
                     11: 
                     12: Mark *
                     13: MakeMark(line, column, type)
                     14: register Line  *line;
                     15: int    column,
                     16:        type;
                     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_flags = type;
                     23:        curbuf->b_marks = newmark;
                     24:        return newmark;
                     25: }
                     26: 
                     27: void
                     28: flush_marks(b)
                     29: Buffer *b;
                     30: {
                     31:        register Mark   *m,
                     32:                        *next;
                     33: 
                     34:        m = b->b_marks;
                     35:        while (m != 0) {
                     36:                next = m->m_next;
                     37:                free((char *) m);
                     38:                m = next;
                     39:        }
                     40: }
                     41: 
                     42: void
                     43: DelMark(m)
                     44: register Mark  *m;
                     45: {
                     46:        register Mark   *mp = curbuf->b_marks;
                     47: 
                     48:        if (m == mp)
                     49:                curbuf->b_marks = m->m_next;
                     50:        else {
                     51:                while (mp != 0 && mp->m_next != m)
                     52:                        mp = mp->m_next;
                     53:                if (mp == 0)
                     54:                        complain("Unknown mark!");
                     55:                mp->m_next = m->m_next;
                     56:        }
                     57:        free((char *) m);
                     58: }
                     59: 
                     60: void
                     61: AllMarkSet(b, line, col)
                     62: Buffer *b;
                     63: register Line  *line;
                     64: int    col;
                     65: {
                     66:        register Mark   *mp;
                     67: 
                     68:        for (mp = b->b_marks; mp != 0; mp = mp->m_next)
                     69:                MarkSet(mp, line, col);
                     70: }
                     71: 
                     72: void
                     73: MarkSet(m, line, column)
                     74: Mark   *m;
                     75: Line   *line;
                     76: int    column;
                     77: {
                     78:        m->m_line = line;
                     79:        m->m_char = column;
                     80: }
                     81: 
                     82: void
                     83: PopMark()
                     84: {
                     85:        int     pmark;
                     86: 
                     87:        if (curmark == 0)
                     88:                return;
                     89:        if (curbuf->b_markring[(curbuf->b_themark + 1) % NMARKS] == 0) {
                     90:                pmark = curbuf->b_themark;
                     91:                do {
                     92:                        if (--pmark < 0)
                     93:                                pmark = NMARKS - 1;
                     94:                } while (curbuf->b_markring[pmark] != 0);
                     95: 
                     96:                curbuf->b_markring[pmark] = MakeMark(curline, curchar, MarksShouldFloat ? M_FLOATER : M_FIXED);
                     97:                ToMark(curmark);
                     98:                DelMark(curmark);
                     99:                curmark = 0;
                    100:        } else
                    101:                PtToMark();
                    102: 
                    103:        pmark = curbuf->b_themark - 1;
                    104:        if (pmark < 0)
                    105:                pmark = NMARKS - 1;
                    106:        curbuf->b_themark = pmark;
                    107: }
                    108: 
                    109: void
                    110: SetMark()
                    111: {
                    112:        if (is_an_arg())
                    113:                PopMark();
                    114:        else
                    115:                set_mark();
                    116: }
                    117: 
                    118: void
                    119: set_mark()
                    120: {
                    121:        do_set_mark(curline, curchar);
                    122: }
                    123: 
                    124: void
                    125: do_set_mark(l, c)
                    126: Line   *l;
                    127: int    c;
                    128: {
                    129:        curbuf->b_themark = (curbuf->b_themark + 1) % NMARKS;
                    130:        if (curmark == 0)
                    131:                curmark = MakeMark(l, c, MarksShouldFloat ? M_FLOATER : M_FIXED);
                    132:        else
                    133:                MarkSet(curmark, l, c);
                    134:        s_mess("[Point pushed]");
                    135: }
                    136: 
                    137: /* Move point to Mark */
                    138: 
                    139: void
                    140: ToMark(m)
                    141: Mark   *m;
                    142: {
                    143:        int     len;
                    144: 
                    145:        if (m == 0)
                    146:                return;
                    147:        DotTo(m->m_line, m->m_char);
                    148:        if (curchar > (len = length(curline)))
                    149:                curchar = len;
                    150: }
                    151: 
                    152: Mark *
                    153: CurMark()
                    154: {
                    155:        if (curmark == 0)
                    156:                complain("No mark.");
                    157:        return curmark;
                    158: }
                    159: 
                    160: void
                    161: PtToMark()
                    162: {
                    163:        Line    *mline;
                    164:        int     mchar;
                    165:        Mark    *m = CurMark();
                    166: 
                    167:        mline = curline;
                    168:        mchar = curchar;
                    169: 
                    170:        ToMark(m);
                    171:        MarkSet(m, mline, mchar);
                    172: }
                    173: 
                    174: /* Fix marks for after a deletion.  For now, even marks that don't
                    175:    float will actually float, because we can't allow marks to point
                    176:    to non-existant lines. */
                    177: 
                    178: void
                    179: DFixMarks(line1, char1, line2, char2)
                    180: register Line  *line1,
                    181:                *line2;
                    182: int    char1,
                    183:        char2;
                    184: {
                    185:        register Mark   *m;
                    186:        Line    *lp = line1;
                    187: 
                    188:        if (curbuf->b_marks == 0)
                    189:                return;
                    190:        while (lp != line2->l_next) {
                    191:                for (m = curbuf->b_marks; m != 0; m = m->m_next)
                    192:                        if (m->m_line == lp)
                    193:                                m->m_char |= (1 << 15);
                    194:                lp = lp->l_next;
                    195:        }
                    196:        for (m = curbuf->b_marks; m; m = m->m_next) {
                    197:                if ((m->m_char & (1 << 15)) == 0)
                    198:                        continue;       /* Not effected */
                    199:                m->m_char &= ~(1 << 15);
                    200:                if (m->m_line == line1 && m->m_char < char1)
                    201:                        continue;       /* This mark is not affected */
                    202:                if (line1 == line2) {
                    203:                        if (m->m_char >= char1 && m->m_char <= char2)
                    204:                                m->m_char = char1;
                    205:                        else if (m->m_char > char2)
                    206:                                m->m_char -= (char2 - char1);
                    207:                        /* Same line move the mark backward */
                    208:                } else if (m->m_line == line2) {
                    209:                        if (m->m_char > char2)
                    210:                                m->m_char = char1 + (m->m_char - char2);
                    211:                        else
                    212:                                m->m_char = char1;
                    213:                        m->m_flags |= M_BIG_DELETE;
                    214:                        m->m_line = line1;
                    215:                } else {
                    216:                        m->m_char = char1;
                    217:                        m->m_line = line1;
                    218:                        m->m_flags |= M_BIG_DELETE;
                    219:                }
                    220:        }
                    221: }
                    222: 
                    223: /* Fix marks after an insertion.  Marks that don't float are ignored
                    224:    on insertion, which means PtToMark has to be careful ... */
                    225: 
                    226: void
                    227: IFixMarks(line1, char1, line2, char2)
                    228: register Line  *line1,
                    229:                *line2;
                    230: int    char1,
                    231:        char2;
                    232: {
                    233:        register Mark   *m;
                    234: 
                    235:        for (m = curbuf->b_marks; m != 0; m = m->m_next) {
                    236:                if ((m->m_flags & M_FLOATER) == 0)
                    237:                        continue;
                    238:                if (m->m_line == line1) {
                    239:                        if (m->m_char > char1) {
                    240:                                m->m_line = line2;
                    241:                                if (line1 == line2)
                    242:                                        m->m_char += (char2 - char1);
                    243:                                else
                    244:                                        m->m_char = char2 + (m->m_char - char1);
                    245:                        }
                    246:                }
                    247:        }
                    248: }

unix.superglobalmegacorp.com

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