1
1

Start of edit buffers refactoring.

Move buffers to separate class.

Signed-off-by: Andrew Borodin <aborodin@vmail.ru>
Этот коммит содержится в:
Andrew Borodin 2013-02-15 13:02:00 +04:00
родитель 23c2df198c
Коммит f56de22de5
10 изменённых файлов: 417 добавлений и 330 удалений

Просмотреть файл

@ -9,8 +9,9 @@ endif
libedit_la_SOURCES = \
bookmark.c \
choosesyntax.c \
edit.c edit.h \
edit-impl.h \
edit.c edit.h \
editbuffer.c editbuffer.h \
editcmd.c \
editcmd_dialogs.c editcmd_dialogs.h \
editdraw.c \

Просмотреть файл

@ -39,33 +39,6 @@
#define EDIT_TOP_EXTREME option_edit_top_extreme
#define EDIT_BOTTOM_EXTREME option_edit_bottom_extreme
/*
* The editor keeps data in two arrays of buffers.
* All buffers have the same size, which must be a power of 2.
*/
/* Configurable: log2 of the buffer size in bytes */
#ifndef S_EDIT_BUF_SIZE
#define S_EDIT_BUF_SIZE 16
#endif
/* Size of the buffer */
#define EDIT_BUF_SIZE (((off_t) 1) << S_EDIT_BUF_SIZE)
/* Buffer mask (used to find cursor position relative to the buffer) */
#define M_EDIT_BUF_SIZE (EDIT_BUF_SIZE - 1)
/*
* Configurable: Maximal allowed number of buffers in each buffer array.
* This number can be increased for systems with enough physical memory.
*/
#ifndef MAXBUFF
#define MAXBUFF 1024
#endif
/* Maximal length of file that can be opened */
#define SIZE_LIMIT (EDIT_BUF_SIZE * (MAXBUFF - 2))
/* Initial size of the undo stack, in bytes */
#define START_STACK_SIZE 32

Просмотреть файл

@ -135,37 +135,8 @@ static const struct edit_filters
/* *INDENT-ON* */
};
/*** file scope functions ************************************************************************/
/* --------------------------------------------------------------------------------------------- */
/*-
*
* here's a quick sketch of the layout: (don't run this through indent.)
*
* (b1 is buffers1 and b2 is buffers2)
*
* |
* \0\0\0\0\0m e _ f i l e . \nf i n . \n|T h i s _ i s _ s o\0\0\0\0\0\0\0\0\0
* ______________________________________|______________________________________
* |
* ... | b2[2] | b2[1] | b2[0] | b1[0] | b1[1] | b1[2] | ...
* |-> |-> |-> |-> |-> |-> |
* |
* _<------------------------->|<----------------->_
* WEdit->curs2 | WEdit->curs1
* ^ | ^
* | ^|^ |
* cursor ||| cursor
* |||
* file end|||file beginning
* |
* |
*
* _
* This_is_some_file
* fin.
*/
/*** file scope functions ************************************************************************/
/* --------------------------------------------------------------------------------------------- */
/**
* Initialize the buffers for an empty files.
@ -178,13 +149,13 @@ edit_init_buffers (WEdit * edit)
for (j = 0; j <= MAXBUFF; j++)
{
edit->buffers1[j] = NULL;
edit->buffers2[j] = NULL;
edit->buffer.buffers1[j] = NULL;
edit->buffer.buffers2[j] = NULL;
}
edit->curs1 = 0;
edit->curs2 = 0;
edit->buffers2[0] = g_malloc0 (EDIT_BUF_SIZE);
edit->buffer.curs1 = 0;
edit->buffer.curs2 = 0;
edit->buffer.buffers2[0] = g_malloc0 (EDIT_BUF_SIZE);
}
/* --------------------------------------------------------------------------------------------- */
@ -214,23 +185,23 @@ edit_load_file_fast (WEdit * edit, const vfs_path_t * filename_vpath)
return FALSE;
}
edit->curs2 = edit->last_byte;
buf2 = edit->curs2 >> S_EDIT_BUF_SIZE;
edit->buffer.curs2 = edit->last_byte;
buf2 = edit->buffer.curs2 >> S_EDIT_BUF_SIZE;
if (edit->buffers2[buf2] == NULL)
edit->buffers2[buf2] = g_malloc0 (EDIT_BUF_SIZE);
if (edit->buffer.buffers2[buf2] == NULL)
edit->buffer.buffers2[buf2] = g_malloc0 (EDIT_BUF_SIZE);
if (mc_read (file,
(char *) edit->buffers2[buf2] + EDIT_BUF_SIZE -
(edit->curs2 & M_EDIT_BUF_SIZE), edit->curs2 & M_EDIT_BUF_SIZE) < 0)
(char *) edit->buffer.buffers2[buf2] + EDIT_BUF_SIZE -
(edit->buffer.curs2 & M_EDIT_BUF_SIZE), edit->buffer.curs2 & M_EDIT_BUF_SIZE) < 0)
goto done;
for (buf = buf2 - 1; buf >= 0; buf--)
{
/* edit->buffers2[0] is already allocated */
if (edit->buffers2[buf] == NULL)
edit->buffers2[buf] = g_malloc0 (EDIT_BUF_SIZE);
if (mc_read (file, (char *) edit->buffers2[buf], EDIT_BUF_SIZE) < 0)
/* edit->buffer.buffers2[0] is already allocated */
if (edit->buffer.buffers2[buf] == NULL)
edit->buffer.buffers2[buf] = g_malloc0 (EDIT_BUF_SIZE);
if (mc_read (file, (char *) edit->buffer.buffers2[buf], EDIT_BUF_SIZE) < 0)
goto done;
}
@ -484,12 +455,12 @@ edit_load_position (WEdit * edit)
{
edit_cursor_move (edit, offset);
line = edit->curs_line;
edit->search_start = edit->curs1;
edit->search_start = edit->buffer.curs1;
}
book_mark_restore (edit, BOOK_MARK_COLOR);
edit_move_to_prev_col (edit, edit_bol (edit, edit->curs1));
edit_move_to_prev_col (edit, edit_bol (edit, edit->buffer.curs1));
edit_move_display (edit, line - (WIDGET (edit)->lines / 2));
}
@ -504,7 +475,7 @@ edit_save_position (WEdit * edit)
return;
book_mark_serialize (edit, BOOK_MARK_COLOR);
save_file_position (edit->filename_vpath, edit->curs_line + 1, edit->curs_col, edit->curs1,
save_file_position (edit->filename_vpath, edit->curs_line + 1, edit->curs_col, edit->buffer.curs1,
edit->serialized_bookmarks);
edit->serialized_bookmarks = NULL;
}
@ -629,19 +600,19 @@ edit_modification (WEdit * edit)
static char *
edit_get_byte_ptr (const WEdit * edit, off_t byte_index)
{
if (byte_index >= (edit->curs1 + edit->curs2) || byte_index < 0)
if (byte_index >= (edit->buffer.curs1 + edit->buffer.curs2) || byte_index < 0)
return NULL;
if (byte_index >= edit->curs1)
if (byte_index >= edit->buffer.curs1)
{
off_t p;
p = edit->curs1 + edit->curs2 - byte_index - 1;
return (char *) (edit->buffers2[p >> S_EDIT_BUF_SIZE] +
p = edit->buffer.curs1 + edit->buffer.curs2 - byte_index - 1;
return (char *) (edit->buffer.buffers2[p >> S_EDIT_BUF_SIZE] +
(EDIT_BUF_SIZE - (p & M_EDIT_BUF_SIZE) - 1));
}
return (char *) (edit->buffers1[byte_index >> S_EDIT_BUF_SIZE] +
return (char *) (edit->buffer.buffers1[byte_index >> S_EDIT_BUF_SIZE] +
(byte_index & M_EDIT_BUF_SIZE));
}
@ -656,7 +627,7 @@ edit_get_prev_utf (const WEdit * edit, off_t byte_index, int *char_width)
gchar *str;
gchar *cursor_buf_ptr;
if (byte_index > (edit->curs1 + edit->curs2) || byte_index <= 0)
if (byte_index > (edit->buffer.curs1 + edit->buffer.curs2) || byte_index <= 0)
{
*char_width = 0;
return 0;
@ -707,7 +678,7 @@ is_in_indent (const WEdit * edit)
{
off_t p;
for (p = edit_bol (edit, edit->curs1); p < edit->curs1; p++)
for (p = edit_bol (edit, edit->buffer.curs1); p < edit->buffer.curs1; p++)
if (strchr (" \t", edit_get_byte (edit, p)) == NULL)
return FALSE;
@ -755,7 +726,7 @@ edit_find_line (WEdit * edit, long line)
memset (edit->line_offsets, 0, sizeof (edit->line_offsets));
/* three offsets that we *know* are line 0 at 0 and these two: */
edit->line_numbers[1] = edit->curs_line;
edit->line_offsets[1] = edit_bol (edit, edit->curs1);
edit->line_offsets[1] = edit_bol (edit, edit->buffer.curs1);
edit->line_numbers[2] = edit->total_lines;
edit->line_offsets[2] = edit_bol (edit, edit->last_byte);
edit->caches_valid = TRUE;
@ -891,7 +862,7 @@ edit_move_to_top (WEdit * edit)
{
if (edit->curs_line)
{
edit_cursor_move (edit, -edit->curs1);
edit_cursor_move (edit, -edit->buffer.curs1);
edit_move_to_prev_col (edit, 0);
edit->force |= REDRAW_PAGE;
edit->search_start = 0;
@ -922,8 +893,8 @@ edit_move_to_bottom (WEdit * edit)
static void
edit_cursor_to_bol (WEdit * edit)
{
edit_cursor_move (edit, edit_bol (edit, edit->curs1) - edit->curs1);
edit->search_start = edit->curs1;
edit_cursor_move (edit, edit_bol (edit, edit->buffer.curs1) - edit->buffer.curs1);
edit->search_start = edit->buffer.curs1;
edit->prev_col = edit_get_col (edit);
edit->over_col = 0;
}
@ -934,8 +905,8 @@ edit_cursor_to_bol (WEdit * edit)
static void
edit_cursor_to_eol (WEdit * edit)
{
edit_cursor_move (edit, edit_eol (edit, edit->curs1) - edit->curs1);
edit->search_start = edit->curs1;
edit_cursor_move (edit, edit_eol (edit, edit->buffer.curs1) - edit->buffer.curs1);
edit->search_start = edit->buffer.curs1;
edit->prev_col = edit_get_col (edit);
edit->over_col = 0;
}
@ -993,13 +964,13 @@ edit_left_word_move (WEdit * edit, int s)
if (edit->column_highlight
&& edit->mark1 != edit->mark2
&& edit->over_col == 0 && edit->curs1 == edit_bol (edit, edit->curs1))
&& edit->over_col == 0 && edit->buffer.curs1 == edit_bol (edit, edit->buffer.curs1))
break;
edit_cursor_move (edit, -1);
if (edit->curs1 == 0)
if (edit->buffer.curs1 == 0)
break;
c1 = edit_get_byte (edit, edit->curs1 - 1);
c2 = edit_get_byte (edit, edit->curs1);
c1 = edit_get_byte (edit, edit->buffer.curs1 - 1);
c2 = edit_get_byte (edit, edit->buffer.curs1);
if (c1 == '\n' || c2 == '\n')
break;
if ((my_type_of (c1) & my_type_of (c2)) == 0)
@ -1031,13 +1002,13 @@ edit_right_word_move (WEdit * edit, int s)
if (edit->column_highlight
&& edit->mark1 != edit->mark2
&& edit->over_col == 0 && edit->curs1 == edit_eol (edit, edit->curs1))
&& edit->over_col == 0 && edit->buffer.curs1 == edit_eol (edit, edit->buffer.curs1))
break;
edit_cursor_move (edit, 1);
if (edit->curs1 >= edit->last_byte)
if (edit->buffer.curs1 >= edit->last_byte)
break;
c1 = edit_get_byte (edit, edit->curs1 - 1);
c2 = edit_get_byte (edit, edit->curs1);
c1 = edit_get_byte (edit, edit->buffer.curs1 - 1);
c2 = edit_get_byte (edit, edit->buffer.curs1);
if (c1 == '\n' || c2 == '\n')
break;
if ((my_type_of (c1) & my_type_of (c2)) == 0)
@ -1068,14 +1039,14 @@ edit_right_char_move_cmd (WEdit * edit)
#ifdef HAVE_CHARSET
if (edit->utf8)
{
c = edit_get_utf (edit, edit->curs1, &cw);
c = edit_get_utf (edit, edit->buffer.curs1, &cw);
if (cw < 1)
cw = 1;
}
else
#endif
{
c = edit_get_byte (edit, edit->curs1);
c = edit_get_byte (edit, edit->buffer.curs1);
}
if (option_cursor_beyond_eol && c == '\n')
{
@ -1096,12 +1067,12 @@ edit_left_char_move_cmd (WEdit * edit)
if (edit->column_highlight
&& option_cursor_beyond_eol
&& edit->mark1 != edit->mark2
&& edit->over_col == 0 && edit->curs1 == edit_bol (edit, edit->curs1))
&& edit->over_col == 0 && edit->buffer.curs1 == edit_bol (edit, edit->buffer.curs1))
return;
#ifdef HAVE_CHARSET
if (edit->utf8)
{
edit_get_prev_utf (edit, edit->curs1, &cw);
edit_get_prev_utf (edit, edit->buffer.curs1, &cw);
if (cw < 1)
cw = 1;
}
@ -1143,25 +1114,25 @@ edit_move_updown (WEdit * edit, long lines, gboolean do_scroll, gboolean directi
else
edit_scroll_downward (edit, lines);
}
p = edit_bol (edit, edit->curs1);
p = edit_bol (edit, edit->buffer.curs1);
p = direction ? edit_move_backward (edit, p, lines) : edit_move_forward (edit, p, lines, 0);
edit_cursor_move (edit, p - edit->curs1);
edit_cursor_move (edit, p - edit->buffer.curs1);
edit_move_to_prev_col (edit, p);
#ifdef HAVE_CHARSET
/* search start of current multibyte char (like CJK) */
if (edit->curs1 > 0 && edit->curs1 + 1 < edit->last_byte
&& edit_get_byte (edit, edit->curs1) >= 256 )
if (edit->buffer.curs1 > 0 && edit->buffer.curs1 + 1 < edit->last_byte
&& edit_get_byte (edit, edit->buffer.curs1) >= 256 )
{
edit_right_char_move_cmd (edit);
edit_left_char_move_cmd (edit);
}
#endif
edit->search_start = edit->curs1;
edit->search_start = edit->buffer.curs1;
edit->found_len = 0;
}
@ -1170,12 +1141,12 @@ edit_move_updown (WEdit * edit, long lines, gboolean do_scroll, gboolean directi
static void
edit_right_delete_word (WEdit * edit)
{
while (edit->curs1 < edit->last_byte)
while (edit->buffer.curs1 < edit->last_byte)
{
int c1, c2;
c1 = edit_delete (edit, TRUE);
c2 = edit_get_byte (edit, edit->curs1);
c2 = edit_get_byte (edit, edit->buffer.curs1);
if (c1 == '\n' || c2 == '\n')
break;
if ((isspace (c1) == 0) != (isspace (c2) == 0))
@ -1190,12 +1161,12 @@ edit_right_delete_word (WEdit * edit)
static void
edit_left_delete_word (WEdit * edit)
{
while (edit->curs1 > 0)
while (edit->buffer.curs1 > 0)
{
int c1, c2;
c1 = edit_backspace (edit, TRUE);
c2 = edit_get_byte (edit, edit->curs1 - 1);
c2 = edit_get_byte (edit, edit->buffer.curs1 - 1);
if (c1 == '\n' || c2 == '\n')
break;
if ((isspace (c1) == 0) != (isspace (c2) == 0))
@ -1389,7 +1360,7 @@ edit_group_undo (WEdit * edit)
static void
edit_delete_to_line_end (WEdit * edit)
{
while (edit_get_byte (edit, edit->curs1) != '\n' && edit->curs2 != 0)
while (edit_get_byte (edit, edit->buffer.curs1) != '\n' && edit->buffer.curs2 != 0)
edit_delete (edit, TRUE);
}
@ -1398,7 +1369,7 @@ edit_delete_to_line_end (WEdit * edit)
static void
edit_delete_to_line_begin (WEdit * edit)
{
while (edit_get_byte (edit, edit->curs1 - 1) != '\n' && edit->curs1 != 0)
while (edit_get_byte (edit, edit->buffer.curs1 - 1) != '\n' && edit->buffer.curs1 != 0)
edit_backspace (edit, TRUE);
}
@ -1422,7 +1393,7 @@ right_of_four_spaces (WEdit * edit)
int i, ch = 0;
for (i = 1; i <= HALF_TAB_SIZE; i++)
ch |= edit_get_byte (edit, edit->curs1 - i);
ch |= edit_get_byte (edit, edit->buffer.curs1 - i);
return (ch == ' ' && is_aligned_on_a_tab (edit));
}
@ -1435,7 +1406,7 @@ left_of_four_spaces (WEdit * edit)
int i, ch = 0;
for (i = 0; i < HALF_TAB_SIZE; i++)
ch |= edit_get_byte (edit, edit->curs1 + i);
ch |= edit_get_byte (edit, edit->buffer.curs1 + i);
return (ch == ' ' && is_aligned_on_a_tab (edit));
}
@ -1448,7 +1419,7 @@ edit_auto_indent (WEdit * edit)
off_t p;
char c;
p = edit->curs1;
p = edit->buffer.curs1;
/* use the previous line as a template */
p = edit_move_backward (edit, p, 1);
/* copy the leading whitespace of the line */
@ -1467,7 +1438,7 @@ static inline void
edit_double_newline (WEdit * edit)
{
edit_insert (edit, '\n');
if (edit_get_byte (edit, edit->curs1) == '\n' || edit_get_byte (edit, edit->curs1 - 2) == '\n')
if (edit_get_byte (edit, edit->buffer.curs1) == '\n' || edit_get_byte (edit, edit->buffer.curs1 - 2) == '\n')
return;
edit->force |= REDRAW_PAGE;
edit_insert (edit, '\n');
@ -1535,7 +1506,7 @@ check_and_wrap_line (WEdit * edit)
edit_update_curs_col (edit);
if (edit->curs_col < option_word_wrap_line_length)
return;
curs = edit->curs1;
curs = edit->buffer.curs1;
while (TRUE)
{
curs--;
@ -1547,10 +1518,10 @@ check_and_wrap_line (WEdit * edit)
}
if (c == ' ' || c == '\t')
{
off_t current = edit->curs1;
edit_cursor_move (edit, curs - edit->curs1 + 1);
off_t current = edit->buffer.curs1;
edit_cursor_move (edit, curs - edit->buffer.curs1 + 1);
edit_insert (edit, '\n');
edit_cursor_move (edit, current - edit->curs1 + 1);
edit_cursor_move (edit, current - edit->buffer.curs1 + 1);
return;
}
}
@ -1574,7 +1545,7 @@ edit_get_bracket (WEdit * edit, gboolean in_screen, unsigned long furthest_brack
unsigned long j = 0;
off_t q;
edit_update_curs_row (edit);
c = edit_get_byte (edit, edit->curs1);
c = edit_get_byte (edit, edit->buffer.curs1);
p = strchr (b, c);
/* no limit */
if (!furthest_bracket_search)
@ -1587,7 +1558,7 @@ edit_get_bracket (WEdit * edit, gboolean in_screen, unsigned long furthest_brack
/* going left or right? */
if (strchr ("{[(", c))
inc = 1;
for (q = edit->curs1 + inc;; q += inc)
for (q = edit->buffer.curs1 + inc;; q += inc)
{
/* out of buffer? */
if (q >= edit->last_byte || q < 0)
@ -1626,9 +1597,9 @@ edit_goto_matching_bracket (WEdit * edit)
q = edit_get_bracket (edit, 0, 0);
if (q >= 0)
{
edit->bracket = edit->curs1;
edit->bracket = edit->buffer.curs1;
edit->force |= REDRAW_PAGE;
edit_cursor_move (edit, q - edit->curs1);
edit_cursor_move (edit, q - edit->buffer.curs1);
}
}
@ -1648,14 +1619,14 @@ edit_move_block_to_right (WEdit * edit)
do
{
edit_cursor_move (edit, cur_bol - edit->curs1);
edit_cursor_move (edit, cur_bol - edit->buffer.curs1);
if (!edit_line_is_blank (edit, edit->curs_line))
{
if (option_fill_tabs_with_spaces)
insert_spaces_tab (edit, option_fake_half_tabs);
else
edit_insert (edit, '\t');
edit_cursor_move (edit, edit_bol (edit, cur_bol) - edit->curs1);
edit_cursor_move (edit, edit_bol (edit, cur_bol) - edit->buffer.curs1);
}
if (cur_bol == 0)
@ -1688,14 +1659,14 @@ edit_move_block_to_left (WEdit * edit)
int del_tab_width;
int next_char;
edit_cursor_move (edit, cur_bol - edit->curs1);
edit_cursor_move (edit, cur_bol - edit->buffer.curs1);
if (option_fake_half_tabs)
del_tab_width = HALF_TAB_SIZE;
else
del_tab_width = option_tab_spacing;
next_char = edit_get_byte (edit, edit->curs1);
next_char = edit_get_byte (edit, edit->buffer.curs1);
if (next_char == '\t')
edit_delete (edit, TRUE);
else if (next_char == ' ')
@ -1703,7 +1674,7 @@ edit_move_block_to_left (WEdit * edit)
{
if (next_char == ' ')
edit_delete (edit, TRUE);
next_char = edit_get_byte (edit, edit->curs1);
next_char = edit_get_byte (edit, edit->buffer.curs1);
}
if (cur_bol == 0)
@ -1745,7 +1716,7 @@ edit_insert_column_from_file (WEdit * edit, int file, off_t * start_pos, off_t *
off_t blocklen = -1, width = 0;
unsigned char *data;
cursor = edit->curs1;
cursor = edit->buffer.curs1;
col = edit_get_col (edit);
data = g_malloc0 (TEMP_BUF_LEN);
@ -1766,15 +1737,15 @@ edit_insert_column_from_file (WEdit * edit, int file, off_t * start_pos, off_t *
long l;
off_t p;
if (edit_get_byte (edit, edit->curs1) != '\n')
if (edit_get_byte (edit, edit->buffer.curs1) != '\n')
for (l = width - (edit_get_col (edit) - col); l > 0; l -= space_width)
edit_insert (edit, ' ');
for (p = edit->curs1;; p++)
for (p = edit->buffer.curs1;; p++)
{
if (p == edit->last_byte)
{
edit_cursor_move (edit, edit->last_byte - edit->curs1);
edit_cursor_move (edit, edit->last_byte - edit->buffer.curs1);
edit_insert_ahead (edit, '\n');
p++;
break;
@ -1786,7 +1757,7 @@ edit_insert_column_from_file (WEdit * edit, int file, off_t * start_pos, off_t *
}
}
edit_cursor_move (edit, edit_move_forward3 (edit, p, col, 0) - edit->curs1);
edit_cursor_move (edit, edit_move_forward3 (edit, p, col, 0) - edit->buffer.curs1);
for (l = col - edit_get_col (edit); l >= space_width; l -= space_width)
edit_insert (edit, ' ');
@ -1796,8 +1767,8 @@ edit_insert_column_from_file (WEdit * edit, int file, off_t * start_pos, off_t *
*col1 = col;
*col2 = col + width;
*start_pos = cursor;
*end_pos = edit->curs1;
edit_cursor_move (edit, cursor - edit->curs1);
*end_pos = edit->buffer.curs1;
edit_cursor_move (edit, cursor - edit->buffer.curs1);
g_free (data);
return blocklen;
@ -1821,7 +1792,7 @@ user_menu (WEdit * edit, const char *menu_file, int selected_entry)
block_file = mc_config_get_full_path (EDIT_BLOCK_FILE);
block_file_vpath = vfs_path_from_str (block_file);
curs = edit->curs1;
curs = edit->buffer.curs1;
nomark = eval_marks (edit, &start_mark, &end_mark);
if (nomark == 0)
edit_save_block (edit, block_file, start_mark, end_mark);
@ -1853,7 +1824,7 @@ user_menu (WEdit * edit, const char *menu_file, int selected_entry)
g_free (block_file);
vfs_path_free (block_file_vpath);
edit_cursor_move (edit, curs - edit->curs1);
edit_cursor_move (edit, curs - edit->buffer.curs1);
edit->force |= REDRAW_PAGE;
widget_redraw (WIDGET (edit));
}
@ -1883,7 +1854,7 @@ edit_get_utf (const WEdit * edit, off_t byte_index, int *char_width)
int width = 0;
gchar utf8_buf[UTF8_CHAR_LEN + 1];
if (byte_index >= (edit->curs1 + edit->curs2) || byte_index < 0)
if (byte_index >= (edit->buffer.curs1 + edit->buffer.curs2) || byte_index < 0)
{
*char_width = 0;
return '\n';
@ -2112,7 +2083,7 @@ edit_insert_file (WEdit * edit, const vfs_path_t * filename_vpath)
off_t ins_len = 0;
p = edit_get_filter (filename_vpath);
current = edit->curs1;
current = edit->buffer.curs1;
if (p != NULL)
{
@ -2126,7 +2097,7 @@ edit_insert_file (WEdit * edit, const vfs_path_t * filename_vpath)
/* Place cursor at the end of text selection */
if (!option_cursor_after_inserted_block)
{
ins_len = edit->curs1 - current;
ins_len = edit->buffer.curs1 - current;
edit_cursor_move (edit, -ins_len);
}
if (pclose (f) > 0)
@ -2178,7 +2149,7 @@ edit_insert_file (WEdit * edit, const vfs_path_t * filename_vpath)
long c1, c2;
blocklen = edit_insert_column_from_file (edit, file, &mark1, &mark2, &c1, &c2);
edit_set_markers (edit, edit->curs1, mark2, c1, c2);
edit_set_markers (edit, edit->buffer.curs1, mark2, c1, c2);
/* highlight inserted text then not persistent blocks */
if (!option_persistent_selections && edit->modified)
@ -2200,7 +2171,7 @@ edit_insert_file (WEdit * edit, const vfs_path_t * filename_vpath)
/* highlight inserted text then not persistent blocks */
if (!option_persistent_selections && edit->modified)
{
edit_set_markers (edit, edit->curs1, current, 0, 0);
edit_set_markers (edit, edit->buffer.curs1, current, 0, 0);
if (edit->column_highlight)
edit_push_undo_action (edit, COLUMN_ON);
edit->column_highlight = 0;
@ -2209,7 +2180,7 @@ edit_insert_file (WEdit * edit, const vfs_path_t * filename_vpath)
/* Place cursor at the end of text selection */
if (!option_cursor_after_inserted_block)
{
ins_len = edit->curs1 - current;
ins_len = edit->buffer.curs1 - current;
edit_cursor_move (edit, -ins_len);
}
}
@ -2358,8 +2329,8 @@ edit_clean (WEdit * edit)
book_mark_flush (edit, -1);
for (; j <= MAXBUFF; j++)
{
g_free (edit->buffers1[j]);
g_free (edit->buffers2[j]);
g_free (edit->buffer.buffers1[j]);
g_free (edit->buffer.buffers2[j]);
}
g_free (edit->undo_stack);
@ -2673,7 +2644,7 @@ edit_insert (WEdit * edit, int c)
return;
/* first we must update the position of the display window */
if (edit->curs1 < edit->start_display)
if (edit->buffer.curs1 < edit->start_display)
{
edit->start_display++;
if (c == '\n')
@ -2700,23 +2671,23 @@ edit_insert (WEdit * edit, int c)
else
edit_push_undo_action (edit, BACKSPACE_BR);
/* update markers */
edit->mark1 += (edit->mark1 > edit->curs1);
edit->mark2 += (edit->mark2 > edit->curs1);
edit->last_get_rule += (edit->last_get_rule > edit->curs1);
edit->mark1 += (edit->mark1 > edit->buffer.curs1);
edit->mark2 += (edit->mark2 > edit->buffer.curs1);
edit->last_get_rule += (edit->last_get_rule > edit->buffer.curs1);
/* add a new buffer if we've reached the end of the last one */
if (!(edit->curs1 & M_EDIT_BUF_SIZE))
edit->buffers1[edit->curs1 >> S_EDIT_BUF_SIZE] = g_malloc0 (EDIT_BUF_SIZE);
if (!(edit->buffer.curs1 & M_EDIT_BUF_SIZE))
edit->buffer.buffers1[edit->buffer.curs1 >> S_EDIT_BUF_SIZE] = g_malloc0 (EDIT_BUF_SIZE);
/* perform the insertion */
edit->buffers1[edit->curs1 >> S_EDIT_BUF_SIZE][edit->curs1 & M_EDIT_BUF_SIZE]
edit->buffer.buffers1[edit->buffer.curs1 >> S_EDIT_BUF_SIZE][edit->buffer.curs1 & M_EDIT_BUF_SIZE]
= (unsigned char) c;
/* update file length */
edit->last_byte++;
/* update cursor position */
edit->curs1++;
edit->buffer.curs1++;
}
/* --------------------------------------------------------------------------------------------- */
@ -2728,7 +2699,7 @@ edit_insert_ahead (WEdit * edit, int c)
if (edit->last_byte >= SIZE_LIMIT)
return;
if (edit->curs1 < edit->start_display)
if (edit->buffer.curs1 < edit->start_display)
{
edit->start_display++;
if (c == '\n')
@ -2747,17 +2718,17 @@ edit_insert_ahead (WEdit * edit, int c)
else
edit_push_undo_action (edit, DELCHAR_BR);
edit->mark1 += (edit->mark1 >= edit->curs1);
edit->mark2 += (edit->mark2 >= edit->curs1);
edit->last_get_rule += (edit->last_get_rule >= edit->curs1);
edit->mark1 += (edit->mark1 >= edit->buffer.curs1);
edit->mark2 += (edit->mark2 >= edit->buffer.curs1);
edit->last_get_rule += (edit->last_get_rule >= edit->buffer.curs1);
if (!((edit->curs2 + 1) & M_EDIT_BUF_SIZE))
edit->buffers2[(edit->curs2 + 1) >> S_EDIT_BUF_SIZE] = g_malloc0 (EDIT_BUF_SIZE);
edit->buffers2[edit->curs2 >> S_EDIT_BUF_SIZE]
[EDIT_BUF_SIZE - (edit->curs2 & M_EDIT_BUF_SIZE) - 1] = c;
if (!((edit->buffer.curs2 + 1) & M_EDIT_BUF_SIZE))
edit->buffer.buffers2[(edit->buffer.curs2 + 1) >> S_EDIT_BUF_SIZE] = g_malloc0 (EDIT_BUF_SIZE);
edit->buffer.buffers2[edit->buffer.curs2 >> S_EDIT_BUF_SIZE]
[EDIT_BUF_SIZE - (edit->buffer.curs2 & M_EDIT_BUF_SIZE) - 1] = c;
edit->last_byte++;
edit->curs2++;
edit->buffer.curs2++;
}
/* --------------------------------------------------------------------------------------------- */
@ -2782,14 +2753,14 @@ edit_delete (WEdit * edit, gboolean byte_delete)
int cw = 1;
int i;
if (edit->curs2 == 0)
if (edit->buffer.curs2 == 0)
return 0;
#ifdef HAVE_CHARSET
/* if byte_delete == TRUE then delete only one byte not multibyte char */
if (edit->utf8 && !byte_delete)
{
edit_get_utf (edit, edit->curs1, &cw);
edit_get_utf (edit, edit->buffer.curs1, &cw);
if (cw < 1)
cw = 1;
}
@ -2802,27 +2773,27 @@ edit_delete (WEdit * edit, gboolean byte_delete)
for (i = 1; i <= cw; i++)
{
if (edit->mark1 > edit->curs1)
if (edit->mark1 > edit->buffer.curs1)
{
edit->mark1--;
edit->end_mark_curs--;
}
if (edit->mark2 > edit->curs1)
if (edit->mark2 > edit->buffer.curs1)
edit->mark2--;
if (edit->last_get_rule > edit->curs1)
if (edit->last_get_rule > edit->buffer.curs1)
edit->last_get_rule--;
p = edit->buffers2[(edit->curs2 - 1) >> S_EDIT_BUF_SIZE][EDIT_BUF_SIZE -
((edit->curs2 -
p = edit->buffer.buffers2[(edit->buffer.curs2 - 1) >> S_EDIT_BUF_SIZE][EDIT_BUF_SIZE -
((edit->buffer.curs2 -
1) & M_EDIT_BUF_SIZE) - 1];
if (!(edit->curs2 & M_EDIT_BUF_SIZE))
if (!(edit->buffer.curs2 & M_EDIT_BUF_SIZE))
{
g_free (edit->buffers2[edit->curs2 >> S_EDIT_BUF_SIZE]);
edit->buffers2[edit->curs2 >> S_EDIT_BUF_SIZE] = NULL;
g_free (edit->buffer.buffers2[edit->buffer.curs2 >> S_EDIT_BUF_SIZE]);
edit->buffer.buffers2[edit->buffer.curs2 >> S_EDIT_BUF_SIZE] = NULL;
}
edit->last_byte--;
edit->curs2--;
edit->buffer.curs2--;
edit_push_undo_action (edit, p + 256);
}
@ -2833,7 +2804,7 @@ edit_delete (WEdit * edit, gboolean byte_delete)
edit->total_lines--;
edit->force |= REDRAW_AFTER_CURSOR;
}
if (edit->curs1 < edit->start_display)
if (edit->buffer.curs1 < edit->start_display)
{
edit->start_display--;
if (p == '\n')
@ -2852,7 +2823,7 @@ edit_backspace (WEdit * edit, gboolean byte_delete)
int cw = 1;
int i;
if (edit->curs1 == 0)
if (edit->buffer.curs1 == 0)
return 0;
if (edit->mark2 != edit->mark1)
@ -2861,7 +2832,7 @@ edit_backspace (WEdit * edit, gboolean byte_delete)
#ifdef HAVE_CHARSET
if (edit->utf8 && !byte_delete)
{
edit_get_prev_utf (edit, edit->curs1, &cw);
edit_get_prev_utf (edit, edit->buffer.curs1, &cw);
if (cw < 1)
cw = 1;
}
@ -2871,25 +2842,25 @@ edit_backspace (WEdit * edit, gboolean byte_delete)
for (i = 1; i <= cw; i++)
{
if (edit->mark1 >= edit->curs1)
if (edit->mark1 >= edit->buffer.curs1)
{
edit->mark1--;
edit->end_mark_curs--;
}
if (edit->mark2 >= edit->curs1)
if (edit->mark2 >= edit->buffer.curs1)
edit->mark2--;
if (edit->last_get_rule >= edit->curs1)
if (edit->last_get_rule >= edit->buffer.curs1)
edit->last_get_rule--;
p = *(edit->buffers1[(edit->curs1 - 1) >> S_EDIT_BUF_SIZE] +
((edit->curs1 - 1) & M_EDIT_BUF_SIZE));
if (((edit->curs1 - 1) & M_EDIT_BUF_SIZE) == 0)
p = *(edit->buffer.buffers1[(edit->buffer.curs1 - 1) >> S_EDIT_BUF_SIZE] +
((edit->buffer.curs1 - 1) & M_EDIT_BUF_SIZE));
if (((edit->buffer.curs1 - 1) & M_EDIT_BUF_SIZE) == 0)
{
g_free (edit->buffers1[edit->curs1 >> S_EDIT_BUF_SIZE]);
edit->buffers1[edit->curs1 >> S_EDIT_BUF_SIZE] = NULL;
g_free (edit->buffer.buffers1[edit->buffer.curs1 >> S_EDIT_BUF_SIZE]);
edit->buffer.buffers1[edit->buffer.curs1 >> S_EDIT_BUF_SIZE] = NULL;
}
edit->last_byte--;
edit->curs1--;
edit->buffer.curs1--;
edit_push_undo_action (edit, p);
}
edit_modification (edit);
@ -2901,7 +2872,7 @@ edit_backspace (WEdit * edit, gboolean byte_delete)
edit->force |= REDRAW_AFTER_CURSOR;
}
if (edit->curs1 < edit->start_display)
if (edit->buffer.curs1 < edit->start_display)
{
edit->start_display--;
if (p == '\n')
@ -2924,25 +2895,25 @@ edit_cursor_move (WEdit * edit, off_t increment)
{
for (; increment < 0; increment++)
{
if (edit->curs1 == 0)
if (edit->buffer.curs1 == 0)
return;
edit_push_undo_action (edit, CURS_RIGHT);
c = edit_get_byte (edit, edit->curs1 - 1);
if (!((edit->curs2 + 1) & M_EDIT_BUF_SIZE))
edit->buffers2[(edit->curs2 + 1) >> S_EDIT_BUF_SIZE] = g_malloc0 (EDIT_BUF_SIZE);
edit->buffers2[edit->curs2 >> S_EDIT_BUF_SIZE][EDIT_BUF_SIZE -
(edit->curs2 & M_EDIT_BUF_SIZE) - 1] = c;
edit->curs2++;
c = edit->buffers1[(edit->curs1 - 1) >> S_EDIT_BUF_SIZE][(edit->curs1 -
c = edit_get_byte (edit, edit->buffer.curs1 - 1);
if (!((edit->buffer.curs2 + 1) & M_EDIT_BUF_SIZE))
edit->buffer.buffers2[(edit->buffer.curs2 + 1) >> S_EDIT_BUF_SIZE] = g_malloc0 (EDIT_BUF_SIZE);
edit->buffer.buffers2[edit->buffer.curs2 >> S_EDIT_BUF_SIZE][EDIT_BUF_SIZE -
(edit->buffer.curs2 & M_EDIT_BUF_SIZE) - 1] = c;
edit->buffer.curs2++;
c = edit->buffer.buffers1[(edit->buffer.curs1 - 1) >> S_EDIT_BUF_SIZE][(edit->buffer.curs1 -
1) & M_EDIT_BUF_SIZE];
if (!((edit->curs1 - 1) & M_EDIT_BUF_SIZE))
if (!((edit->buffer.curs1 - 1) & M_EDIT_BUF_SIZE))
{
g_free (edit->buffers1[edit->curs1 >> S_EDIT_BUF_SIZE]);
edit->buffers1[edit->curs1 >> S_EDIT_BUF_SIZE] = NULL;
g_free (edit->buffer.buffers1[edit->buffer.curs1 >> S_EDIT_BUF_SIZE]);
edit->buffer.buffers1[edit->buffer.curs1 >> S_EDIT_BUF_SIZE] = NULL;
}
edit->curs1--;
edit->buffer.curs1--;
if (c == '\n')
{
edit->curs_line--;
@ -2955,25 +2926,25 @@ edit_cursor_move (WEdit * edit, off_t increment)
{
for (; increment > 0; increment--)
{
if (edit->curs2 == 0)
if (edit->buffer.curs2 == 0)
return;
edit_push_undo_action (edit, CURS_LEFT);
c = edit_get_byte (edit, edit->curs1);
if (!(edit->curs1 & M_EDIT_BUF_SIZE))
edit->buffers1[edit->curs1 >> S_EDIT_BUF_SIZE] = g_malloc0 (EDIT_BUF_SIZE);
edit->buffers1[edit->curs1 >> S_EDIT_BUF_SIZE][edit->curs1 & M_EDIT_BUF_SIZE] = c;
edit->curs1++;
c = edit->buffers2[(edit->curs2 - 1) >> S_EDIT_BUF_SIZE][EDIT_BUF_SIZE -
((edit->curs2 -
c = edit_get_byte (edit, edit->buffer.curs1);
if (!(edit->buffer.curs1 & M_EDIT_BUF_SIZE))
edit->buffer.buffers1[edit->buffer.curs1 >> S_EDIT_BUF_SIZE] = g_malloc0 (EDIT_BUF_SIZE);
edit->buffer.buffers1[edit->buffer.curs1 >> S_EDIT_BUF_SIZE][edit->buffer.curs1 & M_EDIT_BUF_SIZE] = c;
edit->buffer.curs1++;
c = edit->buffer.buffers2[(edit->buffer.curs2 - 1) >> S_EDIT_BUF_SIZE][EDIT_BUF_SIZE -
((edit->buffer.curs2 -
1) & M_EDIT_BUF_SIZE) - 1];
if (!(edit->curs2 & M_EDIT_BUF_SIZE))
if (!(edit->buffer.curs2 & M_EDIT_BUF_SIZE))
{
g_free (edit->buffers2[edit->curs2 >> S_EDIT_BUF_SIZE]);
edit->buffers2[edit->curs2 >> S_EDIT_BUF_SIZE] = 0;
g_free (edit->buffer.buffers2[edit->buffer.curs2 >> S_EDIT_BUF_SIZE]);
edit->buffer.buffers2[edit->buffer.curs2 >> S_EDIT_BUF_SIZE] = 0;
}
edit->curs2--;
edit->buffer.curs2--;
if (c == '\n')
{
edit->curs_line++;
@ -3151,7 +3122,7 @@ edit_move_forward3 (const WEdit * edit, off_t current, long cols, off_t upto)
long
edit_get_col (const WEdit * edit)
{
return (long) edit_move_forward3 (edit, edit_bol (edit, edit->curs1), 0, edit->curs1);
return (long) edit_move_forward3 (edit, edit_bol (edit, edit->buffer.curs1), 0, edit->buffer.curs1);
}
/* --------------------------------------------------------------------------------------------- */
@ -3169,7 +3140,7 @@ edit_update_curs_row (WEdit * edit)
void
edit_update_curs_col (WEdit * edit)
{
edit->curs_col = (long) edit_move_forward3 (edit, edit_bol (edit, edit->curs1), 0, edit->curs1);
edit->curs_col = (long) edit_move_forward3 (edit, edit_bol (edit, edit->buffer.curs1), 0, edit->buffer.curs1);
}
/* --------------------------------------------------------------------------------------------- */
@ -3256,14 +3227,14 @@ edit_move_to_prev_col (WEdit * edit, off_t p)
long prev = edit->prev_col;
long over = edit->over_col;
edit_cursor_move (edit, edit_move_forward3 (edit, p, prev + edit->over_col, 0) - edit->curs1);
edit_cursor_move (edit, edit_move_forward3 (edit, p, prev + edit->over_col, 0) - edit->buffer.curs1);
if (option_cursor_beyond_eol)
{
long line_len;
line_len = (long) edit_move_forward3 (edit, edit_bol (edit, edit->curs1), 0,
edit_eol (edit, edit->curs1));
line_len = (long) edit_move_forward3 (edit, edit_bol (edit, edit->buffer.curs1), 0,
edit_eol (edit, edit->buffer.curs1));
if (line_len < prev + edit->over_col)
{
edit->over_col = prev + over - line_len;
@ -3293,11 +3264,11 @@ edit_move_to_prev_col (WEdit * edit, off_t p)
q = edit->curs_col;
edit->curs_col -= (edit->curs_col % fake_half_tabs);
p = edit_bol (edit, edit->curs1);
p = edit_bol (edit, edit->buffer.curs1);
edit_cursor_move (edit,
edit_move_forward3 (edit, p, edit->curs_col, 0) - edit->curs1);
edit_move_forward3 (edit, p, edit->curs_col, 0) - edit->buffer.curs1);
if (!left_of_four_spaces (edit))
edit_cursor_move (edit, edit_move_forward3 (edit, p, q, 0) - edit->curs1);
edit_cursor_move (edit, edit_move_forward3 (edit, p, q, 0) - edit->buffer.curs1);
}
}
}
@ -3381,14 +3352,14 @@ edit_mark_cmd (WEdit * edit, gboolean unmark)
else if (edit->mark2 >= 0)
{
edit->end_mark_curs = -1;
edit_set_markers (edit, edit->curs1, -1, edit->curs_col + edit->over_col,
edit_set_markers (edit, edit->buffer.curs1, -1, edit->curs_col + edit->over_col,
edit->curs_col + edit->over_col);
edit->force |= REDRAW_PAGE;
}
else
{
edit->end_mark_curs = edit->curs1;
edit_set_markers (edit, edit->mark1, edit->curs1, edit->column1,
edit->end_mark_curs = edit->buffer.curs1;
edit_set_markers (edit, edit->mark1, edit->buffer.curs1, edit->column1,
edit->curs_col + edit->over_col);
}
}
@ -3401,7 +3372,7 @@ edit_mark_current_word_cmd (WEdit * edit)
{
long pos;
for (pos = edit->curs1; pos != 0; pos--)
for (pos = edit->buffer.curs1; pos != 0; pos--)
{
int c1, c2;
@ -3435,7 +3406,7 @@ edit_mark_current_word_cmd (WEdit * edit)
void
edit_mark_current_line_cmd (WEdit * edit)
{
long pos = edit->curs1;
long pos = edit->buffer.curs1;
edit->mark1 = edit_bol (edit, pos);
edit->mark2 = edit_eol (edit, pos);
@ -3453,7 +3424,7 @@ edit_delete_line (WEdit * edit)
* Note that edit_get_byte() returns '\n' when byte position is
* beyond EOF.
*/
while (edit_get_byte (edit, edit->curs1) != '\n')
while (edit_get_byte (edit, edit->buffer.curs1) != '\n')
(void) edit_delete (edit, TRUE);
/*
@ -3467,7 +3438,7 @@ edit_delete_line (WEdit * edit)
* Delete left part of the line.
* Note, that edit_get_byte() returns '\n' when byte position is < 0.
*/
while (edit_get_byte (edit, edit->curs1 - 1) != '\n')
while (edit_get_byte (edit, edit->buffer.curs1 - 1) != '\n')
(void) edit_backspace (edit, TRUE);
}
@ -3663,7 +3634,7 @@ edit_execute_cmd (WEdit * edit, unsigned long command, int char_for_insertion)
edit_group_undo (edit);
edit->found_len = 0;
edit->prev_col = edit_get_col (edit);
edit->search_start = edit->curs1;
edit->search_start = edit->buffer.curs1;
return;
}
/* check for redo */
@ -3673,7 +3644,7 @@ edit_execute_cmd (WEdit * edit, unsigned long command, int char_for_insertion)
edit_do_redo (edit);
edit->found_len = 0;
edit->prev_col = edit_get_col (edit);
edit->search_start = edit->curs1;
edit->search_start = edit->buffer.curs1;
return;
}
@ -3692,7 +3663,7 @@ edit_execute_cmd (WEdit * edit, unsigned long command, int char_for_insertion)
#ifdef HAVE_CHARSET
if (!mc_global.utf8_display || edit->charpoint == 0)
#endif
if (edit_get_byte (edit, edit->curs1) != '\n')
if (edit_get_byte (edit, edit->buffer.curs1) != '\n')
edit_delete (edit, FALSE);
}
@ -3735,7 +3706,7 @@ edit_execute_cmd (WEdit * edit, unsigned long command, int char_for_insertion)
check_and_wrap_line (edit);
edit->found_len = 0;
edit->prev_col = edit_get_col (edit);
edit->search_start = edit->curs1;
edit->search_start = edit->buffer.curs1;
edit_find_bracket (edit);
return;
}
@ -3801,7 +3772,7 @@ edit_execute_cmd (WEdit * edit, unsigned long command, int char_for_insertion)
edit->over_col--;
else if (option_backspace_through_tabs && is_in_indent (edit))
{
while (edit_get_byte (edit, edit->curs1 - 1) != '\n' && edit->curs1 > 0)
while (edit_get_byte (edit, edit->buffer.curs1 - 1) != '\n' && edit->buffer.curs1 > 0)
edit_backspace (edit, TRUE);
}
else if (option_fake_half_tabs && is_in_indent (edit) && right_of_four_spaces (edit))
@ -4297,13 +4268,13 @@ edit_execute_cmd (WEdit * edit, unsigned long command, int char_for_insertion)
case CK_ScrollDown:
case CK_MarkScrollDown:
case CK_MarkColumnScrollDown:
edit->search_start = edit->curs1;
edit->search_start = edit->buffer.curs1;
edit->found_len = 0;
break;
default:
edit->found_len = 0;
edit->prev_col = edit_get_col (edit);
edit->search_start = edit->curs1;
edit->search_start = edit->buffer.curs1;
}
edit_find_bracket (edit);

87
src/editor/editbuffer.c Обычный файл
Просмотреть файл

@ -0,0 +1,87 @@
/*
Editor text keep buffer.
Copyright (C) 2013
The Free Software Foundation, Inc.
Written by:
Andrew Borodin <aborodin@vmail.ru> 2013
This file is part of the Midnight Commander.
The Midnight Commander 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 3 of the License,
or (at your option) any later version.
The Midnight Commander 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, see <http://www.gnu.org/licenses/>.
*/
/** \file
* \brief Source: editor text keep buffer.
* \author Andrew Borodin
* \date 2013
*/
#include <config.h>
#include "lib/global.h"
#include "editbuffer.h"
/* --------------------------------------------------------------------------------------------- */
/*-
*
* here's a quick sketch of the layout: (don't run this through indent.)
*
* (b1 is buffers1 and b2 is buffers2)
*
* |
* \0\0\0\0\0m e _ f i l e . \nf i n . \n|T h i s _ i s _ s o\0\0\0\0\0\0\0\0\0
* ______________________________________|______________________________________
* |
* ... | b2[2] | b2[1] | b2[0] | b1[0] | b1[1] | b1[2] | ...
* |-> |-> |-> |-> |-> |-> |
* |
* _<------------------------->|<----------------->_
* curs2 | curs1
* ^ | ^
* | ^|^ |
* cursor ||| cursor
* |||
* file end|||file beginning
* |
* |
*
* _
* This_is_some_file
* fin.
*
*
* This is called a "gab buffer".
* See also:
* http://en.wikipedia.org/wiki/Gap_buffer
* http://stackoverflow.com/questions/4199694/data-structure-for-text-editor
*/
/*** global variables ****************************************************************************/
/*** file scope macro definitions ****************************************************************/
/*** file scope type declarations ****************************************************************/
/*** file scope variables ************************************************************************/
/* --------------------------------------------------------------------------------------------- */
/*** file scope functions ************************************************************************/
/* --------------------------------------------------------------------------------------------- */
/* --------------------------------------------------------------------------------------------- */
/*** public functions ****************************************************************************/
/* --------------------------------------------------------------------------------------------- */

54
src/editor/editbuffer.h Обычный файл
Просмотреть файл

@ -0,0 +1,54 @@
/** \file
* \brief Header: text keep buffer for WEdit
*/
#ifndef MC__EDIT_BUFFER_H
#define MC__EDIT_BUFFER_H
/*** typedefs(not structures) and defined constants **********************************************/
/*
* The editor keeps data in two arrays of buffers.
* All buffers have the same size, which must be a power of 2.
*/
/* Configurable: log2 of the buffer size in bytes */
#ifndef S_EDIT_BUF_SIZE
#define S_EDIT_BUF_SIZE 16
#endif
/* Size of the buffer */
#define EDIT_BUF_SIZE (((off_t) 1) << S_EDIT_BUF_SIZE)
/* Buffer mask (used to find cursor position relative to the buffer) */
#define M_EDIT_BUF_SIZE (EDIT_BUF_SIZE - 1)
/*
* Configurable: Maximal allowed number of buffers in each buffer array.
* This number can be increased for systems with enough physical memory.
*/
#ifndef MAXBUFF
#define MAXBUFF 1024
#endif
/* Maximal length of file that can be opened */
#define SIZE_LIMIT (EDIT_BUF_SIZE * (MAXBUFF - 2))
/*** enums ***************************************************************************************/
/*** structures declarations (and typedefs of structures)*****************************************/
typedef struct edit_buffer_struct {
off_t curs1; /* position of the cursor from the beginning of the file. */
off_t curs2; /* position from the end of the file */
unsigned char *buffers1[MAXBUFF + 1]; /* all data up to curs1 */
unsigned char *buffers2[MAXBUFF + 1]; /* all data from end of file down to curs2 */
} edit_buffer_t;
/*** global variables defined in .c file *********************************************************/
/*** declarations of public functions ************************************************************/
/*** inline functions ****************************************************************************/
#endif /* MC__EDIT_BUFFER_H */

Просмотреть файл

@ -312,9 +312,9 @@ edit_save_file (WEdit * edit, const vfs_path_t * filename_vpath)
off_t buf;
buf = 0;
filelen = edit->last_byte;
while (buf <= (edit->curs1 >> S_EDIT_BUF_SIZE) - 1)
while (buf <= (edit->buffer.curs1 >> S_EDIT_BUF_SIZE) - 1)
{
if (mc_write (fd, (char *) edit->buffers1[buf], EDIT_BUF_SIZE) != EDIT_BUF_SIZE)
if (mc_write (fd, (char *) edit->buffer.buffers1[buf], EDIT_BUF_SIZE) != EDIT_BUF_SIZE)
{
mc_close (fd);
goto error_save;
@ -322,20 +322,20 @@ edit_save_file (WEdit * edit, const vfs_path_t * filename_vpath)
buf++;
}
if (mc_write
(fd, (char *) edit->buffers1[buf],
edit->curs1 & M_EDIT_BUF_SIZE) != (edit->curs1 & M_EDIT_BUF_SIZE))
(fd, (char *) edit->buffer.buffers1[buf],
edit->buffer.curs1 & M_EDIT_BUF_SIZE) != (edit->buffer.curs1 & M_EDIT_BUF_SIZE))
{
filelen = -1;
}
else if (edit->curs2)
else if (edit->buffer.curs2 != 0)
{
edit->curs2--;
buf = (edit->curs2 >> S_EDIT_BUF_SIZE);
edit->buffer.curs2--;
buf = (edit->buffer.curs2 >> S_EDIT_BUF_SIZE);
if (mc_write
(fd,
(char *) edit->buffers2[buf] + EDIT_BUF_SIZE -
(edit->curs2 & M_EDIT_BUF_SIZE) - 1,
1 + (edit->curs2 & M_EDIT_BUF_SIZE)) != 1 + (edit->curs2 & M_EDIT_BUF_SIZE))
(char *) edit->buffer.buffers2[buf] + EDIT_BUF_SIZE -
(edit->buffer.curs2 & M_EDIT_BUF_SIZE) - 1,
1 + (edit->buffer.curs2 & M_EDIT_BUF_SIZE)) != 1 + (edit->buffer.curs2 & M_EDIT_BUF_SIZE))
{
filelen = -1;
}
@ -343,14 +343,14 @@ edit_save_file (WEdit * edit, const vfs_path_t * filename_vpath)
{
while (--buf >= 0)
{
if (mc_write (fd, (char *) edit->buffers2[buf], EDIT_BUF_SIZE) != EDIT_BUF_SIZE)
if (mc_write (fd, (char *) edit->buffer.buffers2[buf], EDIT_BUF_SIZE) != EDIT_BUF_SIZE)
{
filelen = -1;
break;
}
}
}
edit->curs2++;
edit->buffer.curs2++;
}
if (mc_close (fd))
goto error_save;
@ -556,24 +556,24 @@ edit_delete_column_of_text (WEdit * edit)
while (n--)
{
r = edit_bol (edit, edit->curs1);
r = edit_bol (edit, edit->buffer.curs1);
p = edit_move_forward3 (edit, r, b, 0);
q = edit_move_forward3 (edit, r, c, 0);
if (p < m1)
p = m1;
if (q > m2)
q = m2;
edit_cursor_move (edit, p - edit->curs1);
edit_cursor_move (edit, p - edit->buffer.curs1);
while (q > p)
{
/* delete line between margins */
if (edit_get_byte (edit, edit->curs1) != '\n')
if (edit_get_byte (edit, edit->buffer.curs1) != '\n')
edit_delete (edit, TRUE);
q--;
}
if (n)
/* move to next line except on the last delete */
edit_cursor_move (edit, edit_move_forward (edit, edit->curs1, 1, 0) - edit->curs1);
edit_cursor_move (edit, edit_move_forward (edit, edit->buffer.curs1, 1, 0) - edit->buffer.curs1);
}
}
@ -615,7 +615,7 @@ edit_block_delete (WEdit * edit)
curs_pos = edit->curs_col + edit->over_col;
/* move cursor to start of selection */
edit_cursor_move (edit, start_mark - edit->curs1);
edit_cursor_move (edit, start_mark - edit->buffer.curs1);
edit_scroll_screen_over_cursor (edit);
if (start_mark < end_mark)
@ -630,8 +630,8 @@ edit_block_delete (WEdit * edit)
/* move cursor to the saved position */
edit_move_to_line (edit, curs_line);
/* calculate line width and cursor position before cut */
line_width = edit_move_forward3 (edit, edit_bol (edit, edit->curs1), 0,
edit_eol (edit, edit->curs1));
line_width = edit_move_forward3 (edit, edit_bol (edit, edit->buffer.curs1), 0,
edit_eol (edit, edit->buffer.curs1));
if (option_cursor_beyond_eol && curs_pos > line_width)
edit->over_col = curs_pos - line_width;
}
@ -858,7 +858,7 @@ editcmd_find (WEdit * edit, gsize * len)
else
{
if (edit_search_options.backwards)
end_mark = max (1, edit->curs1) - 1;
end_mark = max (1, edit->buffer.curs1) - 1;
}
/* search */
@ -950,7 +950,7 @@ edit_do_search (WEdit * edit)
gsize len = 0;
if (edit->search == NULL)
edit->search_start = edit->curs1;
edit->search_start = edit->buffer.curs1;
edit_push_undo_action (edit, KEY_PRESS + edit->start_display);
@ -981,7 +981,7 @@ edit_do_search (WEdit * edit)
if (found == 0)
edit_error_dialog (_("Search"), _("Search string not found"));
else
edit_cursor_move (edit, edit->search_start - edit->curs1);
edit_cursor_move (edit, edit->search_start - edit->buffer.curs1);
}
else
{
@ -998,7 +998,7 @@ edit_do_search (WEdit * edit)
edit->found_start = edit->search_start = edit->search->normal_offset;
edit->found_len = len;
edit->over_col = 0;
edit_cursor_move (edit, edit->search_start - edit->curs1);
edit_cursor_move (edit, edit->search_start - edit->buffer.curs1);
edit_scroll_screen_over_cursor (edit);
if (edit_search_options.backwards)
edit->search_start--;
@ -1007,7 +1007,7 @@ edit_do_search (WEdit * edit)
}
else
{
edit->search_start = edit->curs1;
edit->search_start = edit->buffer.curs1;
if (edit->search->error_str != NULL)
edit_error_dialog (_("Search"), edit->search->error_str);
}
@ -1125,10 +1125,10 @@ edit_find_word_start (WEdit * edit, off_t * word_start, gsize * word_len)
off_t i;
/* return if at begin of file */
if (edit->curs1 <= 0)
if (edit->buffer.curs1 <= 0)
return FALSE;
c = edit_get_byte (edit, edit->curs1 - 1);
c = edit_get_byte (edit, edit->buffer.curs1 - 1);
/* return if not at end or in word */
if (is_break_char (c))
return FALSE;
@ -1137,11 +1137,11 @@ edit_find_word_start (WEdit * edit, off_t * word_start, gsize * word_len)
for (i = 2;; i++)
{
/* return if at begin of file */
if (edit->curs1 < i)
if (edit->buffer.curs1 < i)
return FALSE;
last = c;
c = edit_get_byte (edit, edit->curs1 - i);
c = edit_get_byte (edit, edit->buffer.curs1 - i);
if (is_break_char (c))
{
@ -1149,7 +1149,7 @@ edit_find_word_start (WEdit * edit, off_t * word_start, gsize * word_len)
if (isdigit (last))
return FALSE;
*word_start = edit->curs1 - (i - 1); /* start found */
*word_start = edit->buffer.curs1 - (i - 1); /* start found */
*word_len = (gsize) (i - 1);
break;
}
@ -1318,7 +1318,7 @@ edit_insert_column_of_text (WEdit * edit, unsigned char *data, off_t size, long
off_t i, cursor;
long col;
cursor = edit->curs1;
cursor = edit->buffer.curs1;
col = edit_get_col (edit);
for (i = 0; i < size; i++)
@ -1330,16 +1330,16 @@ edit_insert_column_of_text (WEdit * edit, unsigned char *data, off_t size, long
long l;
off_t p;
if (edit_get_byte (edit, edit->curs1) != '\n')
if (edit_get_byte (edit, edit->buffer.curs1) != '\n')
{
for (l = width - (edit_get_col (edit) - col); l > 0; l -= space_width)
edit_insert (edit, ' ');
}
for (p = edit->curs1;; p++)
for (p = edit->buffer.curs1;; p++)
{
if (p == edit->last_byte)
{
edit_cursor_move (edit, edit->last_byte - edit->curs1);
edit_cursor_move (edit, edit->last_byte - edit->buffer.curs1);
edit_insert_ahead (edit, '\n');
p++;
break;
@ -1350,7 +1350,7 @@ edit_insert_column_of_text (WEdit * edit, unsigned char *data, off_t size, long
break;
}
}
edit_cursor_move (edit, edit_move_forward3 (edit, p, col, 0) - edit->curs1);
edit_cursor_move (edit, edit_move_forward3 (edit, p, col, 0) - edit->buffer.curs1);
for (l = col - edit_get_col (edit); l >= space_width; l -= space_width)
edit_insert (edit, ' ');
@ -1360,8 +1360,8 @@ edit_insert_column_of_text (WEdit * edit, unsigned char *data, off_t size, long
*col1 = col;
*col2 = col + width;
*start_pos = cursor;
*end_pos = edit->curs1;
edit_cursor_move (edit, cursor - edit->curs1);
*end_pos = edit->buffer.curs1;
edit_cursor_move (edit, cursor - edit->buffer.curs1);
}
/* --------------------------------------------------------------------------------------------- */
@ -2259,7 +2259,7 @@ eval_marks (WEdit * edit, off_t * start_mark, off_t * end_mark)
long end_mark_curs;
if (edit->end_mark_curs < 0)
end_mark_curs = edit->curs1;
end_mark_curs = edit->buffer.curs1;
else
end_mark_curs = edit->end_mark_curs;
@ -2311,7 +2311,7 @@ eval_marks (WEdit * edit, off_t * start_mark, off_t * end_mark)
void
edit_block_copy_cmd (WEdit * edit)
{
off_t start_mark, end_mark, current = edit->curs1;
off_t start_mark, end_mark, current = edit->buffer.curs1;
long col_delta = 0;
off_t mark1, mark2;
long c1, c2;
@ -2349,7 +2349,7 @@ edit_block_copy_cmd (WEdit * edit)
edit_scroll_screen_over_cursor (edit);
if (edit->column_highlight)
edit_set_markers (edit, edit->curs1, mark2, c1, c2);
edit_set_markers (edit, edit->buffer.curs1, mark2, c1, c2);
else if (start_mark < current && end_mark > current)
edit_set_markers (edit, start_mark, end_mark + end_mark - start_mark, 0, 0);
@ -2369,7 +2369,7 @@ edit_block_move_cmd (WEdit * edit)
if (eval_marks (edit, &start_mark, &end_mark))
return;
if (!edit->column_highlight && edit->curs1 > start_mark && edit->curs1 < end_mark)
if (!edit->column_highlight && edit->buffer.curs1 > start_mark && edit->buffer.curs1 < end_mark)
return;
if (edit->mark2 < 0)
@ -2393,10 +2393,10 @@ edit_block_move_cmd (WEdit * edit)
x2 = x + edit->over_col;
/* do nothing when cursor inside first line of selected area */
if ((edit_eol (edit, edit->curs1) == edit_eol (edit, start_mark)) && x2 > c1 && x2 <= c2)
if ((edit_eol (edit, edit->buffer.curs1) == edit_eol (edit, start_mark)) && x2 > c1 && x2 <= c2)
return;
if (edit->curs1 > start_mark && edit->curs1 < edit_eol (edit, end_mark))
if (edit->buffer.curs1 > start_mark && edit->buffer.curs1 < edit_eol (edit, end_mark))
{
if (x > c2)
x -= b_width;
@ -2411,8 +2411,8 @@ edit_block_move_cmd (WEdit * edit)
edit->over_col = max (0, edit->over_col - b_width);
/* calculate the cursor pos after delete block */
current = edit_move_forward3 (edit, edit_bol (edit, edit->curs1), x, 0);
edit_cursor_move (edit, current - edit->curs1);
current = edit_move_forward3 (edit, edit_bol (edit, edit->buffer.curs1), x, 0);
edit_cursor_move (edit, current - edit->buffer.curs1);
edit_scroll_screen_over_cursor (edit);
/* add TWS if need before block insertion */
@ -2426,9 +2426,9 @@ edit_block_move_cmd (WEdit * edit)
{
off_t count, count_orig;
current = edit->curs1;
current = edit->buffer.curs1;
copy_buf = g_malloc0 (end_mark - start_mark);
edit_cursor_move (edit, start_mark - edit->curs1);
edit_cursor_move (edit, start_mark - edit->buffer.curs1);
edit_scroll_screen_over_cursor (edit);
for (count = start_mark; count < end_mark; count++)
@ -2436,14 +2436,14 @@ edit_block_move_cmd (WEdit * edit)
edit_scroll_screen_over_cursor (edit);
edit_cursor_move (edit,
current - edit->curs1 -
(((current - edit->curs1) > 0) ? end_mark - start_mark : 0));
current - edit->buffer.curs1 -
(((current - edit->buffer.curs1) > 0) ? end_mark - start_mark : 0));
edit_scroll_screen_over_cursor (edit);
count_orig = count;
while (count-- > start_mark)
edit_insert_ahead (edit, copy_buf[end_mark - count - 1]);
edit_set_markers (edit, edit->curs1, edit->curs1 + end_mark - start_mark, 0, 0);
edit_set_markers (edit, edit->buffer.curs1, edit->buffer.curs1 + end_mark - start_mark, 0, 0);
/* Place cursor at the end of text selection */
if (option_cursor_after_inserted_block)
@ -2545,7 +2545,7 @@ edit_replace_cmd (WEdit * edit, int again)
edit->search = mc_search_new (input1, -1);
if (edit->search == NULL)
{
edit->search_start = edit->curs1;
edit->search_start = edit->buffer.curs1;
goto cleanup;
}
edit->search->search_type = edit_search_options.type;
@ -2591,7 +2591,7 @@ edit_replace_cmd (WEdit * edit, int again)
edit->found_start = edit->search_start;
i = edit->found_len = len;
edit_cursor_move (edit, edit->search_start - edit->curs1);
edit_cursor_move (edit, edit->search_start - edit->buffer.curs1);
edit_scroll_screen_over_cursor (edit);
if (edit->replace_mode == 0)
@ -2673,7 +2673,7 @@ edit_replace_cmd (WEdit * edit, int again)
else
{
/* try and find from right here for next search */
edit->search_start = edit->curs1;
edit->search_start = edit->buffer.curs1;
edit_update_curs_col (edit);
edit->force |= REDRAW_PAGE;
@ -3525,7 +3525,7 @@ edit_suggest_current_word (WEdit * edit)
char *match_word;
/* search start of word to spell check */
match_word = edit_get_word_from_pos (edit, edit->curs1, &word_start, &word_len, &cut_len);
match_word = edit_get_word_from_pos (edit, edit->buffer.curs1, &word_start, &word_len, &cut_len);
#ifdef HAVE_CHARSET
if (mc_global.source_codepage >= 0 && (mc_global.source_codepage != mc_global.display_codepage))
@ -3600,7 +3600,7 @@ edit_spellcheck_file (WEdit * edit)
{
if (edit->curs_line > 0)
{
edit_cursor_move (edit, -edit->curs1);
edit_cursor_move (edit, -edit->buffer.curs1);
edit_move_to_prev_col (edit, 0);
edit_update_curs_row (edit);
}
@ -3609,16 +3609,16 @@ edit_spellcheck_file (WEdit * edit)
{
int c1, c2;
c2 = edit_get_byte (edit, edit->curs1);
c2 = edit_get_byte (edit, edit->buffer.curs1);
do
{
if (edit->curs1 >= edit->last_byte)
if (edit->buffer.curs1 >= edit->last_byte)
return;
c1 = c2;
edit_cursor_move (edit, 1);
c2 = edit_get_byte (edit, edit->curs1);
c2 = edit_get_byte (edit, edit->buffer.curs1);
}
while (is_break_char (c1) || is_break_char (c2));
}

Просмотреть файл

@ -7,7 +7,7 @@
Written by:
Paul Sheer, 1996, 1997
Andrew Borodin <aborodin@vmail.ru> 2012
Andrew Borodin <aborodin@vmail.ru> 2012, 2013
Slava Zanko <slavazanko@gmail.com>, 2013
This file is part of the Midnight Commander.
@ -114,7 +114,7 @@ status_string (WEdit * edit, char *s, int w)
* otherwise print the current character as is (if printable),
* as decimal and as hex.
*/
if (edit->curs1 < edit->last_byte)
if (edit->buffer.curs1 < edit->last_byte)
{
#ifdef HAVE_CHARSET
if (edit->utf8)
@ -122,7 +122,7 @@ status_string (WEdit * edit, char *s, int w)
unsigned int cur_utf = 0;
int cw = 1;
cur_utf = edit_get_utf (edit, edit->curs1, &cw);
cur_utf = edit_get_utf (edit, edit->buffer.curs1, &cw);
if (cw > 0)
{
g_snprintf (byte_str, sizeof (byte_str), "%04d 0x%03X",
@ -130,7 +130,7 @@ status_string (WEdit * edit, char *s, int w)
}
else
{
cur_utf = edit_get_byte (edit, edit->curs1);
cur_utf = edit_get_byte (edit, edit->buffer.curs1);
g_snprintf (byte_str, sizeof (byte_str), "%04d 0x%03X",
(int) cur_utf, (unsigned) cur_utf);
}
@ -140,7 +140,7 @@ status_string (WEdit * edit, char *s, int w)
{
unsigned char cur_byte = 0;
cur_byte = edit_get_byte (edit, edit->curs1);
cur_byte = edit_get_byte (edit, edit->buffer.curs1);
g_snprintf (byte_str, sizeof (byte_str), "%4d 0x%03X",
(int) cur_byte, (unsigned) cur_byte);
}
@ -160,7 +160,7 @@ status_string (WEdit * edit, char *s, int w)
edit->overwrite == 0 ? '-' : 'O',
edit->curs_col + edit->over_col,
edit->curs_line + 1,
edit->total_lines + 1, (long) edit->curs1, (long) edit->last_byte, byte_str,
edit->total_lines + 1, (long) edit->buffer.curs1, (long) edit->last_byte, byte_str,
#ifdef HAVE_CHARSET
mc_global.source_codepage >= 0 ? get_codepage_id (mc_global.source_codepage) :
#endif
@ -176,7 +176,7 @@ status_string (WEdit * edit, char *s, int w)
edit->start_line + 1,
edit->curs_row,
edit->curs_line + 1,
edit->total_lines + 1, (long) edit->curs1, (long) edit->last_byte, byte_str,
edit->total_lines + 1, (long) edit->buffer.curs1, (long) edit->last_byte, byte_str,
#ifdef HAVE_CHARSET
mc_global.source_codepage >= 0 ? get_codepage_id (mc_global.source_codepage) :
#endif
@ -292,7 +292,7 @@ edit_status_window (WEdit * edit)
edit_move (2, w->lines - 1);
tty_printf ("%3ld %5ld/%ld %6ld/%ld",
edit->curs_col + edit->over_col,
edit->curs_line + 1, edit->total_lines + 1, edit->curs1, edit->last_byte);
edit->curs_line + 1, edit->total_lines + 1, edit->buffer.curs1, edit->last_byte);
}
/*
@ -303,7 +303,7 @@ edit_status_window (WEdit * edit)
if (cols > 46)
{
edit_move (32, w->lines - 1);
if (edit->curs1 >= edit->last_byte)
if (edit->buffer.curs1 >= edit->last_byte)
tty_print_string ("[<EOF> ]");
#ifdef HAVE_CHARSET
else if (edit->utf8)
@ -311,9 +311,9 @@ edit_status_window (WEdit * edit)
unsigned int cur_utf;
int cw = 1;
cur_utf = edit_get_utf (edit, edit->curs1, &cw);
cur_utf = edit_get_utf (edit, edit->buffer.curs1, &cw);
if (cw <= 0)
cur_utf = edit_get_byte (edit, edit->curs1);
cur_utf = edit_get_byte (edit, edit->buffer.curs1);
tty_printf ("[%05d 0x%04X]", cur_utf, cur_utf);
}
#endif
@ -321,7 +321,7 @@ edit_status_window (WEdit * edit)
{
unsigned char cur_byte;
cur_byte = edit_get_byte (edit, edit->curs1);
cur_byte = edit_get_byte (edit, edit->buffer.curs1);
tty_printf ("[%05d 0x%04X]", (unsigned int) cur_byte, (unsigned int) cur_byte);
}
}
@ -583,7 +583,7 @@ edit_draw_this_line (WEdit * edit, off_t b, long row, long start_col, long end_c
p->ch = 0;
p->style = 0;
if (q == edit->curs1)
if (q == edit->buffer.curs1)
p->style |= MOD_CURSOR;
if (q >= m1 && q < m2)
{
@ -935,7 +935,7 @@ render_edit_text (WEdit * edit, long start_row, long start_column, long end_row,
}
/* if (force & REDRAW_LINE) ---> default */
b = edit_bol (edit, edit->curs1);
b = edit_bol (edit, edit->buffer.curs1);
if (curs_row >= start_row && curs_row <= end_row)
{
if (key_pending (edit))
@ -960,7 +960,7 @@ render_edit_text (WEdit * edit, long start_row, long start_column, long end_row,
if ((force & REDRAW_LINE_ABOVE) != 0 && curs_row >= 1)
{
row = curs_row - 1;
b = edit_move_backward (edit, edit_bol (edit, edit->curs1), 1);
b = edit_move_backward (edit, edit_bol (edit, edit->buffer.curs1), 1);
if (row >= start_row && row <= end_row)
{
if (key_pending (edit))
@ -972,7 +972,7 @@ render_edit_text (WEdit * edit, long start_row, long start_column, long end_row,
if ((force & REDRAW_LINE_BELOW) != 0 && row < w->lines - 1)
{
row = curs_row + 1;
b = edit_bol (edit, edit->curs1);
b = edit_bol (edit, edit->buffer.curs1);
b = edit_move_forward (edit, b, 1, 0);
if (row >= start_row && row <= end_row)
{
@ -987,18 +987,18 @@ render_edit_text (WEdit * edit, long start_row, long start_column, long end_row,
{
/* with the new text highlighting, we must draw from the top down */
edit_draw_this_char (edit, prev_curs, prev_curs_row, start_column, end_column);
edit_draw_this_char (edit, edit->curs1, edit->curs_row, start_column, end_column);
edit_draw_this_char (edit, edit->buffer.curs1, edit->curs_row, start_column, end_column);
}
else
{
edit_draw_this_char (edit, edit->curs1, edit->curs_row, start_column, end_column);
edit_draw_this_char (edit, edit->buffer.curs1, edit->curs_row, start_column, end_column);
edit_draw_this_char (edit, prev_curs, prev_curs_row, start_column, end_column);
}
edit->force = 0;
prev_curs_row = edit->curs_row;
prev_curs = edit->curs1;
prev_curs = edit->buffer.curs1;
}
/* --------------------------------------------------------------------------------------------- */

Просмотреть файл

@ -529,8 +529,8 @@ edit_event (Gpm_Event * event, void *data)
edit->prev_col = local.x - edit->start_col - option_line_state_width - 1;
else
{
long line_len = edit_move_forward3 (edit, edit_bol (edit, edit->curs1), 0,
edit_eol (edit, edit->curs1));
long line_len = edit_move_forward3 (edit, edit_bol (edit, edit->buffer.curs1), 0,
edit_eol (edit, edit->buffer.curs1));
if (local.x > line_len)
{
@ -552,7 +552,7 @@ edit_event (Gpm_Event * event, void *data)
else if (local.y < (edit->curs_row + 1))
edit_move_up (edit, (edit->curs_row + 1) - local.y, 0);
else
edit_move_to_prev_col (edit, edit_bol (edit, edit->curs1));
edit_move_to_prev_col (edit, edit_bol (edit, edit->buffer.curs1));
if ((local.type & GPM_DOWN) != 0)
{

Просмотреть файл

@ -9,6 +9,7 @@
#include "lib/widget.h" /* Widget */
#include "edit-impl.h"
#include "editbuffer.h"
/*** typedefs(not structures) and defined constants **********************************************/
@ -74,10 +75,7 @@ struct WEdit
vfs_path_t *dir_vpath; /* NULL if filename is absolute */
/* dynamic buffers and cursor position for editor: */
off_t curs1; /* position of the cursor from the beginning of the file. */
off_t curs2; /* position from the end of the file */
unsigned char *buffers1[MAXBUFF + 1]; /* all data up to curs1 */
unsigned char *buffers2[MAXBUFF + 1]; /* all data from end of file down to curs2 */
edit_buffer_t buffer;
#ifdef HAVE_CHARSET
/* multibyte support */

Просмотреть файл

@ -2,13 +2,14 @@
Word-processor mode for the editor: does dynamic
paragraph formatting.
Copyright (C) 2011
Copyright (C) 2011, 2013
The Free Software Foundation, Inc.
Copyright (C) 1996 Paul Sheer
Writen by:
Paul Sheer, 1996
Andrew Borodin <aborodin@vmail.ru>, 2013
This file is part of the Midnight Commander.
@ -30,6 +31,8 @@
* \brief Source: word-processor mode for the editor: does dynamic paragraph formatting
* \author Paul Sheer
* \date 1996
* \author Andrew Borodin
* \date 2013
*/
#include <config.h>
@ -75,7 +78,7 @@ line_start (WEdit * edit, long line)
long l;
l = edit->curs_line;
p = edit->curs1;
p = edit->buffer.curs1;
if (line < l)
p = edit_move_backward (edit, p, l - line);
@ -140,7 +143,7 @@ begin_paragraph (WEdit * edit, int force)
}
}
}
return edit_move_backward (edit, edit_bol (edit, edit->curs1), edit->curs_line - i);
return edit_move_backward (edit, edit_bol (edit, edit->buffer.curs1), edit->curs_line - i);
}
/* --------------------------------------------------------------------------------------------- */
@ -168,7 +171,7 @@ end_paragraph (WEdit * edit, int force)
}
}
return edit_eol (edit,
edit_move_forward (edit, edit_bol (edit, edit->curs1),
edit_move_forward (edit, edit_bol (edit, edit->buffer.curs1),
i - edit->curs_line, 0));
}
@ -346,7 +349,7 @@ format_this (unsigned char *t, int size, int indent)
static inline void
replace_at (WEdit * edit, long q, int c)
{
edit_cursor_move (edit, q - edit->curs1);
edit_cursor_move (edit, q - edit->buffer.curs1);
edit_delete (edit, TRUE);
edit_insert_ahead (edit, c);
}
@ -360,7 +363,7 @@ put_paragraph (WEdit * edit, unsigned char *t, off_t p, int indent, int size)
long cursor;
int i, c = 0;
cursor = edit->curs1;
cursor = edit->buffer.curs1;
if (indent)
while (strchr ("\t ", edit_get_byte (edit, p)))
p++;
@ -376,30 +379,30 @@ put_paragraph (WEdit * edit, unsigned char *t, off_t p, int indent, int size)
else if (t[i - 1] == '\n')
{
off_t curs;
edit_cursor_move (edit, p - edit->curs1);
curs = edit->curs1;
edit_cursor_move (edit, p - edit->buffer.curs1);
curs = edit->buffer.curs1;
edit_insert_indent (edit, indent);
if (cursor >= curs)
cursor += edit->curs1 - p;
p = edit->curs1;
cursor += edit->buffer.curs1 - p;
p = edit->buffer.curs1;
}
else if (c == '\n')
{
edit_cursor_move (edit, p - edit->curs1);
edit_cursor_move (edit, p - edit->buffer.curs1);
while (strchr ("\t ", edit_get_byte (edit, p)))
{
edit_delete (edit, TRUE);
if (cursor > edit->curs1)
if (cursor > edit->buffer.curs1)
cursor--;
}
p = edit->curs1;
p = edit->buffer.curs1;
}
}
c = edit_get_byte (edit, p);
if (c != t[i])
replace_at (edit, p, t[i]);
}
edit_cursor_move (edit, cursor - edit->curs1); /* restore cursor position */
edit_cursor_move (edit, cursor - edit->buffer.curs1); /* restore cursor position */
}
/* --------------------------------------------------------------------------------------------- */