From 085a8a556af429b6992c4f5d5bd3abffa16b7f9a Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Wed, 30 Nov 2016 21:21:19 -0500 Subject: [PATCH] allow loading a Buffer from in-memory data --- src/core/Buffer.cc | 46 +++++++++++++++++++++++++++++++++++++--------- src/core/Buffer.h | 6 +++++- 2 files changed, 42 insertions(+), 10 deletions(-) diff --git a/src/core/Buffer.cc b/src/core/Buffer.cc index fe47b15..ad305ee 100644 --- a/src/core/Buffer.cc +++ b/src/core/Buffer.cc @@ -4,17 +4,24 @@ #include "File.h" #include "TextLoader.h" #include +#include + +Buffer::Buffer() +{ + load_empty_buffer(); +} Buffer::Buffer(const char * filename) { - if (filename != nullptr) + if (!load_from_file(filename)) { - if (!load_from_file(filename)) - { - load_empty_buffer(); - } + load_empty_buffer(); } - else +} + +Buffer::Buffer(const uint8_t * data, size_t data_length) +{ + if (!load_from_memory(data, data_length)) { load_empty_buffer(); } @@ -54,15 +61,36 @@ bool Buffer::load_from_file(const char * filename) return false; } + load_text_in_buffer(buffer, buffer_size, file_size); + + return true; +} + +bool Buffer::load_from_memory(const uint8_t * data, size_t data_length) +{ + size_t buffer_size = ((unsigned long)data_length + 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; + } + + memcpy(buffer, data, data_length); + + load_text_in_buffer(buffer, buffer_size, data_length); + + return true; +} + +void Buffer::load_text_in_buffer(uint8_t * buffer, size_t buffer_size, size_t data_length) +{ TextLoader text_loader; size_t loaded_size; - text_loader.load_buffer(buffer, file_size, &loaded_size); + text_loader.load_buffer(buffer, data_length, &loaded_size); m_gap_buffer = std::make_shared(buffer, buffer_size, loaded_size, text_loader.get_encoding()); m_eol_at_eof = text_loader.get_eol_at_eof(); m_line_endings = text_loader.get_line_endings(); - - return true; } bool Buffer::write_to_file(const char * filename) diff --git a/src/core/Buffer.h b/src/core/Buffer.h index 62cd465..75ae05e 100644 --- a/src/core/Buffer.h +++ b/src/core/Buffer.h @@ -10,7 +10,9 @@ class Buffer { public: - Buffer(const char * filename = nullptr); + Buffer(); + Buffer(const char * filename); + Buffer(const uint8_t * data, size_t data_length); bool write_to_file(const char * filename); typedef GapBuffer::Cursor Cursor; @@ -28,6 +30,8 @@ protected: bool load_from_file(const char * filename); void load_empty_buffer(); + bool load_from_memory(const uint8_t * data, size_t data_length); + void load_text_in_buffer(uint8_t * buffer, size_t buffer_size, size_t data_length); }; #endif