Buffer owns the file buffer
This commit is contained in:
parent
5f8bbcfca4
commit
cae0b581a2
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user