#include "Buffer.h" #include #include "System.h" #include "File.h" #include "TextLoader.h" Buffer::Buffer() { m_file_buffer = nullptr; m_file_buffer_size = 0u; piece_table = std::make_shared(nullptr, 0u); } Buffer::~Buffer() { if (m_file_buffer != nullptr) { free_file_buffer(); } } bool Buffer::load_from_file(const char * filename) { File file; if (!file.open(filename)) { return false; } size_t file_size = file.get_size(); if (file_size < 0) { return false; } m_file_buffer_size = ((unsigned long)file_size + System::page_size - 1u) & 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) { return false; } if (!file.read(m_file_buffer, file_size)) { free_file_buffer(); return false; } TextLoader text_loader; text_loader.load_buffer(m_file_buffer, file_size); piece_table = std::make_shared(m_file_buffer, m_file_buffer_size); for (auto it = text_loader.begin(); it != text_loader.end(); it++) { /* TODO: correctly calculate n_chars based on current file encoding. */ piece_table->append_initial_line_piece(it->first, it->second, it->second); } 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; }