Make Cursor::go_start_of_line() and Cursor::go_end_of_line() safe for empty pieces

This commit is contained in:
Josh Holtrop 2016-10-26 21:20:42 -04:00
parent cd44deda9e
commit fd6ef8cab0

View File

@ -150,14 +150,17 @@ PieceTable::Cursor::Cursor(PieceTable * pt) : iterator(pt)
void PieceTable::Cursor::go_start_of_line()
{
if (!iterator.valid())
return;
while (iterator.valid() &&
(!iterator.piece->prev->eol()) &&
(iterator.piece->prev != iterator.piece_table->start_piece))
Iterator last_iterator = iterator;
for (;;)
{
iterator.go_prev_piece();
if (iterator.piece_eol() || !iterator.valid())
{
break;
}
last_iterator = iterator;
}
iterator = last_iterator;
iterator.offset = 0u;
init_column();
}
@ -173,12 +176,25 @@ bool PieceTable::Cursor::check_go_start_of_line()
void PieceTable::Cursor::go_end_of_line(bool allow_on_eol)
{
if (!iterator.valid())
return;
while (iterator.valid() &&
(!iterator.piece->eol()) &&
(iterator.piece->next != iterator.piece_table->end_piece))
{
iterator.go_next_piece();
return;
}
for (;;)
{
if (iterator.piece_eol())
{
break;
}
Iterator move_iterator = iterator;
move_iterator.go_next_piece();
if (move_iterator.valid())
{
iterator = move_iterator;
}
else
{
break;
}
}
iterator.go_end_of_piece();
calculate_column();