Buffer owns the file buffer

This commit is contained in:
Josh Holtrop 2016-07-14 20:06:22 -04:00
parent 5f8bbcfca4
commit cae0b581a2
2 changed files with 33 additions and 7 deletions

View File

@ -4,6 +4,20 @@
#include "File.h"
#include "FileLoader.h"
Buffer::Buffer()
{
m_file_buffer = nullptr;
m_file_buffer_size = 0u;
}
Buffer::~Buffer()
{
if (m_file_buffer != nullptr)
{
free_file_buffer();
}
}
bool Buffer::load_from_file(const char * filename)
{
File file;
@ -18,23 +32,22 @@ bool Buffer::load_from_file(const char * filename)
return false;
}
unsigned long file_buffer_size = ((unsigned long)file_size + System::page_size - 1u) & System::page_base_mask;
uint8_t * file_buffer = (uint8_t *)System::alloc_pages(file_buffer_size >> System::page_size_log);
if (file_buffer == NULL)
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(file_buffer, file_size))
if (!file.read(m_file_buffer, file_size))
{
System::free_pages(file_buffer, file_buffer_size >> System::page_size_log);
free_file_buffer();
return false;
}
/* TODO: record file_buffer for freeing */
/* TODO: remove FileLoader */
FileLoader fl;
fl.load_buf(file_buffer, file_size);
fl.load_buf(m_file_buffer, file_size);
for (size_t i = 0, num_lines = fl.num_lines(); i < num_lines; i++)
{
m_lines.push_back(fl.get_line(i));
@ -42,3 +55,10 @@ bool Buffer::load_from_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;
}

View File

@ -8,6 +8,8 @@
class Buffer
{
public:
Buffer();
~Buffer();
bool load_from_file(const char * filename);
typedef std::shared_ptr<Text> LineType;
@ -26,6 +28,10 @@ public:
protected:
LinesType m_lines;
uint8_t * m_file_buffer;
unsigned long m_file_buffer_size;
void free_file_buffer();
};
#endif