From 4ebe81c06237aa2dcbbb551154cd4be3d6652381 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Sat, 15 Oct 2016 09:42:33 -0400 Subject: [PATCH] remove EOL Piece flag; use \n in memory to represent EOL (cursor movement needs to be updated yet) --- src/core/Buffer.cc | 5 +++-- src/core/PieceTable.cc | 10 ---------- src/core/PieceTable.h | 19 +++++-------------- 3 files changed, 8 insertions(+), 26 deletions(-) diff --git a/src/core/Buffer.cc b/src/core/Buffer.cc index 7df863c..1e30d7f 100644 --- a/src/core/Buffer.cc +++ b/src/core/Buffer.cc @@ -38,7 +38,7 @@ bool Buffer::load_from_file(const char * filename) return false; } - m_file_buffer_size = ((unsigned long)file_size + System::page_size - 1u) & System::page_base_mask; + m_file_buffer_size = ((unsigned long)file_size + System::page_size) & System::page_base_mask; m_file_buffer = (uint8_t *)System::alloc_pages(m_file_buffer_size >> System::page_size_log); if (m_file_buffer == NULL) { @@ -60,7 +60,8 @@ bool Buffer::load_from_file(const char * filename) auto next = it; next++; bool eol = next != text_loader.end(); - piece_table->append_initial_line_piece(it->start, it->length, eol); + it->start[it->length] = PieceTable::INTERNAL_EOL; + piece_table->append_initial_line_piece(it->start, it->length + 1u, eol); } m_eol_at_eof = text_loader.get_eol_at_eof(); diff --git a/src/core/PieceTable.cc b/src/core/PieceTable.cc index f059a3a..6b45e5b 100644 --- a/src/core/PieceTable.cc +++ b/src/core/PieceTable.cc @@ -19,9 +19,6 @@ void PieceTable::append_initial_line_piece(uint8_t * start, uint32_t length, boo piece->next = end_piece; piece->start = start; piece->length = length; - piece->flags = 0u; - if (eol) - piece->flags |= Piece::EOL_FLAG; end_piece->prev->next = piece; end_piece->prev = piece; m_num_lines++; @@ -357,12 +354,10 @@ void PieceTable::begin_insert(const Cursor & cursor, bool before) Piece * new_piece_1 = add_piece(); new_piece_1->start = piece->start; new_piece_1->length = offset; - new_piece_1->flags = 0u; Piece * new_piece_2 = add_piece(); new_piece_2->start = piece->start + offset; new_piece_2->length = piece->length - offset; - new_piece_2->flags = piece->flags; new_piece_1->prev = piece->prev; new_piece_1->next = new_piece_2; @@ -394,7 +389,6 @@ void PieceTable::insert_code_point(uint32_t code_point) m_inserting_piece = add_piece(); m_inserting_piece->start = &m_append_buffer[m_append_buffer_index]; m_inserting_piece->length = 0u; - m_inserting_piece->flags = 0u; m_inserting_piece->prev = m_insert_before_piece; m_inserting_piece->next = m_insert_before_piece->next; @@ -425,7 +419,6 @@ void PieceTable::insertion_test(Cursor & c) Piece * piece = add_piece(); piece->start = &m_append_buffer[m_append_buffer_index]; piece->length = 3u; - piece->flags = 0u; m_append_buffer[m_append_buffer_index++] = 'x'; m_append_buffer[m_append_buffer_index++] = 'y'; m_append_buffer[m_append_buffer_index++] = 'z'; @@ -443,12 +436,10 @@ void PieceTable::insertion_test(Cursor & c) Piece * piece2 = add_piece(); piece2->start = c.iterator.piece->start; piece2->length = c.iterator.offset; - piece2->flags = 0u; Piece * piece3 = add_piece(); piece3->start = c.iterator.piece->start + c.iterator.offset; piece3->length = c.iterator.piece->length - c.iterator.offset; - piece3->flags = c.iterator.piece->flags; piece2->next = piece; piece->prev = piece2; @@ -464,7 +455,6 @@ void PieceTable::insertion_test(Cursor & c) { if (c.iterator.piece->length == 0u) { - piece->flags = c.iterator.piece->flags; change->links[1][0][0] = c.iterator.piece->prev; change->links[1][0][1] = piece; change->links[1][1][0] = piece; diff --git a/src/core/PieceTable.h b/src/core/PieceTable.h index feebc58..4849fc6 100644 --- a/src/core/PieceTable.h +++ b/src/core/PieceTable.h @@ -16,14 +16,13 @@ public: PIECE_INDEX_START = 0, PIECE_INDEX_END = 1, }; + enum + { + INTERNAL_EOL = '\n', + }; struct Piece { - enum - { - EOL_FLAG = 0x80000000u, - }; - /** The previous piece in the chain. */ Piece * prev; @@ -36,16 +35,8 @@ public: /** Length of the text (in bytes). */ uint32_t length; - /** - * Flags. - */ - uint32_t flags; - /** Get whether this piece is the end of a line. */ - bool eol() { return (flags & EOL_FLAG) != 0u; } - - /** Toggle whether this piece is the end of a line. */ - void toggle_eol() { flags ^= EOL_FLAG; } + bool eol() { return (length > 0u) && (start[length - 1u] == INTERNAL_EOL); } }; struct Iterator