mudgangster

Log | Files | Refs

commit 00b4d515a6204c571a3bc808b02b836b8a39c002
parent 44418efb7e40e8200bedc673965b75250d1352a0
Author: Michael Savage <mikejsavage@gmail.com>
Date:   Sat,  8 Sep 2018 17:26:58 +0300

Textbox selection crashes

Diffstat:
src/textbox.cc | 23++++++++++++++++-------
1 file changed, 16 insertions(+), 7 deletions(-)

diff --git a/src/textbox.cc b/src/textbox.cc @@ -170,7 +170,7 @@ void textbox_mouse_up( TextBox * tb, int window_x, int window_y ) { int end_line = 0; int rows = 0; - while( rows < end_row ) { + while( rows < end_row && end_line < tb->num_lines ) { const TextBox::Line & line = tb->lines[ ( tb->head + tb->num_lines - tb->scroll_offset - end_line ) % tb->max_lines ]; int line_rows = 1 + line.len / tb_cols; if( line.len > 0 && line.len % tb_cols == 0 ) @@ -179,10 +179,13 @@ void textbox_mouse_up( TextBox * tb, int window_x, int window_y ) { end_line++; } + if( end_line == tb->num_lines ) + return; + size_t end_line_offset = ( rows - end_row ) * tb_cols + end_col + 1; int start_line = end_line; - while( rows < start_row ) { + while( rows < start_row && start_line < tb->num_lines ) { const TextBox::Line & line = tb->lines[ ( tb->head + tb->num_lines - tb->scroll_offset - start_line ) % tb->max_lines ]; int line_rows = 1 + line.len / tb_cols; if( line.len > 0 && line.len % tb_cols == 0 ) @@ -192,6 +195,10 @@ void textbox_mouse_up( TextBox * tb, int window_x, int window_y ) { } size_t start_line_offset = ( rows - start_row ) * tb_cols + start_col; + if( start_line == tb->num_lines ) { + start_line--; + start_line_offset = 0; + } // first pass to get the length of the selected string size_t selected_length = 1; // include space for \0 @@ -221,11 +228,13 @@ void textbox_mouse_up( TextBox * tb, int window_x, int window_y ) { const TextBox::Line & line = tb->lines[ ( tb->head + tb->num_lines - tb->scroll_offset - i ) % tb->max_lines ]; size_t start_offset = i == start_line ? start_line_offset : 0; size_t end_offset = i == end_line ? end_line_offset : line.len; - size_t len = min( line.len, end_offset ) - start_offset; - // TODO: insert ansi codes when style changes - for( size_t j = 0; j < len; j++ ) { - selected[ n ] = line.glyphs[ j + start_offset ].ch; - n++; + if( start_offset <= line.len ) { + size_t len = min( line.len, end_offset ) - start_offset; + // TODO: insert ansi codes when style changes + for( size_t j = 0; j < len; j++ ) { + selected[ n ] = line.glyphs[ j + start_offset ].ch; + n++; + } } if( i != end_line ) { memcpy( selected + n, NEWLINE_STRING, sizeof( NEWLINE_STRING ) - 1 );