Ticket #3836: maint - set default `--with-homedir` value to `.mc` instead of `yes`
[midnight-commander.git] / src / editor / bookmark.c
blob63519696b03c275384e08414ec8858aeea7cd448
1 /*
2 Editor book mark handling
4 Copyright (C) 2001-2017
5 Free Software Foundation, Inc.
7 Written by:
8 Paul Sheer, 1996, 1997
10 This file is part of the Midnight Commander.
12 The Midnight Commander is free software: you can redistribute it
13 and/or modify it under the terms of the GNU General Public License as
14 published by the Free Software Foundation, either version 3 of the License,
15 or (at your option) any later version.
17 The Midnight Commander is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
22 You should have received a copy of the GNU General Public License
23 along with this program. If not, see <http://www.gnu.org/licenses/>.
26 /** \file
27 * \brief Source: editor book mark handling
28 * \author Paul Sheer
29 * \date 1996, 1997
32 #include <config.h>
34 #include <ctype.h>
35 #include <errno.h>
36 #include <stdarg.h>
37 #include <stdio.h>
38 #include <stdlib.h>
39 #include <string.h>
41 #include <sys/types.h>
42 #include <sys/stat.h>
43 #include <unistd.h>
45 #include "lib/global.h"
46 #include "lib/util.h" /* MAX_SAVED_BOOKMARKS */
48 #include "editwidget.h"
50 /*** global variables ****************************************************************************/
52 /*** file scope macro definitions ****************************************************************/
54 /*** file scope type declarations ****************************************************************/
56 /*** file scope variables ************************************************************************/
58 /*** file scope functions ************************************************************************/
59 /* --------------------------------------------------------------------------------------------- */
61 /** note, if there is more than one bookmark on a line, then they are
62 appended after each other and the last one is always the one found
63 by book_mark_found() i.e. last in is the one seen */
65 static edit_book_mark_t *
66 double_marks (WEdit * edit, edit_book_mark_t * p)
68 (void) edit;
70 if (p->next != NULL)
71 while (p->next->line == p->line)
72 p = p->next;
73 return p;
76 /* --------------------------------------------------------------------------------------------- */
77 /** returns the first bookmark on or before this line */
79 edit_book_mark_t *
80 book_mark_find (WEdit * edit, long line)
82 edit_book_mark_t *p;
84 if (edit->book_mark == NULL)
86 /* must have an imaginary top bookmark at line -1 to make things less complicated */
87 edit->book_mark = g_new0 (edit_book_mark_t, 1);
88 edit->book_mark->line = -1;
89 return edit->book_mark;
92 for (p = edit->book_mark; p != NULL; p = p->next)
94 if (p->line > line)
95 break; /* gone past it going downward */
97 if (p->next != NULL)
99 if (p->next->line > line)
101 edit->book_mark = p;
102 return double_marks (edit, p);
105 else
107 edit->book_mark = p;
108 return double_marks (edit, p);
112 for (p = edit->book_mark; p != NULL; p = p->prev)
114 if (p->next != NULL && p->next->line <= line)
115 break; /* gone past it going upward */
117 if (p->line <= line)
119 if (p->next != NULL)
121 if (p->next->line > line)
123 edit->book_mark = p;
124 return double_marks (edit, p);
127 else
129 edit->book_mark = p;
130 return double_marks (edit, p);
135 return NULL; /* can't get here */
138 /* --------------------------------------------------------------------------------------------- */
139 /*** public functions ****************************************************************************/
140 /* --------------------------------------------------------------------------------------------- */
142 /**
143 * Check if bookmark bookmark exists at this line of this color
145 * @param edit editor object
146 * @param line line where book mark is
147 * @param c color of book mark
148 * @return TRUE if bookmark exists at this line of color c, FALSE otherwise
151 gboolean
152 book_mark_query_color (WEdit * edit, long line, int c)
154 if (edit->book_mark != NULL)
156 edit_book_mark_t *p;
158 for (p = book_mark_find (edit, line); p != NULL; p = p->prev)
160 if (p->line != line)
161 return FALSE;
162 if (p->c == c)
163 return TRUE;
167 return FALSE;
170 /* --------------------------------------------------------------------------------------------- */
171 /** insert a bookmark at this line */
173 void
174 book_mark_insert (WEdit * edit, long line, int c)
176 edit_book_mark_t *p, *q;
178 p = book_mark_find (edit, line);
179 #if 0
180 if (p->line == line)
182 /* already exists, so just change the color */
183 if (p->c != c)
185 p->c = c;
186 edit->force |= REDRAW_LINE;
188 return;
190 #endif
191 /* create list entry */
192 q = g_new (edit_book_mark_t, 1);
193 q->line = line;
194 q->c = c;
195 q->next = p->next;
196 /* insert into list */
197 q->prev = p;
198 if (p->next != NULL)
199 p->next->prev = q;
200 p->next = q;
202 edit->force |= REDRAW_LINE;
205 /* --------------------------------------------------------------------------------------------- */
206 /**
207 * Remove a bookmark if there is one at this line matching this color - c of -1 clear all
209 * @param edit editor object
210 * @param line line where book mark is
211 * @param c color of book mark or -1 to clear all book marks on this line
212 * @return FALSE if not found, TRUE otherwise
215 gboolean
216 book_mark_clear (WEdit * edit, long line, int c)
218 edit_book_mark_t *p, *q;
219 gboolean r = FALSE;
221 if (edit->book_mark == NULL)
222 return r;
224 for (p = book_mark_find (edit, line); p != NULL; p = q)
226 q = p->prev;
227 if (p->line == line && (p->c == c || c == -1))
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;
239 /* if there is only our dummy book mark left, clear it for speed */
240 if (edit->book_mark->line == -1 && edit->book_mark->next == NULL)
241 MC_PTR_FREE (edit->book_mark);
243 return r;
246 /* --------------------------------------------------------------------------------------------- */
247 /** clear all bookmarks matching this color, if c is -1 clears all */
249 void
250 book_mark_flush (WEdit * edit, int c)
252 edit_book_mark_t *p, *q;
254 if (edit->book_mark == NULL)
255 return;
257 while (edit->book_mark->prev != NULL)
258 edit->book_mark = edit->book_mark->prev;
260 for (q = edit->book_mark->next; q != NULL; q = p)
262 p = q->next;
263 if (q->c == c || c == -1)
265 q->prev->next = q->next;
266 if (p != NULL)
267 p->prev = q->prev;
268 g_free (q);
271 if (edit->book_mark->next == NULL)
272 MC_PTR_FREE (edit->book_mark);
274 edit->force |= REDRAW_PAGE;
277 /* --------------------------------------------------------------------------------------------- */
278 /** shift down bookmarks after this line */
280 void
281 book_mark_inc (WEdit * edit, long line)
283 if (edit->book_mark != NULL)
285 edit_book_mark_t *p;
287 p = book_mark_find (edit, line);
288 for (p = p->next; p != NULL; p = p->next)
289 p->line++;
293 /* --------------------------------------------------------------------------------------------- */
294 /** shift up bookmarks after this line */
296 void
297 book_mark_dec (WEdit * edit, long line)
299 if (edit->book_mark != NULL)
301 edit_book_mark_t *p;
303 p = book_mark_find (edit, line);
304 for (p = p->next; p != NULL; p = p->next)
305 p->line--;
309 /* --------------------------------------------------------------------------------------------- */
310 /** prepare line positions of bookmarks to be saved to file */
312 void
313 book_mark_serialize (WEdit * edit, int color)
315 if (edit->serialized_bookmarks != NULL)
316 g_array_set_size (edit->serialized_bookmarks, 0);
318 if (edit->book_mark != NULL)
320 edit_book_mark_t *p;
322 if (edit->serialized_bookmarks == NULL)
323 edit->serialized_bookmarks = g_array_sized_new (FALSE, FALSE, sizeof (size_t),
324 MAX_SAVED_BOOKMARKS);
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);
332 /* --------------------------------------------------------------------------------------------- */
333 /** restore bookmarks from saved line positions */
335 void
336 book_mark_restore (WEdit * edit, int color)
338 if (edit->serialized_bookmarks != NULL)
340 size_t i;
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);
347 /* --------------------------------------------------------------------------------------------- */