diff --git a/src/editor/Makefile.am b/src/editor/Makefile.am index 0f03de1de..0ca0fc5c5 100644 --- a/src/editor/Makefile.am +++ b/src/editor/Makefile.am @@ -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 \ diff --git a/src/editor/edit-impl.h b/src/editor/edit-impl.h index a2f5a9308..ae6aa555c 100644 --- a/src/editor/edit-impl.h +++ b/src/editor/edit-impl.h @@ -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 diff --git a/src/editor/edit.c b/src/editor/edit.c index 78cb6a965..d5d0403fe 100644 --- a/src/editor/edit.c +++ b/src/editor/edit.c @@ -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); diff --git a/src/editor/editbuffer.c b/src/editor/editbuffer.c new file mode 100644 index 000000000..0a6c7b553 --- /dev/null +++ b/src/editor/editbuffer.c @@ -0,0 +1,87 @@ +/* + Editor text keep buffer. + + Copyright (C) 2013 + The Free Software Foundation, Inc. + + Written by: + Andrew Borodin 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 . + */ + +/** \file + * \brief Source: editor text keep buffer. + * \author Andrew Borodin + * \date 2013 + */ + +#include + +#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 ****************************************************************************/ +/* --------------------------------------------------------------------------------------------- */ diff --git a/src/editor/editbuffer.h b/src/editor/editbuffer.h new file mode 100644 index 000000000..168092654 --- /dev/null +++ b/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 */ diff --git a/src/editor/editcmd.c b/src/editor/editcmd.c index 31920bc3b..c6c103bc4 100644 --- a/src/editor/editcmd.c +++ b/src/editor/editcmd.c @@ -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)); } diff --git a/src/editor/editdraw.c b/src/editor/editdraw.c index 30439c8f7..b89fa0668 100644 --- a/src/editor/editdraw.c +++ b/src/editor/editdraw.c @@ -7,7 +7,7 @@ Written by: Paul Sheer, 1996, 1997 - Andrew Borodin 2012 + Andrew Borodin 2012, 2013 Slava Zanko , 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 ("[ ]"); #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; } /* --------------------------------------------------------------------------------------------- */ diff --git a/src/editor/editwidget.c b/src/editor/editwidget.c index 46b79aa1c..7197fbc08 100644 --- a/src/editor/editwidget.c +++ b/src/editor/editwidget.c @@ -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) { diff --git a/src/editor/editwidget.h b/src/editor/editwidget.h index 39017a268..1f62827a6 100644 --- a/src/editor/editwidget.h +++ b/src/editor/editwidget.h @@ -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 */ diff --git a/src/editor/wordproc.c b/src/editor/wordproc.c index aa36d2850..0dfcc98cf 100644 --- a/src/editor/wordproc.c +++ b/src/editor/wordproc.c @@ -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 , 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 @@ -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 */ } /* --------------------------------------------------------------------------------------------- */