From c2c0d6f04236d7a993974a47e3762649cc0b25c9 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Sun, 25 Sep 2016 23:01:59 -0400 Subject: [PATCH] add a piece table insertion test --- src/core/PieceTable.cc | 72 ++++++++++++++++++++++++++++++++++++++++++ src/core/PieceTable.h | 4 +++ src/gui/Window.cc | 9 ++++++ src/gui/Window.h | 1 + 4 files changed, 86 insertions(+) diff --git a/src/core/PieceTable.cc b/src/core/PieceTable.cc index cb4fb4f..062fd98 100644 --- a/src/core/PieceTable.cc +++ b/src/core/PieceTable.cc @@ -10,6 +10,7 @@ PieceTable::PieceTable(const uint8_t * file_buffer, unsigned long file_buffer_si end_piece->prev = start_piece; m_piece_index = 2u; tabstop = 4u; + m_append_buffer_index = 0u; } void PieceTable::append_initial_line_piece(uint8_t * start, uint32_t length, bool eol) @@ -240,6 +241,14 @@ bool PieceTable::Cursor::go_right(int n) return true; } +void PieceTable::Cursor::warp_to_inserted_piece(Piece * piece) +{ + iterator.piece = piece; + iterator.offset = 0u; + iterator.go_end_of_piece(); + calculate_column(); +} + bool PieceTable::Cursor::is_start_of_line() { return iterator.valid() && @@ -323,3 +332,66 @@ void PieceTable::Cursor::forward_to_column(uint32_t c) diff = new_diff; } } + +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'; + if (c.iterator.valid()) + { + if (c.iterator.offset > 0u) + { + 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; + + c.iterator.piece->prev->next = piece2; + piece2->prev = c.iterator.piece->prev; + piece2->next = piece; + piece->prev = piece2; + + piece->next = piece3; + piece3->prev = piece; + piece3->next = c.iterator.piece->next; + piece3->next->prev = piece3; + } + else + { + if (c.iterator.piece->length == 0u) + { + piece->flags = c.iterator.piece->flags; + c.iterator.piece->prev->next = piece; + c.iterator.piece->next->prev = piece; + piece->prev = c.iterator.piece->prev; + piece->next = c.iterator.piece->next; + } + else + { + c.iterator.piece->prev->next = piece; + piece->prev = c.iterator.piece->prev; + c.iterator.piece->prev = piece; + piece->next = c.iterator.piece; + } + } + } + else + { + start_piece->next = piece; + piece->prev = start_piece; + end_piece->prev = piece; + piece->next = end_piece; + } + + c.warp_to_inserted_piece(piece); +} diff --git a/src/core/PieceTable.h b/src/core/PieceTable.h index d84d93d..8dbdbd2 100644 --- a/src/core/PieceTable.h +++ b/src/core/PieceTable.h @@ -120,6 +120,7 @@ public: { return (c.line == line) && (c.column == column); } + void warp_to_inserted_piece(Piece * piece); protected: bool is_start_of_line(); @@ -154,6 +155,8 @@ public: std::shared_ptr add_cursor(); + void insertion_test(Cursor & c); + protected: const uint8_t * m_file_buffer; unsigned long m_file_buffer_size; @@ -163,6 +166,7 @@ protected: uint32_t m_piece_index; PagedBuffer m_append_buffer; + uint32_t m_append_buffer_index; PagedBuffer m_pieces; std::list> m_cursors; diff --git a/src/gui/Window.cc b/src/gui/Window.cc index 5c7ac78..0f2e043 100644 --- a/src/gui/Window.cc +++ b/src/gui/Window.cc @@ -268,6 +268,9 @@ void Window::handle_key(uint32_t scancode, uint32_t mod) case SDL_SCANCODE_L: cursor_move(CURSOR_RIGHT); break; + case SDL_SCANCODE_P: + insertion_test(); + break; } } @@ -521,3 +524,9 @@ void Window::draw_status_bar() x += m_font.get_advance(); } } + +void Window::insertion_test() +{ + m_buffer->piece_table->insertion_test(*m_cursor); + redraw(); +} diff --git a/src/gui/Window.h b/src/gui/Window.h index 7bea24e..44eb172 100644 --- a/src/gui/Window.h +++ b/src/gui/Window.h @@ -42,6 +42,7 @@ protected: void update_cursor_row(int cursor_row); void draw_rect(int x, int y, int width, int height, float r, float g, float b, float a); void draw_status_bar(); + void insertion_test(); SDL_Window * m_window; bool m_exit_requested;