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(); 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(); push_operation();
Buffer::Iterator local_position = position; Buffer::Iterator local_position = position;
if ((code_point != '\n') && (size() == 0u)) 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 encoded[Encoding::MAX_CODE_POINT_SIZE];
uint8_t bytes = Encoding::encode(code_point, m_encoding, encoded); uint8_t bytes = Encoding::encode(code_point, m_encoding, encoded);
m_gap_buffer->insert(local_position.offset(), encoded, bytes); m_gap_buffer->insert(local_position.offset(), encoded, bytes);
record_change(encoded, bytes, local_position.offset(), true); record_change(encoded, bytes, local_position.offset(), true);
ssize_t lines = (code_point == '\n') ? 1 : 0; 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(); 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); 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() void Buffer::pop_operation()

View File

@ -119,7 +119,7 @@ public:
void enter_insert_mode(); void enter_insert_mode();
void exit_insert_mode(); void exit_insert_mode();
bool insert_mode() const { return m_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); void erase_code_point(const Buffer::Iterator & position);
std::string filename() const { return m_filename; } std::string filename() const { return m_filename; }
Iterator begin() const { return Iterator(this); } Iterator begin() const { return Iterator(this); }