Buffer owns the file buffer
This commit is contained in:
parent
5f8bbcfca4
commit
cae0b581a2
@ -4,6 +4,20 @@
|
|||||||
#include "File.h"
|
#include "File.h"
|
||||||
#include "FileLoader.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)
|
bool Buffer::load_from_file(const char * filename)
|
||||||
{
|
{
|
||||||
File file;
|
File file;
|
||||||
@ -18,23 +32,22 @@ bool Buffer::load_from_file(const char * filename)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned long file_buffer_size = ((unsigned long)file_size + System::page_size - 1u) & System::page_base_mask;
|
m_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);
|
m_file_buffer = (uint8_t *)System::alloc_pages(m_file_buffer_size >> System::page_size_log);
|
||||||
if (file_buffer == NULL)
|
if (m_file_buffer == NULL)
|
||||||
{
|
{
|
||||||
return false;
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO: record file_buffer for freeing */
|
|
||||||
/* TODO: remove FileLoader */
|
/* TODO: remove FileLoader */
|
||||||
FileLoader fl;
|
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++)
|
for (size_t i = 0, num_lines = fl.num_lines(); i < num_lines; i++)
|
||||||
{
|
{
|
||||||
m_lines.push_back(fl.get_line(i));
|
m_lines.push_back(fl.get_line(i));
|
||||||
@ -42,3 +55,10 @@ bool Buffer::load_from_file(const char * filename)
|
|||||||
|
|
||||||
return true;
|
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
|
class Buffer
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
Buffer();
|
||||||
|
~Buffer();
|
||||||
bool load_from_file(const char * filename);
|
bool load_from_file(const char * filename);
|
||||||
|
|
||||||
typedef std::shared_ptr<Text> LineType;
|
typedef std::shared_ptr<Text> LineType;
|
||||||
@ -26,6 +28,10 @@ public:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
LinesType m_lines;
|
LinesType m_lines;
|
||||||
|
uint8_t * m_file_buffer;
|
||||||
|
unsigned long m_file_buffer_size;
|
||||||
|
|
||||||
|
void free_file_buffer();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user