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() void PieceTable::Cursor::go_start_of_line()
{ {
if (!iterator.valid()) Iterator last_iterator = iterator;
return; for (;;)
while (iterator.valid() &&
(!iterator.piece->prev->eol()) &&
(iterator.piece->prev != iterator.piece_table->start_piece))
{ {
iterator.go_prev_piece(); iterator.go_prev_piece();
if (iterator.piece_eol() || !iterator.valid())
{
break;
}
last_iterator = iterator;
} }
iterator = last_iterator;
iterator.offset = 0u; iterator.offset = 0u;
init_column(); 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) void PieceTable::Cursor::go_end_of_line(bool allow_on_eol)
{ {
if (!iterator.valid()) 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(); iterator.go_end_of_piece();
calculate_column(); calculate_column();