Make Cursor::go_start_of_line() and Cursor::go_end_of_line() safe for empty pieces
This commit is contained in:
parent
cd44deda9e
commit
fd6ef8cab0
@ -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();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user