mirror of
https://github.com/MidnightCommander/mc
synced 2024-12-23 12:56:51 +03:00
e064bd60df
...or not-so-large but nevertheless contain more than one function call, or contain loops, or contain if's and at least one function call, or contain largish objects on stack. In my experience, in those cases the code size growth is big enough to not inline stuff. I guess some of the really big functions are defined inline because they have, or had in the past, just one callsite. But for a few years gcc already does it automatically, no need to do it by hand and risk code size explosion when later during code evolution another callsite is created. This optimization by hand is simply no longer needed. Anyway, here is the code size difference: text data bss dec hex filename 572337 17944 177820 768101 bb865 mc.t5/.obj/src/mc 567697 17944 177820 763461 ba645 mc.t6/.obj/src/mc Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com> Signed-off-by: Sergei Trofimovich <slyfox@inbox.ru>
226 lines
5.4 KiB
C
226 lines
5.4 KiB
C
/* editor book mark handling
|
|
|
|
Copyright (C) 2001, 2002, 2003, 2005, 2007 Free Software Foundation, Inc.
|
|
|
|
Authors: 1996, 1997 Paul Sheer
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
02110-1301, USA.
|
|
*/
|
|
|
|
/** \file
|
|
* \brief Source: editor book mark handling
|
|
* \author Paul Sheer
|
|
* \date 1996, 1997
|
|
*/
|
|
|
|
#include <config.h>
|
|
|
|
#include <ctype.h>
|
|
#include <errno.h>
|
|
#include <stdarg.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <unistd.h>
|
|
|
|
#include "../src/global.h"
|
|
|
|
#include "edit-impl.h"
|
|
#include "edit-widget.h"
|
|
|
|
|
|
/* note, if there is more than one bookmark on a line, then they are
|
|
appended after each other and the last one is always the one found
|
|
by book_mark_found() i.e. last in is the one seen */
|
|
|
|
static struct _book_mark *double_marks (WEdit * edit, struct _book_mark *p)
|
|
{
|
|
(void) edit;
|
|
|
|
if (p->next)
|
|
while (p->next->line == p->line)
|
|
p = p->next;
|
|
return p;
|
|
}
|
|
|
|
/* returns the first bookmark on or before this line */
|
|
struct _book_mark *book_mark_find (WEdit * edit, int line)
|
|
{
|
|
struct _book_mark *p;
|
|
if (!edit->book_mark) {
|
|
/* must have an imaginary top bookmark at line -1 to make things less complicated */
|
|
edit->book_mark = g_malloc0 (sizeof (struct _book_mark));
|
|
edit->book_mark->line = -1;
|
|
return edit->book_mark;
|
|
}
|
|
for (p = edit->book_mark; p; p = p->next) {
|
|
if (p->line > line)
|
|
break; /* gone past it going downward */
|
|
if (p->line <= line) {
|
|
if (p->next) {
|
|
if (p->next->line > line) {
|
|
edit->book_mark = p;
|
|
return double_marks (edit, p);
|
|
}
|
|
} else {
|
|
edit->book_mark = p;
|
|
return double_marks (edit, p);
|
|
}
|
|
}
|
|
}
|
|
for (p = edit->book_mark; p; p = p->prev) {
|
|
if (p->next)
|
|
if (p->next->line <= line)
|
|
break; /* gone past it going upward */
|
|
if (p->line <= line) {
|
|
if (p->next) {
|
|
if (p->next->line > line) {
|
|
edit->book_mark = p;
|
|
return double_marks (edit, p);
|
|
}
|
|
} else {
|
|
edit->book_mark = p;
|
|
return double_marks (edit, p);
|
|
}
|
|
}
|
|
}
|
|
return 0; /* can't get here */
|
|
}
|
|
|
|
/* returns true if a bookmark exists at this line of color c */
|
|
int book_mark_query_color (WEdit * edit, int line, int c)
|
|
{
|
|
struct _book_mark *p;
|
|
if (!edit->book_mark)
|
|
return 0;
|
|
for (p = book_mark_find (edit, line); p; p = p->prev) {
|
|
if (p->line != line)
|
|
return 0;
|
|
if (p->c == c)
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
/* insert a bookmark at this line */
|
|
void
|
|
book_mark_insert (WEdit *edit, int line, int c)
|
|
{
|
|
struct _book_mark *p, *q;
|
|
p = book_mark_find (edit, line);
|
|
#if 0
|
|
if (p->line == line) {
|
|
/* already exists, so just change the color */
|
|
if (p->c != c) {
|
|
edit->force |= REDRAW_LINE;
|
|
p->c = c;
|
|
}
|
|
return;
|
|
}
|
|
#endif
|
|
edit->force |= REDRAW_LINE;
|
|
/* create list entry */
|
|
q = g_malloc0 (sizeof (struct _book_mark));
|
|
q->line = line;
|
|
q->c = c;
|
|
q->next = p->next;
|
|
/* insert into list */
|
|
q->prev = p;
|
|
if (p->next)
|
|
p->next->prev = q;
|
|
p->next = q;
|
|
}
|
|
|
|
/* remove a bookmark if there is one at this line matching this color - c of -1 clear all */
|
|
/* returns non-zero on not-found */
|
|
int book_mark_clear (WEdit * edit, int line, int c)
|
|
{
|
|
struct _book_mark *p, *q;
|
|
int r = 1;
|
|
if (!edit->book_mark)
|
|
return r;
|
|
for (p = book_mark_find (edit, line); p; p = q) {
|
|
q = p->prev;
|
|
if (p->line == line && (p->c == c || c == -1)) {
|
|
r = 0;
|
|
edit->force |= REDRAW_LINE;
|
|
edit->book_mark = p->prev;
|
|
p->prev->next = p->next;
|
|
if (p->next)
|
|
p->next->prev = p->prev;
|
|
g_free (p);
|
|
break;
|
|
}
|
|
}
|
|
/* if there is only our dummy book mark left, clear it for speed */
|
|
if (edit->book_mark->line == -1 && !edit->book_mark->next) {
|
|
g_free (edit->book_mark);
|
|
edit->book_mark = 0;
|
|
}
|
|
return r;
|
|
}
|
|
|
|
/* clear all bookmarks matching this color, if c is -1 clears all */
|
|
void book_mark_flush (WEdit * edit, int c)
|
|
{
|
|
struct _book_mark *p, *q;
|
|
if (!edit->book_mark)
|
|
return;
|
|
edit->force |= REDRAW_PAGE;
|
|
while (edit->book_mark->prev)
|
|
edit->book_mark = edit->book_mark->prev;
|
|
for (q = edit->book_mark->next; q; q = p) {
|
|
p = q->next;
|
|
if (q->c == c || c == -1) {
|
|
q->prev->next = q->next;
|
|
if (p)
|
|
p->prev = q->prev;
|
|
g_free (q);
|
|
}
|
|
}
|
|
if (!edit->book_mark->next) {
|
|
g_free (edit->book_mark);
|
|
edit->book_mark = 0;
|
|
}
|
|
}
|
|
|
|
/* shift down bookmarks after this line */
|
|
void book_mark_inc (WEdit * edit, int line)
|
|
{
|
|
if (edit->book_mark) {
|
|
struct _book_mark *p;
|
|
p = book_mark_find (edit, line);
|
|
for (p = p->next; p; p = p->next) {
|
|
p->line++;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* shift up bookmarks after this line */
|
|
void book_mark_dec (WEdit * edit, int line)
|
|
{
|
|
if (edit->book_mark) {
|
|
struct _book_mark *p;
|
|
p = book_mark_find (edit, line);
|
|
for (p = p->next; p; p = p->next) {
|
|
p->line--;
|
|
}
|
|
}
|
|
}
|