From 5f37229c19c3a7387404444bb0d56a32669d4e6d Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Sat, 7 Jan 2017 16:22:28 -0500 Subject: [PATCH] when adjusting cursor iterators, always keep them valid --- src/core/Buffer.cc | 16 ++++++++++------ src/core/Buffer.h | 2 +- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/core/Buffer.cc b/src/core/Buffer.cc index 60ced06..7244cb3 100644 --- a/src/core/Buffer.cc +++ b/src/core/Buffer.cc @@ -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() diff --git a/src/core/Buffer.h b/src/core/Buffer.h index a242140..36e806a 100644 --- a/src/core/Buffer.h +++ b/src/core/Buffer.h @@ -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); }