when adjusting cursor iterators, always keep them valid

This commit is contained in:
Josh Holtrop 2017-01-07 16:22:28 -05:00
parent 85dbf75b11
commit 5f37229c19
2 changed files with 11 additions and 7 deletions

View File

@ -168,23 +168,20 @@ void Buffer::exit_insert_mode()
pop_operation();
}
void Buffer::insert_code_point(const Buffer::Iterator & position, uint32_t code_point, bool adjust_iterators)
void Buffer::insert_code_point(const Buffer::Iterator & position, uint32_t code_point)
{
push_operation();
Buffer::Iterator local_position = position;
if ((code_point != '\n') && (size() == 0u))
{
insert_code_point(position, '\n', false);
insert_code_point(position, '\n');
}
uint8_t encoded[Encoding::MAX_CODE_POINT_SIZE];
uint8_t bytes = Encoding::encode(code_point, m_encoding, encoded);
m_gap_buffer->insert(local_position.offset(), encoded, bytes);
record_change(encoded, bytes, local_position.offset(), true);
ssize_t lines = (code_point == '\n') ? 1 : 0;
if (adjust_iterators)
{
warp_iterators(local_position.offset(), bytes, lines, true);
}
warp_iterators(local_position.offset(), bytes, lines, true);
pop_operation();
}
@ -217,6 +214,13 @@ void Buffer::warp_iterators(size_t offset, ssize_t offset_adjustment, ssize_t li
iterator->warp(offset_adjustment, lines_adjustment);
}
}
for (auto cursor : m_cursors)
{
if ((*cursor == *m_eof_iterator) && (size() > 0u))
{
cursor->go_back();
}
}
}
void Buffer::pop_operation()

View File

@ -119,7 +119,7 @@ public:
void enter_insert_mode();
void exit_insert_mode();
bool insert_mode() const { return m_insert_mode; }
void insert_code_point(const Buffer::Iterator & position, uint32_t code_point, bool adjust_iterators = true);
void insert_code_point(const Buffer::Iterator & position, uint32_t code_point);
void erase_code_point(const Buffer::Iterator & position);
std::string filename() const { return m_filename; }
Iterator begin() const { return Iterator(this); }