Browse Source

Refactoring of functions that operate with editor buffer.

Signed-off-by: Andrew Borodin <aborodin@vmail.ru>
Andrew Borodin 12 years ago
parent
commit
25924c77d9
7 changed files with 226 additions and 189 deletions
  1. 0 4
      src/editor/edit-impl.h
  2. 34 108
      src/editor/edit.c
  3. 106 0
      src/editor/editbuffer.c
  4. 5 0
      src/editor/editbuffer.h
  5. 55 53
      src/editor/editcmd.c
  6. 8 7
      src/editor/editdraw.c
  7. 18 17
      src/editor/wordproc.c

+ 0 - 4
src/editor/edit-impl.h

@@ -153,9 +153,7 @@ void edit_menu_cmd (WDialog * h);
 void user_menu (WEdit * edit, const char *menu_file, int selected_entry);
 void edit_init_menu (struct WMenuBar *menubar);
 void edit_save_mode_cmd (void);
-off_t edit_move_forward (const WEdit * edit, off_t current, long lines, off_t upto);
 off_t edit_move_forward3 (const WEdit * edit, off_t current, long cols, off_t upto);
-off_t edit_move_backward (const WEdit * edit, off_t current, long lines);
 void edit_scroll_screen_over_cursor (WEdit * edit);
 void edit_render_keypress (WEdit * edit);
 void edit_scroll_upward (WEdit * edit, long i);
@@ -221,8 +219,6 @@ gboolean edit_save_block (WEdit * edit, const char *filename, off_t start, off_t
 gboolean edit_save_block_cmd (WEdit * edit);
 gboolean edit_insert_file_cmd (WEdit * edit);
 
-char *edit_get_word_from_pos (const WEdit * edit, off_t start_pos, off_t * start, gsize * len,
-                              gsize * cut);
 off_t edit_insert_file (WEdit * edit, const vfs_path_t * filename_vpath);
 gboolean edit_load_back_cmd (WEdit * edit);
 gboolean edit_load_forward_cmd (WEdit * edit);

+ 34 - 108
src/editor/edit.c

@@ -145,7 +145,7 @@ static const struct edit_filters
  */
 
 static gboolean
-edit_load_file_fast (WEdit * edit, const vfs_path_t * filename_vpath)
+edit_load_file_fast (edit_buffer_t * buf, const vfs_path_t * filename_vpath)
 {
     int file;
     gboolean ret;
@@ -162,9 +162,9 @@ edit_load_file_fast (WEdit * edit, const vfs_path_t * filename_vpath)
         return FALSE;
     }
 
-    ret = (edit_buffer_read_file (&edit->buffer, file, edit->buffer.size) == edit->buffer.size);
+    ret = (edit_buffer_read_file (buf, file, buf->size) == buf->size);
     if (ret)
-        edit->buffer.lines = edit_buffer_count_lines (&edit->buffer, 0, edit->buffer.size);
+        buf->lines = edit_buffer_count_lines (buf, 0, buf->size);
     else
     {
         gchar *errmsg;
@@ -362,7 +362,7 @@ edit_load_file (WEdit * edit)
     {
         edit_buffer_init (&edit->buffer, edit->stat1.st_size);
 
-        if (!edit_load_file_fast (edit, edit->filename_vpath))
+        if (!edit_load_file_fast (&edit->buffer, edit->filename_vpath))
         {
             edit_clean (edit);
             return FALSE;
@@ -563,12 +563,12 @@ edit_modification (WEdit * edit)
  */
 
 static gboolean
-is_in_indent (const WEdit * edit)
+is_in_indent (const edit_buffer_t * buf)
 {
     off_t p;
 
-    for (p = edit_buffer_get_current_bol (&edit->buffer); p < edit->buffer.curs1; p++)
-        if (strchr (" \t", edit_buffer_get_byte (&edit->buffer, p)) == NULL)
+    for (p = edit_buffer_get_current_bol (buf); p < buf->curs1; p++)
+        if (strchr (" \t", edit_buffer_get_byte (buf, p)) == NULL)
             return FALSE;
 
     return TRUE;
@@ -584,16 +584,17 @@ is_in_indent (const WEdit * edit)
  */
 
 static gboolean
-is_blank (const WEdit * edit, off_t offset)
+is_blank (const edit_buffer_t * buf, off_t offset)
 {
     off_t s, f;
-    int c;
 
-    s = edit_buffer_get_bol (&edit->buffer, offset);
-    f = edit_buffer_get_eol (&edit->buffer, offset) - 1;
+    s = edit_buffer_get_bol (buf, offset);
+    f = edit_buffer_get_eol (buf, offset) - 1;
     while (s <= f)
     {
-        c = edit_buffer_get_byte (&edit->buffer, s++);
+        int c;
+
+        c = edit_buffer_get_byte (buf, s++);
         if (!isspace (c))
             return FALSE;
     }
@@ -644,10 +645,12 @@ edit_find_line (WEdit * edit, long line)
         i = 3 + (rand () % (N_LINE_CACHES - 3));
     if (line > edit->line_numbers[j])
         edit->line_offsets[i] =
-            edit_move_forward (edit, edit->line_offsets[j], line - edit->line_numbers[j], 0);
+            edit_buffer_move_forward (&edit->buffer, edit->line_offsets[j],
+                                      line - edit->line_numbers[j], 0);
     else
         edit->line_offsets[i] =
-            edit_move_backward (edit, edit->line_offsets[j], edit->line_numbers[j] - line);
+            edit_buffer_move_backward (&edit->buffer, edit->line_offsets[j],
+                                       edit->line_numbers[j] - line);
     edit->line_numbers[i] = line;
     return edit->line_offsets[i];
 }
@@ -965,14 +968,11 @@ edit_left_char_move_cmd (WEdit * edit)
             cw = 1;
     }
 #endif
+
     if (option_cursor_beyond_eol && edit->over_col > 0)
-    {
         edit->over_col--;
-    }
     else
-    {
         edit_cursor_move (edit, -cw);
-    }
 }
 
 /* --------------------------------------------------------------------------------------------- */
@@ -1003,7 +1003,8 @@ edit_move_updown (WEdit * edit, long lines, gboolean do_scroll, gboolean directi
             edit_scroll_downward (edit, lines);
     }
     p = edit_buffer_get_current_bol (&edit->buffer);
-    p = direction ? edit_move_backward (edit, p, lines) : edit_move_forward (edit, p, lines, 0);
+    p = direction ? edit_buffer_move_backward (&edit->buffer, p, lines) :
+                    edit_buffer_move_forward (&edit->buffer, p, lines, 0);
     edit_cursor_move (edit, p - edit->buffer.curs1);
     edit_move_to_prev_col (edit, p);
 
@@ -1308,7 +1309,7 @@ edit_auto_indent (WEdit * edit)
 
     p = edit->buffer.curs1;
     /* use the previous line as a template */
-    p = edit_move_backward (edit, p, 1);
+    p = edit_buffer_move_backward (&edit->buffer, p, 1);
     /* copy the leading whitespace of the line */
     while (TRUE)
     {                           /* no range check - the line _is_ \n-terminated */
@@ -1359,7 +1360,7 @@ insert_spaces_tab (WEdit * edit, gboolean half)
 static inline void
 edit_tab_cmd (WEdit * edit)
 {
-    if (option_fake_half_tabs && is_in_indent (edit))
+    if (option_fake_half_tabs && is_in_indent (&edit->buffer))
     {
         /* insert a half tab (usually four spaces) unless there is a
            half tab already behind, then delete it and insert a
@@ -1850,43 +1851,6 @@ is_break_char (char c)
     return (isspace (c) || strchr ("{}[]()<>=|/\\!?~-+`'\",.;:#$%^&*", c));
 }
 
-/* --------------------------------------------------------------------------------------------- */
-
-char *
-edit_get_word_from_pos (const WEdit * edit, off_t start_pos, off_t * start, gsize * len,
-                        gsize * cut)
-{
-    off_t word_start;
-    long cut_len = 0;
-    GString *match_expr;
-    int c1, c2;
-
-    for (word_start = start_pos; word_start != 0; word_start--, cut_len++)
-    {
-        c1 = edit_buffer_get_byte (&edit->buffer, word_start);
-        c2 = edit_buffer_get_byte (&edit->buffer, word_start - 1);
-
-        if (is_break_char (c1) != is_break_char (c2) || c1 == '\n' || c2 == '\n')
-            break;
-    }
-
-    match_expr = g_string_sized_new (16);
-
-    do
-    {
-        c1 = edit_buffer_get_byte (&edit->buffer, word_start + match_expr->len);
-        c2 = edit_buffer_get_byte (&edit->buffer, word_start + match_expr->len + 1);
-        g_string_append_c (match_expr, c1);
-    }
-    while (!(is_break_char (c1) != is_break_char (c2) || c1 == '\n' || c2 == '\n'));
-
-    *len = match_expr->len;
-    *start = word_start;
-    *cut = cut_len;
-
-    return g_string_free (match_expr, FALSE);
-}
-
 /* --------------------------------------------------------------------------------------------- */
 /** inserts a file at the cursor, returns count of inserted bytes on success */
 
@@ -2226,7 +2190,6 @@ edit_set_codeset (WEdit * edit)
 }
 #endif
 
-
 /* --------------------------------------------------------------------------------------------- */
 
 /**
@@ -2360,6 +2323,8 @@ edit_push_undo_action (WEdit * edit, long c)
     }
 }
 
+/* --------------------------------------------------------------------------------------------- */
+
 void
 edit_push_redo_action (WEdit * edit, long c)
 {
@@ -2708,46 +2673,6 @@ edit_cursor_move (WEdit * edit, off_t increment)
     }
 }
 
-/* --------------------------------------------------------------------------------------------- */
-/* If lines is zero this returns the count of lines from current to upto. */
-/* If upto is zero returns index of lines forward current. */
-
-off_t
-edit_move_forward (const WEdit * edit, off_t current, long lines, off_t upto)
-{
-    if (upto != 0)
-        return (off_t) edit_buffer_count_lines (&edit->buffer, current, upto);
-    else
-    {
-        long next;
-        if (lines < 0)
-            lines = 0;
-        while (lines-- != 0)
-        {
-            next = edit_buffer_get_eol (&edit->buffer, current) + 1;
-            if (next > edit->buffer.size)
-                break;
-            else
-                current = next;
-        }
-        return current;
-    }
-}
-
-/* --------------------------------------------------------------------------------------------- */
-/** Returns offset of 'lines' lines up from current */
-
-off_t
-edit_move_backward (const WEdit * edit, off_t current, long lines)
-{
-    if (lines < 0)
-        lines = 0;
-    current = edit_buffer_get_bol (&edit->buffer, current);
-    while (lines-- != 0 && current != 0)
-        current = edit_buffer_get_bol (&edit->buffer, current - 1);
-    return current;
-}
-
 /* --------------------------------------------------------------------------------------------- */
 /* If cols is zero this returns the count of columns from current to upto. */
 /* If upto is zero returns index of cols across from current. */
@@ -2869,7 +2794,7 @@ edit_scroll_upward (WEdit * edit, long i)
     if (i != 0)
     {
         edit->start_line -= i;
-        edit->start_display = edit_move_backward (edit, edit->start_display, i);
+        edit->start_display = edit_buffer_move_backward (&edit->buffer, edit->start_display, i);
         edit->force |= REDRAW_PAGE;
         edit->force &= (0xfff - REDRAW_CHAR_ONLY);
     }
@@ -2890,7 +2815,7 @@ edit_scroll_downward (WEdit * edit, long i)
         if (i > lines_below)
             i = lines_below;
         edit->start_line += i;
-        edit->start_display = edit_move_forward (edit, edit->start_display, i, 0);
+        edit->start_display = edit_buffer_move_forward (&edit->buffer, edit->start_display, i, 0);
         edit->force |= REDRAW_PAGE;
         edit->force &= (0xfff - REDRAW_CHAR_ONLY);
     }
@@ -2956,7 +2881,7 @@ edit_move_to_prev_col (WEdit * edit, off_t p)
     else
     {
         edit->over_col = 0;
-        if (option_fake_half_tabs && is_in_indent (edit))
+        if (option_fake_half_tabs && is_in_indent (&edit->buffer))
         {
             long fake_half_tabs;
 
@@ -2991,7 +2916,7 @@ edit_move_to_prev_col (WEdit * edit, off_t p)
 gboolean
 edit_line_is_blank (WEdit * edit, long line)
 {
-    return is_blank (edit, edit_find_line (edit, line));
+    return is_blank (&edit->buffer, edit_find_line (edit, line));
 }
 
 /* --------------------------------------------------------------------------------------------- */
@@ -3442,13 +3367,14 @@ edit_execute_cmd (WEdit * edit, unsigned long command, int char_for_insertion)
             edit_block_delete_cmd (edit);
         else if (option_cursor_beyond_eol && edit->over_col > 0)
             edit->over_col--;
-        else if (option_backspace_through_tabs && is_in_indent (edit))
+        else if (option_backspace_through_tabs && is_in_indent (&edit->buffer))
         {
             while (edit_buffer_get_previous_byte (&edit->buffer) != '\n'
                 && edit->buffer.curs1 > 0)
                 edit_backspace (edit, TRUE);
         }
-        else if (option_fake_half_tabs && is_in_indent (edit) && right_of_four_spaces (edit))
+        else if (option_fake_half_tabs && is_in_indent (&edit->buffer)
+            && right_of_four_spaces (edit))
         {
             int i;
 
@@ -3467,7 +3393,7 @@ edit_execute_cmd (WEdit * edit, unsigned long command, int char_for_insertion)
             if (option_cursor_beyond_eol && edit->over_col > 0)
                 edit_insert_over (edit);
 
-            if (option_fake_half_tabs && is_in_indent (edit) && left_of_four_spaces (edit))
+            if (option_fake_half_tabs && is_in_indent (&edit->buffer) && left_of_four_spaces (edit))
             {
                 int i;
 
@@ -3533,7 +3459,7 @@ edit_execute_cmd (WEdit * edit, unsigned long command, int char_for_insertion)
         edit->column_highlight = 1;
     case CK_Left:
     case CK_MarkLeft:
-        if (option_fake_half_tabs && is_in_indent (edit) && right_of_four_spaces (edit))
+        if (option_fake_half_tabs && is_in_indent (&edit->buffer) && right_of_four_spaces (edit))
         {
             if (option_cursor_beyond_eol && edit->over_col > 0)
                 edit->over_col--;
@@ -3548,7 +3474,7 @@ edit_execute_cmd (WEdit * edit, unsigned long command, int char_for_insertion)
         edit->column_highlight = 1;
     case CK_Right:
     case CK_MarkRight:
-        if (option_fake_half_tabs && is_in_indent (edit) && left_of_four_spaces (edit))
+        if (option_fake_half_tabs && is_in_indent (&edit->buffer) && left_of_four_spaces (edit))
         {
             edit_cursor_move (edit, HALF_TAB_SIZE);
             edit->force &= (0xFFF - REDRAW_CHAR_ONLY);

+ 106 - 0
src/editor/editbuffer.c

@@ -39,6 +39,7 @@
 
 #include "lib/vfs/vfs.h"
 
+#include "edit-impl.h"
 #include "editbuffer.h"
 
 /* --------------------------------------------------------------------------------------------- */
@@ -373,6 +374,52 @@ edit_buffer_get_eol (const edit_buffer_t * buf, off_t current)
     return current;
 }
 
+/* --------------------------------------------------------------------------------------------- */
+/**
+ * Get word from specified offset.
+ *
+ * @param buf editor buffer
+ * @param current start_pos offset
+ * @param start actual start word ofset
+ * @param cut 
+ *
+ * @return word as newly allocated object
+ */
+
+GString *
+edit_buffer_get_word_from_pos (const edit_buffer_t * buf, off_t start_pos, off_t * start,
+                               gsize * cut)
+{
+    off_t word_start;
+    long cut_len = 0;
+    GString *match_expr;
+    int c1, c2;
+
+    for (word_start = start_pos; word_start != 0; word_start--, cut_len++)
+    {
+        c1 = edit_buffer_get_byte (buf, word_start);
+        c2 = edit_buffer_get_byte (buf, word_start - 1);
+
+        if (is_break_char (c1) != is_break_char (c2) || c1 == '\n' || c2 == '\n')
+            break;
+    }
+
+    match_expr = g_string_sized_new (16);
+
+    do
+    {
+        c1 = edit_buffer_get_byte (buf, word_start + match_expr->len);
+        c2 = edit_buffer_get_byte (buf, word_start + match_expr->len + 1);
+        g_string_append_c (match_expr, c1);
+    }
+    while (!(is_break_char (c1) != is_break_char (c2) || c1 == '\n' || c2 == '\n'));
+
+    *start = word_start;
+    *cut = cut_len;
+
+    return match_expr;
+}
+
 /* --------------------------------------------------------------------------------------------- */
 /**
  * Basic low level single character buffer alterations and movements at the cursor: insert character
@@ -503,6 +550,65 @@ edit_buffer_backspace (edit_buffer_t * buf)
     return c;
 }
 
+
+/* --------------------------------------------------------------------------------------------- */
+/**
+ * Calculate forward offset with specified number of lines.
+ *
+ * @param buf editor buffer
+ * @param current current offset
+ * @param lines number of lines to move forward
+ * @param upto offset to count lines between current and upto.
+ *
+ * @return If lines is zero returns the count of lines from current to upto.
+ *         If upto is zero returns offset of lines forward current.
+ *         Else returns forward offset with specified number of lines
+ */
+
+off_t
+edit_buffer_move_forward (const edit_buffer_t * buf, off_t current, long lines, off_t upto)
+{
+    long next;
+
+    if (upto != 0)
+        return (off_t) edit_buffer_count_lines (buf, current, upto);
+
+    lines = max (lines, 0);
+
+    while (lines-- != 0)
+    {
+        next = edit_buffer_get_eol (buf, current) + 1;
+        if (next > buf->size)
+            break;
+        current = next;
+    }
+
+    return current;
+}
+
+/* --------------------------------------------------------------------------------------------- */
+/**
+ * Calculate backward offset with specified number of lines.
+ *
+ * @param buf editor buffer
+ * @param current current offset
+ * @param lines number of lines to move bacward
+ *
+ * @return backward offset with specified number of lines.
+ */
+
+off_t
+edit_buffer_move_backward (const edit_buffer_t * buf, off_t current, long lines)
+{
+    lines = max (lines, 0);
+    current = edit_buffer_get_bol (buf, current);
+
+    while (lines-- != 0 && current != 0)
+        current = edit_buffer_get_bol (buf, current - 1);
+
+    return current;
+}
+
 /* --------------------------------------------------------------------------------------------- */
 /**
  * Load file into editor buffer

+ 5 - 0
src/editor/editbuffer.h

@@ -64,12 +64,17 @@ int edit_buffer_get_prev_utf (const edit_buffer_t * buf, off_t byte_index, int *
 long edit_buffer_count_lines (const edit_buffer_t * buf, off_t first, off_t last);
 off_t edit_buffer_get_bol (const edit_buffer_t * buf, off_t current);
 off_t edit_buffer_get_eol (const edit_buffer_t * buf, off_t current);
+GString *edit_buffer_get_word_from_pos (const edit_buffer_t * buf, off_t start_pos, off_t * start,
+                                        gsize * cut);
 
 void edit_buffer_insert (edit_buffer_t * buf, int c);
 void edit_buffer_insert_ahead (edit_buffer_t * buf, int c);
 int edit_buffer_delete (edit_buffer_t * buf);
 int edit_buffer_backspace (edit_buffer_t * buf);
 
+off_t edit_buffer_move_forward (const edit_buffer_t * buf, off_t current, long lines, off_t upto);
+off_t edit_buffer_move_backward (const edit_buffer_t * buf, off_t current, long lines);
+
 off_t edit_buffer_read_file (edit_buffer_t * buf, int fd, off_t size);
 off_t edit_buffer_write_file (edit_buffer_t * buf, int fd);
 

+ 55 - 53
src/editor/editcmd.c

@@ -393,13 +393,13 @@ edit_save_file (WEdit * edit, const vfs_path_t * filename_vpath)
 /* --------------------------------------------------------------------------------------------- */
 
 static gboolean
-edit_check_newline (WEdit * edit)
+edit_check_newline (const edit_buffer_t * buf)
 {
-    return !(option_check_nl_at_eof && edit->buffer.size > 0
-             && edit_buffer_get_byte (&edit->buffer, edit->buffer.size - 1) != '\n'
+    return !(option_check_nl_at_eof && buf->size > 0
+             && edit_buffer_get_byte (buf, buf->size - 1) != '\n'
              && edit_query_dialog2 (_("Warning"),
                                     _("The file you are saving is not finished with a newline"),
-                                    _("C&ontinue"), _("&Cancel")));
+                                    _("C&ontinue"), _("&Cancel")) != 0);
 }
 
 /* --------------------------------------------------------------------------------------------- */
@@ -511,7 +511,7 @@ edit_delete_column_of_text (WEdit * edit)
     long b, c, d;
 
     eval_marks (edit, &m1, &m2);
-    n = edit_move_forward (edit, m1, 0, m2) + 1;
+    n = edit_buffer_move_forward (&edit->buffer, m1, 0, m2) + 1;
     c = (long) edit_move_forward3 (edit, edit_buffer_get_bol (&edit->buffer, m1), 0, m1);
     d = (long) edit_move_forward3 (edit, edit_buffer_get_bol (&edit->buffer, m2), 0, m2);
     b = max (min (c, d), min (edit->column1, edit->column2));
@@ -536,7 +536,8 @@ edit_delete_column_of_text (WEdit * edit)
         }
         if (n)
             /* move to next line except on the last delete */
-            edit_cursor_move (edit, edit_move_forward (edit, edit->buffer.curs1, 1, 0) - edit->buffer.curs1);
+            edit_cursor_move (edit, edit_buffer_move_forward (&edit->buffer, edit->buffer.curs1, 1, 0) -
+                              edit->buffer.curs1);
     }
 }
 
@@ -659,7 +660,7 @@ edit_get_search_line_type (mc_search_t * search)
 /**
  * Calculating the start position of next line.
  *
- * @param edit              editor object
+ * @param buf               editor buffer object
  * @param current_pos       current position
  * @param max_pos           max position
  * @param end_string_symbol end of line symbol
@@ -667,7 +668,7 @@ edit_get_search_line_type (mc_search_t * search)
  */
 
 static off_t
-edit_calculate_start_of_next_line (WEdit * edit, off_t current_pos, off_t max_pos,
+edit_calculate_start_of_next_line (const edit_buffer_t * buf, off_t current_pos, off_t max_pos,
                                    char end_string_symbol)
 {
     off_t i;
@@ -675,7 +676,7 @@ edit_calculate_start_of_next_line (WEdit * edit, off_t current_pos, off_t max_po
     for (i = current_pos; i < max_pos; i++)
     {
         current_pos++;
-        if (edit_buffer_get_byte (&edit->buffer, i) == end_string_symbol)
+        if (edit_buffer_get_byte (buf, i) == end_string_symbol)
             break;
     }
 
@@ -686,19 +687,19 @@ edit_calculate_start_of_next_line (WEdit * edit, off_t current_pos, off_t max_po
 /**
  * Calculating the end position of previous line.
  *
- * @param edit              editor object
+ * @param buf               editor buffer object
  * @param current_pos       current position
  * @param end_string_symbol end of line symbol
  * @return end position of previous line
  */
 
 static off_t
-edit_calculate_end_of_previous_line (WEdit * edit, off_t current_pos, char end_string_symbol)
+edit_calculate_end_of_previous_line (const edit_buffer_t * buf, off_t current_pos, char end_string_symbol)
 {
     off_t i;
 
     for (i = current_pos - 1; i >= 0; i--)
-        if (edit_buffer_get_byte (&edit->buffer, i) == end_string_symbol)
+        if (edit_buffer_get_byte (buf, i) == end_string_symbol)
             break;
 
     return i;
@@ -708,17 +709,17 @@ edit_calculate_end_of_previous_line (WEdit * edit, off_t current_pos, char end_s
 /**
  * Calculating the start position of previous line.
  *
- * @param edit              editor object
+ * @param buf               editor buffer object
  * @param current_pos       current position
  * @param end_string_symbol end of line symbol
  * @return start position of previous line
  */
 
 static inline off_t
-edit_calculate_start_of_previous_line (WEdit * edit, off_t current_pos, char end_string_symbol)
+edit_calculate_start_of_previous_line (const edit_buffer_t * buf, off_t current_pos, char end_string_symbol)
 {
-    current_pos = edit_calculate_end_of_previous_line (edit, current_pos, end_string_symbol);
-    current_pos = edit_calculate_end_of_previous_line (edit, current_pos, end_string_symbol);
+    current_pos = edit_calculate_end_of_previous_line (buf, current_pos, end_string_symbol);
+    current_pos = edit_calculate_end_of_previous_line (buf, current_pos, end_string_symbol);
 
     return (current_pos + 1);
 }
@@ -727,16 +728,16 @@ edit_calculate_start_of_previous_line (WEdit * edit, off_t current_pos, char end
 /**
  * Calculating the start position of current line.
  *
- * @param edit              editor object
+ * @param buf               editor buffer object
  * @param current_pos       current position
  * @param end_string_symbol end of line symbol
  * @return start position of current line
  */
 
 static inline off_t
-edit_calculate_start_of_current_line (WEdit * edit, off_t current_pos, char end_string_symbol)
+edit_calculate_start_of_current_line (const edit_buffer_t * buf, off_t current_pos, char end_string_symbol)
 {
-    current_pos = edit_calculate_end_of_previous_line (edit, current_pos, end_string_symbol);
+    current_pos = edit_calculate_end_of_previous_line (buf, current_pos, end_string_symbol);
 
     return (current_pos + 1);
 }
@@ -802,15 +803,13 @@ editcmd_find (WEdit * edit, gsize * len)
             && (start_mark != 0 || edit_buffer_get_byte (&edit->buffer, start_mark - 1) != end_string_symbol))
         {
             start_mark =
-                edit_calculate_start_of_next_line (edit, start_mark, edit->buffer.size,
+                edit_calculate_start_of_next_line (&edit->buffer, start_mark, edit->buffer.size,
                                                    end_string_symbol);
         }
         if ((edit->search_line_type & AT_END_LINE) != 0
             && (end_mark - 1 != edit->buffer.size
                 || edit_buffer_get_byte (&edit->buffer, end_mark) != end_string_symbol))
-        {
-            end_mark = edit_calculate_end_of_previous_line (edit, end_mark, end_string_symbol);
-        }
+            end_mark = edit_calculate_end_of_previous_line (&edit->buffer, end_mark, end_string_symbol);
         if (start_mark >= end_mark)
         {
             edit->search->error = MC_SEARCH_E_NOTFOUND;
@@ -832,7 +831,7 @@ editcmd_find (WEdit * edit, gsize * len)
 
         if ((edit->search_line_type & AT_START_LINE) != 0)
             search_start =
-                edit_calculate_start_of_current_line (edit, search_start, end_string_symbol);
+                edit_calculate_start_of_current_line (&edit->buffer, search_start, end_string_symbol);
 
         while (search_start >= start_mark)
         {
@@ -850,7 +849,7 @@ editcmd_find (WEdit * edit, gsize * len)
 
             if ((edit->search_line_type & AT_START_LINE) != 0)
                 search_start =
-                    edit_calculate_start_of_previous_line (edit, search_start, end_string_symbol);
+                    edit_calculate_start_of_previous_line (&edit->buffer, search_start, end_string_symbol);
             else
                 search_start--;
         }
@@ -861,7 +860,7 @@ editcmd_find (WEdit * edit, gsize * len)
         /* forward search */
         if ((edit->search_line_type & AT_START_LINE) != 0 && search_start != start_mark)
             search_start =
-                edit_calculate_start_of_next_line (edit, search_start, end_mark, end_string_symbol);
+                edit_calculate_start_of_next_line (&edit->buffer, search_start, end_mark, end_string_symbol);
         return mc_search_run (edit->search, (void *) edit, search_start, end_mark, len);
     }
     return FALSE;
@@ -1050,7 +1049,7 @@ edit_save_block_to_clip_file (WEdit * edit, off_t start, off_t finish)
 /* --------------------------------------------------------------------------------------------- */
 
 static void
-pipe_mail (WEdit * edit, char *to, char *subject, char *cc)
+pipe_mail (const edit_buffer_t * buf, char *to, char *subject, char *cc)
 {
     FILE *p = 0;
     char *s;
@@ -1063,17 +1062,18 @@ pipe_mail (WEdit * edit, char *to, char *subject, char *cc)
     g_free (subject);
     g_free (cc);
 
-    if (s)
+    if (s != NULL)
     {
         p = popen (s, "w");
         g_free (s);
     }
 
-    if (p)
+    if (p != NULL)
     {
         off_t i;
-        for (i = 0; i < edit->buffer.size; i++)
-            fputc (edit_buffer_get_byte (&edit->buffer, i), p);
+
+        for (i = 0; i < buf->size; i++)
+            fputc (edit_buffer_get_byte (buf, i), p);
         pclose (p);
     }
 }
@@ -1082,16 +1082,16 @@ pipe_mail (WEdit * edit, char *to, char *subject, char *cc)
 /** find first character of current word */
 
 static gboolean
-edit_find_word_start (WEdit * edit, off_t * word_start, gsize * word_len)
+edit_find_word_start (const edit_buffer_t * buf, off_t * word_start, gsize * word_len)
 {
     int c, last;
     off_t i;
 
     /* return if at begin of file */
-    if (edit->buffer.curs1 <= 0)
+    if (buf->curs1 <= 0)
         return FALSE;
 
-    c = edit_buffer_get_previous_byte (&edit->buffer);
+    c = edit_buffer_get_previous_byte (buf);
     /* return if not at end or in word */
     if (is_break_char (c))
         return FALSE;
@@ -1100,11 +1100,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->buffer.curs1 < i)
+        if (buf->curs1 < i)
             return FALSE;
 
         last = c;
-        c = edit_buffer_get_byte (&edit->buffer, edit->buffer.curs1 - i);
+        c = edit_buffer_get_byte (buf, buf->curs1 - i);
 
         if (is_break_char (c))
         {
@@ -1112,7 +1112,7 @@ edit_find_word_start (WEdit * edit, off_t * word_start, gsize * word_len)
             if (isdigit (last))
                 return FALSE;
 
-            *word_start = edit->buffer.curs1 - (i - 1);        /* start found */
+            *word_start = buf->curs1 - (i - 1);        /* start found */
             *word_len = (gsize) (i - 1);
             break;
         }
@@ -1627,7 +1627,7 @@ edit_save_as_cmd (WEdit * edit)
     int save_lock = 0;
     int different_filename = 0;
 
-    if (!edit_check_newline (edit))
+    if (!edit_check_newline (&edit->buffer))
         return FALSE;
 
     exp_vpath = edit_get_save_file_as (edit);
@@ -2009,7 +2009,7 @@ edit_save_confirm_cmd (WEdit * edit)
     if (edit->filename_vpath == NULL)
         return edit_save_as_cmd (edit);
 
-    if (!edit_check_newline (edit))
+    if (!edit_check_newline (&edit->buffer))
         return FALSE;
 
     if (edit_confirm_save)
@@ -2760,7 +2760,7 @@ edit_ok_to_exit (WEdit * edit)
 
     if (!mc_global.midnight_shutdown)
     {
-        if (!edit_check_newline (edit))
+        if (!edit_check_newline (&edit->buffer))
         {
             g_free (fname);
             return FALSE;
@@ -3230,7 +3230,7 @@ edit_mail_dialog (WEdit * edit)
         mail_cc_last = tmail_cc;
         mail_subject_last = tmail_subject;
         mail_to_last = tmail_to;
-        pipe_mail (edit, mail_to_last, mail_subject_last, mail_cc_last);
+        pipe_mail (&edit->buffer, mail_to_last, mail_subject_last, mail_cc_last);
     }
 }
 
@@ -3254,7 +3254,7 @@ edit_complete_word_cmd (WEdit * edit)
     GString *compl[MAX_WORD_COMPLETIONS];       /* completions */
 
     /* search start of word to be completed */
-    if (!edit_find_word_start (edit, &word_start, &word_len))
+    if (!edit_find_word_start (&edit->buffer, &word_start, &word_len))
         return;
 
     /* prepare match expression */
@@ -3434,7 +3434,7 @@ edit_get_match_keyword_cmd (WEdit * edit)
     }
 
     /* search start of word to be completed */
-    if (!edit_find_word_start (edit, &word_start, &word_len))
+    if (!edit_find_word_start (&edit->buffer, &word_start, &word_len))
         return;
 
     /* prepare match expression */
@@ -3487,29 +3487,31 @@ edit_suggest_current_word (WEdit * edit)
     gsize word_len = 0;
     off_t word_start = 0;
     int retval = B_SKIP_WORD;
-    char *match_word;
+    GString *match_word;
 
     /* search start of word to spell check */
-    match_word = edit_get_word_from_pos (edit, edit->buffer.curs1, &word_start, &word_len, &cut_len);
+    match_word = edit_buffer_get_word_from_pos (&edit->buffer, edit->buffer.curs1, &word_start,
+                                                &cut_len);
+    word_len = match_word->len;
 
 #ifdef HAVE_CHARSET
     if (mc_global.source_codepage >= 0 && (mc_global.source_codepage != mc_global.display_codepage))
     {
         GString *tmp_word;
 
-        tmp_word = str_convert_to_display (match_word);
-        g_free (match_word);
-        match_word = g_string_free (tmp_word, FALSE);
+        tmp_word = str_convert_to_display (match_word->str);
+        g_string_free (match_word, TRUE);
+        match_word = tmp_word;
     }
 #endif
-    if (!aspell_check (match_word, (int) word_len))
+    if (!aspell_check (match_word->str, (int) word_len))
     {
         GArray *suggest;
         unsigned int res;
 
         suggest = g_array_new (TRUE, FALSE, sizeof (char *));
 
-        res = aspell_suggest (suggest, match_word, (int) word_len);
+        res = aspell_suggest (suggest, match_word->str, (int) word_len);
         if (res != 0)
         {
             char *new_word = NULL;
@@ -3520,7 +3522,7 @@ edit_suggest_current_word (WEdit * edit)
             edit_scroll_screen_over_cursor (edit);
             edit_render_keypress (edit);
 
-            retval = spell_dialog_spell_suggest_show (edit, match_word, &new_word, suggest);
+            retval = spell_dialog_spell_suggest_show (edit, match_word->str, &new_word, suggest);
             edit_cursor_move (edit, word_len - cut_len);
 
             if (retval == B_ENTER && new_word != NULL)
@@ -3547,14 +3549,14 @@ edit_suggest_current_word (WEdit * edit)
                 g_free (cp_word);
             }
             else if (retval == B_ADD_WORD && match_word != NULL)
-                aspell_add_to_dict (match_word, (int) word_len);
+                aspell_add_to_dict (match_word->str, (int) word_len);
         }
 
         g_array_free (suggest, TRUE);
         edit->found_start = 0;
         edit->found_len = 0;
     }
-    g_free (match_word);
+    g_string_free (match_word, TRUE);
     return retval;
 }
 

+ 8 - 7
src/editor/editdraw.c

@@ -903,13 +903,13 @@ render_edit_text (WEdit * edit, long start_row, long start_column, long end_row,
         if ((force & REDRAW_PAGE) != 0)
         {
             row = start_row;
-            b = edit_move_forward (edit, edit->start_display, start_row, 0);
+            b = edit_buffer_move_forward (&edit->buffer, edit->start_display, start_row, 0);
             while (row <= end_row)
             {
                 if (key_pending (edit))
                     return;
                 edit_draw_this_line (edit, b, row, start_column, end_column);
-                b = edit_move_forward (edit, b, 1, 0);
+                b = edit_buffer_move_forward (&edit->buffer, b, 1, 0);
                 row++;
             }
         }
@@ -928,7 +928,7 @@ render_edit_text (WEdit * edit, long start_row, long start_column, long end_row,
                     if (key_pending (edit))
                         return;
                     edit_draw_this_line (edit, b, row, start_column, end_column);
-                    b = edit_move_forward (edit, b, 1, 0);
+                    b = edit_buffer_move_forward (&edit->buffer, b, 1, 0);
                 }
             }
 
@@ -944,13 +944,13 @@ render_edit_text (WEdit * edit, long start_row, long start_column, long end_row,
             if ((force & REDRAW_AFTER_CURSOR) != 0 && end_row > curs_row)
             {
                 row = curs_row + 1 < start_row ? start_row : curs_row + 1;
-                b = edit_move_forward (edit, b, 1, 0);
+                b = edit_buffer_move_forward (&edit->buffer, b, 1, 0);
                 while (row <= end_row)
                 {
                     if (key_pending (edit))
                         return;
                     edit_draw_this_line (edit, b, row, start_column, end_column);
-                    b = edit_move_forward (edit, b, 1, 0);
+                    b = edit_buffer_move_forward (&edit->buffer, b, 1, 0);
                     row++;
                 }
             }
@@ -958,7 +958,8 @@ 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_buffer_get_current_bol (&edit->buffer), 1);
+                b = edit_buffer_move_backward (&edit->buffer,
+                                               edit_buffer_get_current_bol (&edit->buffer), 1);
                 if (row >= start_row && row <= end_row)
                 {
                     if (key_pending (edit))
@@ -971,7 +972,7 @@ render_edit_text (WEdit * edit, long start_row, long start_column, long end_row,
             {
                 row = curs_row + 1;
                 b = edit_buffer_get_current_bol (&edit->buffer);
-                b = edit_move_forward (edit, b, 1, 0);
+                b = edit_buffer_move_forward (&edit->buffer, b, 1, 0);
                 if (row >= start_row && row <= end_row)
                 {
                     if (key_pending (edit))

+ 18 - 17
src/editor/wordproc.c

@@ -72,21 +72,21 @@
 /* --------------------------------------------------------------------------------------------- */
 
 static off_t
-line_start (WEdit * edit, long line)
+line_start (const edit_buffer_t * buf, long line)
 {
     off_t p;
     long l;
 
-    l = edit->buffer.curs_line;
-    p = edit->buffer.curs1;
+    l = buf->curs_line;
+    p = buf->curs1;
 
     if (line < l)
-        p = edit_move_backward (edit, p, l - line);
+        p = edit_buffer_move_backward (buf, p, l - line);
     else if (line > l)
-        p = edit_move_forward (edit, p, line - l, 0);
+        p = edit_buffer_move_forward (buf, p, line - l, 0);
 
-    p = edit_buffer_get_bol (&edit->buffer, p);
-    while (strchr ("\t ", edit_buffer_get_byte (&edit->buffer, p)) != NULL)
+    p = edit_buffer_get_bol (buf, p);
+    while (strchr ("\t ", edit_buffer_get_byte (buf, p)) != NULL)
         p++;
     return p;
 }
@@ -94,22 +94,22 @@ line_start (WEdit * edit, long line)
 /* --------------------------------------------------------------------------------------------- */
 
 static gboolean
-bad_line_start (WEdit * edit, off_t p)
+bad_line_start (const edit_buffer_t * buf, off_t p)
 {
     int c;
 
-    c = edit_buffer_get_byte (&edit->buffer, p);
+    c = edit_buffer_get_byte (buf, p);
     if (c == '.')
     {
         /* `...' is acceptable */
-        return !(edit_buffer_get_byte (&edit->buffer, p + 1) == '.'
-                && edit_buffer_get_byte (&edit->buffer, p + 2) == '.');
+        return !(edit_buffer_get_byte (buf, p + 1) == '.'
+                && edit_buffer_get_byte (buf, p + 2) == '.');
     }
     if (c == '-')
     {
         /* `---' is acceptable */
-        return !(edit_buffer_get_byte (&edit->buffer, p + 1) == '-'
-                && edit_buffer_get_byte (&edit->buffer, p + 2) == '-');
+        return !(edit_buffer_get_byte (buf, p + 1) == '-'
+                && edit_buffer_get_byte (buf, p + 2) == '-');
     }
 
     return (strchr (NO_FORMAT_CHARS_START, c) != NULL);
@@ -128,13 +128,14 @@ begin_paragraph (WEdit * edit, gboolean force)
 
     for (i = edit->buffer.curs_line - 1; i >= 0; i--)
         if (edit_line_is_blank (edit, i) ||
-            (force && bad_line_start (edit, line_start (edit, i))))
+            (force && bad_line_start (&edit->buffer, line_start (&edit->buffer, i))))
         {
             i++;
             break;
         }
 
-    return edit_move_backward (edit, edit_buffer_get_current_bol (&edit->buffer), edit->buffer.curs_line - i);
+    return edit_buffer_move_backward (&edit->buffer, edit_buffer_get_current_bol (&edit->buffer),
+                                      edit->buffer.curs_line - i);
 }
 
 /* --------------------------------------------------------------------------------------------- */
@@ -150,14 +151,14 @@ end_paragraph (WEdit * edit, gboolean force)
 
     for (i = edit->buffer.curs_line + 1; i <= edit->buffer.lines; i++)
         if (edit_line_is_blank (edit, i) ||
-            (force && bad_line_start (edit, line_start (edit, i))))
+            (force && bad_line_start (&edit->buffer, line_start (&edit->buffer, i))))
         {
             i--;
             break;
         }
 
     return edit_buffer_get_eol (&edit->buffer,
-                     edit_move_forward (edit, edit_buffer_get_current_bol (&edit->buffer),
+                     edit_buffer_move_forward (&edit->buffer, edit_buffer_get_current_bol (&edit->buffer),
                                         i - edit->buffer.curs_line, 0));
 }