Fix various line length computation issues for the last line
The last line doesn't have EOL characters, so computing (line_length() - eol_length()) is wrong on the last line. Instead, use (line_end_pos() - line_start_pos()) as suggests Scintilla's documentation. Closes PR#124
This commit is contained in:
parent
2cdfeed69e
commit
b1fb2ab053
38
src/editor.c
38
src/editor.c
@ -1555,7 +1555,7 @@ static void close_block(GeanyEditor *editor, gint pos)
|
|||||||
{
|
{
|
||||||
const GeanyIndentPrefs *iprefs = editor_get_indent_prefs(editor);
|
const GeanyIndentPrefs *iprefs = editor_get_indent_prefs(editor);
|
||||||
gint x = 0, cnt = 0;
|
gint x = 0, cnt = 0;
|
||||||
gint line, line_len, eol_char_len;
|
gint line, line_len;
|
||||||
gchar *text, *line_buf;
|
gchar *text, *line_buf;
|
||||||
ScintillaObject *sci;
|
ScintillaObject *sci;
|
||||||
gint line_indent, last_indent;
|
gint line_indent, last_indent;
|
||||||
@ -1570,15 +1570,12 @@ static void close_block(GeanyEditor *editor, gint pos)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
line = sci_get_line_from_position(sci, pos);
|
line = sci_get_line_from_position(sci, pos);
|
||||||
line_len = sci_get_line_length(sci, line);
|
line_len = sci_get_line_end_position(sci, line) - sci_get_position_from_line(sci, line);
|
||||||
/* set eol_char_len to 0 if on last line, because there is no EOL char */
|
|
||||||
eol_char_len = (line == (sci_get_line_count(sci) - 1)) ? 0 :
|
|
||||||
editor_get_eol_char_len(editor);
|
|
||||||
|
|
||||||
/* check that the line is empty, to not kill text in the line */
|
/* check that the line is empty, to not kill text in the line */
|
||||||
line_buf = sci_get_line(sci, line);
|
line_buf = sci_get_line(sci, line);
|
||||||
line_buf[line_len - eol_char_len] = '\0';
|
line_buf[line_len] = '\0';
|
||||||
while (x < (line_len - eol_char_len))
|
while (x < line_len)
|
||||||
{
|
{
|
||||||
if (isspace(line_buf[x]))
|
if (isspace(line_buf[x]))
|
||||||
cnt++;
|
cnt++;
|
||||||
@ -1586,7 +1583,7 @@ static void close_block(GeanyEditor *editor, gint pos)
|
|||||||
}
|
}
|
||||||
g_free(line_buf);
|
g_free(line_buf);
|
||||||
|
|
||||||
if ((line_len - eol_char_len - 1) != cnt)
|
if ((line_len - 1) != cnt)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (iprefs->auto_indent_mode == GEANY_AUTOINDENT_MATCHBRACES)
|
if (iprefs->auto_indent_mode == GEANY_AUTOINDENT_MATCHBRACES)
|
||||||
@ -2923,7 +2920,7 @@ static gint get_multiline_comment_style(GeanyEditor *editor, gint line_start)
|
|||||||
* it returns just 1 */
|
* it returns just 1 */
|
||||||
gint editor_do_uncomment(GeanyEditor *editor, gint line, gboolean toggle)
|
gint editor_do_uncomment(GeanyEditor *editor, gint line, gboolean toggle)
|
||||||
{
|
{
|
||||||
gint first_line, last_line, eol_char_len;
|
gint first_line, last_line;
|
||||||
gint x, i, line_start, line_len;
|
gint x, i, line_start, line_len;
|
||||||
gint sel_start, sel_end;
|
gint sel_start, sel_end;
|
||||||
gint count = 0;
|
gint count = 0;
|
||||||
@ -2953,7 +2950,6 @@ gint editor_do_uncomment(GeanyEditor *editor, gint line, gboolean toggle)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ft = editor_get_filetype_at_line(editor, first_line);
|
ft = editor_get_filetype_at_line(editor, first_line);
|
||||||
eol_char_len = editor_get_eol_char_len(editor);
|
|
||||||
|
|
||||||
if (! filetype_get_comment_open_close(ft, TRUE, &co, &cc))
|
if (! filetype_get_comment_open_close(ft, TRUE, &co, &cc))
|
||||||
return 0;
|
return 0;
|
||||||
@ -2969,10 +2965,10 @@ gint editor_do_uncomment(GeanyEditor *editor, gint line, gboolean toggle)
|
|||||||
gint buf_len;
|
gint buf_len;
|
||||||
|
|
||||||
line_start = sci_get_position_from_line(editor->sci, i);
|
line_start = sci_get_position_from_line(editor->sci, i);
|
||||||
line_len = sci_get_line_length(editor->sci, i);
|
line_len = sci_get_line_end_position(editor->sci, i) - line_start;
|
||||||
x = 0;
|
x = 0;
|
||||||
|
|
||||||
buf_len = MIN((gint)sizeof(sel) - 1, line_len - eol_char_len);
|
buf_len = MIN((gint)sizeof(sel) - 1, line_len);
|
||||||
if (buf_len <= 0)
|
if (buf_len <= 0)
|
||||||
continue;
|
continue;
|
||||||
sci_get_text_range(editor->sci, line_start, line_start + buf_len, sel);
|
sci_get_text_range(editor->sci, line_start, line_start + buf_len, sel);
|
||||||
@ -3050,7 +3046,7 @@ gint editor_do_uncomment(GeanyEditor *editor, gint line, gboolean toggle)
|
|||||||
|
|
||||||
void editor_do_comment_toggle(GeanyEditor *editor)
|
void editor_do_comment_toggle(GeanyEditor *editor)
|
||||||
{
|
{
|
||||||
gint first_line, last_line, eol_char_len;
|
gint first_line, last_line;
|
||||||
gint x, i, line_start, line_len, first_line_start;
|
gint x, i, line_start, line_len, first_line_start;
|
||||||
gint sel_start, sel_end;
|
gint sel_start, sel_end;
|
||||||
gint count_commented = 0, count_uncommented = 0;
|
gint count_commented = 0, count_uncommented = 0;
|
||||||
@ -3067,8 +3063,6 @@ void editor_do_comment_toggle(GeanyEditor *editor)
|
|||||||
sel_start = sci_get_selection_start(editor->sci);
|
sel_start = sci_get_selection_start(editor->sci);
|
||||||
sel_end = sci_get_selection_end(editor->sci);
|
sel_end = sci_get_selection_end(editor->sci);
|
||||||
|
|
||||||
eol_char_len = editor_get_eol_char_len(editor);
|
|
||||||
|
|
||||||
first_line = sci_get_line_from_position(editor->sci, sel_start);
|
first_line = sci_get_line_from_position(editor->sci, sel_start);
|
||||||
/* Find the last line with chars selected (not EOL char) */
|
/* Find the last line with chars selected (not EOL char) */
|
||||||
last_line = sci_get_line_from_position(editor->sci,
|
last_line = sci_get_line_from_position(editor->sci,
|
||||||
@ -3093,10 +3087,10 @@ void editor_do_comment_toggle(GeanyEditor *editor)
|
|||||||
gint buf_len;
|
gint buf_len;
|
||||||
|
|
||||||
line_start = sci_get_position_from_line(editor->sci, i);
|
line_start = sci_get_position_from_line(editor->sci, i);
|
||||||
line_len = sci_get_line_length(editor->sci, i);
|
line_len = sci_get_line_end_position(editor->sci, i) - line_start;
|
||||||
x = 0;
|
x = 0;
|
||||||
|
|
||||||
buf_len = MIN((gint)sizeof(sel) - 1, line_len - eol_char_len);
|
buf_len = MIN((gint)sizeof(sel) - 1, line_len);
|
||||||
if (buf_len < 0)
|
if (buf_len < 0)
|
||||||
continue;
|
continue;
|
||||||
sci_get_text_range(editor->sci, line_start, line_start + buf_len, sel);
|
sci_get_text_range(editor->sci, line_start, line_start + buf_len, sel);
|
||||||
@ -3199,7 +3193,7 @@ void editor_do_comment_toggle(GeanyEditor *editor)
|
|||||||
void editor_do_comment(GeanyEditor *editor, gint line, gboolean allow_empty_lines, gboolean toggle,
|
void editor_do_comment(GeanyEditor *editor, gint line, gboolean allow_empty_lines, gboolean toggle,
|
||||||
gboolean single_comment)
|
gboolean single_comment)
|
||||||
{
|
{
|
||||||
gint first_line, last_line, eol_char_len;
|
gint first_line, last_line;
|
||||||
gint x, i, line_start, line_len;
|
gint x, i, line_start, line_len;
|
||||||
gint sel_start, sel_end, co_len;
|
gint sel_start, sel_end, co_len;
|
||||||
gchar sel[256];
|
gchar sel[256];
|
||||||
@ -3226,8 +3220,6 @@ void editor_do_comment(GeanyEditor *editor, gint line, gboolean allow_empty_line
|
|||||||
sel_start = sel_end = sci_get_position_from_line(editor->sci, line);
|
sel_start = sel_end = sci_get_position_from_line(editor->sci, line);
|
||||||
}
|
}
|
||||||
|
|
||||||
eol_char_len = editor_get_eol_char_len(editor);
|
|
||||||
|
|
||||||
ft = editor_get_filetype_at_line(editor, first_line);
|
ft = editor_get_filetype_at_line(editor, first_line);
|
||||||
|
|
||||||
if (! filetype_get_comment_open_close(ft, single_comment, &co, &cc))
|
if (! filetype_get_comment_open_close(ft, single_comment, &co, &cc))
|
||||||
@ -3244,10 +3236,10 @@ void editor_do_comment(GeanyEditor *editor, gint line, gboolean allow_empty_line
|
|||||||
gint buf_len;
|
gint buf_len;
|
||||||
|
|
||||||
line_start = sci_get_position_from_line(editor->sci, i);
|
line_start = sci_get_position_from_line(editor->sci, i);
|
||||||
line_len = sci_get_line_length(editor->sci, i);
|
line_len = sci_get_line_end_position(editor->sci, i) - line_start;
|
||||||
x = 0;
|
x = 0;
|
||||||
|
|
||||||
buf_len = MIN((gint)sizeof(sel) - 1, line_len - eol_char_len);
|
buf_len = MIN((gint)sizeof(sel) - 1, line_len);
|
||||||
if (buf_len < 0)
|
if (buf_len < 0)
|
||||||
continue;
|
continue;
|
||||||
sci_get_text_range(editor->sci, line_start, line_start + buf_len, sel);
|
sci_get_text_range(editor->sci, line_start, line_start + buf_len, sel);
|
||||||
@ -4097,7 +4089,7 @@ void editor_indicator_set_on_line(GeanyEditor *editor, gint indic, gint line)
|
|||||||
/* skip blank lines */
|
/* skip blank lines */
|
||||||
if ((start + 1) == end ||
|
if ((start + 1) == end ||
|
||||||
start > end ||
|
start > end ||
|
||||||
sci_get_line_length(editor->sci, line) == editor_get_eol_char_len(editor))
|
(sci_get_line_end_position(editor->sci, line) - start) == 0)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user