This source file includes following definitions.
- double_marks
- book_mark_find
- book_mark_query_color
- book_mark_insert
- book_mark_clear
- book_mark_flush
- book_mark_inc
- book_mark_dec
- book_mark_serialize
- book_mark_restore
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 #include <config.h>
33
34 #include <ctype.h>
35 #include <errno.h>
36 #include <stdarg.h>
37 #include <stdio.h>
38 #include <stdlib.h>
39 #include <string.h>
40
41 #include <sys/types.h>
42 #include <sys/stat.h>
43 #include <unistd.h>
44
45 #include "lib/global.h"
46 #include "lib/util.h"
47
48 #include "editwidget.h"
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65 static edit_book_mark_t *
66 double_marks (WEdit * edit, edit_book_mark_t * p)
67 {
68 (void) edit;
69
70 if (p->next != NULL)
71 while (p->next->line == p->line)
72 p = p->next;
73 return p;
74 }
75
76
77
78
79 edit_book_mark_t *
80 book_mark_find (WEdit * edit, long line)
81 {
82 edit_book_mark_t *p;
83
84 if (edit->book_mark == NULL)
85 {
86
87 edit->book_mark = g_new0 (edit_book_mark_t, 1);
88 edit->book_mark->line = -1;
89 return edit->book_mark;
90 }
91
92 for (p = edit->book_mark; p != NULL; p = p->next)
93 {
94 if (p->line > line)
95 break;
96
97 if (p->next != NULL)
98 {
99 if (p->next->line > line)
100 {
101 edit->book_mark = p;
102 return double_marks (edit, p);
103 }
104 }
105 else
106 {
107 edit->book_mark = p;
108 return double_marks (edit, p);
109 }
110 }
111
112 for (p = edit->book_mark; p != NULL; p = p->prev)
113 {
114 if (p->next != NULL && p->next->line <= line)
115 break;
116
117 if (p->line <= line)
118 {
119 if (p->next != NULL)
120 {
121 if (p->next->line > line)
122 {
123 edit->book_mark = p;
124 return double_marks (edit, p);
125 }
126 }
127 else
128 {
129 edit->book_mark = p;
130 return double_marks (edit, p);
131 }
132 }
133 }
134
135 return NULL;
136 }
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151 gboolean
152 book_mark_query_color (WEdit * edit, long line, int c)
153 {
154 if (edit->book_mark != NULL)
155 {
156 edit_book_mark_t *p;
157
158 for (p = book_mark_find (edit, line); p != NULL; p = p->prev)
159 {
160 if (p->line != line)
161 return FALSE;
162 if (p->c == c)
163 return TRUE;
164 }
165 }
166
167 return FALSE;
168 }
169
170
171
172
173 void
174 book_mark_insert (WEdit * edit, long line, int c)
175 {
176 edit_book_mark_t *p, *q;
177
178 p = book_mark_find (edit, line);
179 #if 0
180 if (p->line == line)
181 {
182
183 if (p->c != c)
184 {
185 p->c = c;
186 edit->force |= REDRAW_LINE;
187 }
188 return;
189 }
190 #endif
191
192 q = g_new (edit_book_mark_t, 1);
193 q->line = line;
194 q->c = c;
195 q->next = p->next;
196
197 q->prev = p;
198 if (p->next != NULL)
199 p->next->prev = q;
200 p->next = q;
201
202 edit->force |= REDRAW_LINE;
203 }
204
205
206
207
208
209
210
211
212
213
214
215 gboolean
216 book_mark_clear (WEdit * edit, long line, int c)
217 {
218 edit_book_mark_t *p, *q;
219 gboolean r = FALSE;
220
221 if (edit->book_mark == NULL)
222 return r;
223
224 for (p = book_mark_find (edit, line); p != NULL; p = q)
225 {
226 q = p->prev;
227 if (p->line == line && (p->c == c || c == -1))
228 {
229 r = TRUE;
230 edit->book_mark = p->prev;
231 p->prev->next = p->next;
232 if (p->next != NULL)
233 p->next->prev = p->prev;
234 g_free (p);
235 edit->force |= REDRAW_LINE;
236 break;
237 }
238 }
239
240 if (edit->book_mark->line == -1 && edit->book_mark->next == NULL)
241 MC_PTR_FREE (edit->book_mark);
242
243 return r;
244 }
245
246
247
248
249 void
250 book_mark_flush (WEdit * edit, int c)
251 {
252 edit_book_mark_t *p, *q;
253
254 if (edit->book_mark == NULL)
255 return;
256
257 while (edit->book_mark->prev != NULL)
258 edit->book_mark = edit->book_mark->prev;
259
260 for (q = edit->book_mark->next; q != NULL; q = p)
261 {
262 p = q->next;
263 if (q->c == c || c == -1)
264 {
265 q->prev->next = q->next;
266 if (p != NULL)
267 p->prev = q->prev;
268 g_free (q);
269 }
270 }
271 if (edit->book_mark->next == NULL)
272 MC_PTR_FREE (edit->book_mark);
273
274 edit->force |= REDRAW_PAGE;
275 }
276
277
278
279
280 void
281 book_mark_inc (WEdit * edit, long line)
282 {
283 if (edit->book_mark != NULL)
284 {
285 edit_book_mark_t *p;
286
287 p = book_mark_find (edit, line);
288 for (p = p->next; p != NULL; p = p->next)
289 p->line++;
290 }
291 }
292
293
294
295
296 void
297 book_mark_dec (WEdit * edit, long line)
298 {
299 if (edit->book_mark != NULL)
300 {
301 edit_book_mark_t *p;
302
303 p = book_mark_find (edit, line);
304 for (p = p->next; p != NULL; p = p->next)
305 p->line--;
306 }
307 }
308
309
310
311
312 void
313 book_mark_serialize (WEdit * edit, int color)
314 {
315 if (edit->serialized_bookmarks != NULL)
316 g_array_set_size (edit->serialized_bookmarks, 0);
317
318 if (edit->book_mark != NULL)
319 {
320 edit_book_mark_t *p;
321
322 if (edit->serialized_bookmarks == NULL)
323 edit->serialized_bookmarks = g_array_sized_new (FALSE, FALSE, sizeof (size_t),
324 MAX_SAVED_BOOKMARKS);
325
326 for (p = book_mark_find (edit, 0); p != NULL; p = p->next)
327 if (p->c == color && p->line >= 0)
328 g_array_append_val (edit->serialized_bookmarks, p->line);
329 }
330 }
331
332
333
334
335 void
336 book_mark_restore (WEdit * edit, int color)
337 {
338 if (edit->serialized_bookmarks != NULL)
339 {
340 size_t i;
341
342 for (i = 0; i < edit->serialized_bookmarks->len; i++)
343 book_mark_insert (edit, g_array_index (edit->serialized_bookmarks, size_t, i), color);
344 }
345 }
346
347