jes/src/core/Buffer.cc

68 lines
1.5 KiB
C++

#include "Buffer.h"
#include <stdio.h>
#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<PieceTable>(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<PieceTable>(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;
}