From 0cbc36c5ffe40a5f461c8a50fc33da7498e9fb1e Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Tue, 1 Nov 2016 22:46:44 -0400 Subject: [PATCH] change Buffer to start using GapBuffer --- src/core/Buffer.cc | 47 +++++++++++++++++++++------------------------- src/core/Buffer.h | 13 +++++-------- src/jes.cc | 5 +++-- 3 files changed, 29 insertions(+), 36 deletions(-) diff --git a/src/core/Buffer.cc b/src/core/Buffer.cc index 9ebd4ea..8d8a523 100644 --- a/src/core/Buffer.cc +++ b/src/core/Buffer.cc @@ -5,21 +5,25 @@ #include "TextLoader.h" #include -Buffer::Buffer() +Buffer::Buffer(const char * filename) { - m_file_buffer = nullptr; - m_file_buffer_size = 0u; - m_eol_at_eof = true; - m_line_endings = LineEndings::LF; - m_encoding = Encoding::UTF_8; + if (filename != nullptr) + { + if (!load_from_file(filename)) + { + load_empty_buffer(); + } + } + else + { + load_empty_buffer(); + } } -Buffer::~Buffer() +void Buffer::load_empty_buffer() { - if (m_file_buffer != nullptr) - { - free_file_buffer(); - } + m_gap_buffer = std::make_shared(); + m_eol_at_eof = true; } bool Buffer::load_from_file(const char * filename) @@ -36,26 +40,24 @@ bool Buffer::load_from_file(const char * filename) return false; } - m_file_buffer_size = ((unsigned long)file_size + 2u * 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) + size_t buffer_size = ((unsigned long)file_size + 2u * System::page_size) & System::page_base_mask; + uint8_t * buffer = (uint8_t *)System::alloc_pages(buffer_size >> System::page_size_log); + if (buffer == NULL) { return false; } - if (!file.read(m_file_buffer, file_size)) + if (!file.read(buffer, file_size)) { - free_file_buffer(); + System::free_pages(buffer, buffer_size >> System::page_size_log); return false; } TextLoader text_loader; size_t loaded_size; - text_loader.load_buffer(m_file_buffer, file_size, &loaded_size); + text_loader.load_buffer(buffer, file_size, &loaded_size); m_eol_at_eof = text_loader.get_eol_at_eof(); - m_line_endings = text_loader.get_line_endings(); - m_encoding = text_loader.get_encoding(); return true; } @@ -72,10 +74,3 @@ bool Buffer::write_to_file(const char * filename) return true; } - -void Buffer::free_file_buffer() -{ - System::free_pages(m_file_buffer, m_file_buffer_size >> System::page_size_log); - m_file_buffer = nullptr; - m_file_buffer_size = 0u; -} diff --git a/src/core/Buffer.h b/src/core/Buffer.h index 042584d..1eab87e 100644 --- a/src/core/Buffer.h +++ b/src/core/Buffer.h @@ -5,23 +5,20 @@ #include #include "LineEndings.h" #include "Encoding.h" +#include "GapBuffer.h" class Buffer { public: - Buffer(); - ~Buffer(); - bool load_from_file(const char * filename); + Buffer(const char * filename = nullptr); bool write_to_file(const char * filename); protected: - uint8_t * m_file_buffer; - unsigned long m_file_buffer_size; bool m_eol_at_eof; - LineEndings::Type m_line_endings; - Encoding::Type m_encoding; + std::shared_ptr m_gap_buffer; - void free_file_buffer(); + bool load_from_file(const char * filename); + void load_empty_buffer(); }; #endif diff --git a/src/jes.cc b/src/jes.cc index b8dd61f..e3d0899 100644 --- a/src/jes.cc +++ b/src/jes.cc @@ -13,11 +13,12 @@ int main(int argc, char * argv[]) Runtime::init(argv[0], APPNAME); - std::shared_ptr b = std::make_shared(); + const char * filename = nullptr; if (argc > 1) { - b->load_from_file(argv[1]); + filename = argv[1]; } + std::shared_ptr b = std::make_shared(filename); Window w; if (!w.create(b)) {