|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.