68 lines
1.5 KiB
C++
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;
|
|
}
|