change Buffer to start using GapBuffer

This commit is contained in:
Josh Holtrop 2016-11-01 22:46:44 -04:00
parent 444653822e
commit 0cbc36c5ff
3 changed files with 29 additions and 36 deletions

View File

@ -5,21 +5,25 @@
#include "TextLoader.h" #include "TextLoader.h"
#include <cassert> #include <cassert>
Buffer::Buffer() Buffer::Buffer(const char * filename)
{ {
m_file_buffer = nullptr; if (filename != nullptr)
m_file_buffer_size = 0u; {
m_eol_at_eof = true; if (!load_from_file(filename))
m_line_endings = LineEndings::LF; {
m_encoding = Encoding::UTF_8; load_empty_buffer();
}
}
else
{
load_empty_buffer();
}
} }
Buffer::~Buffer() void Buffer::load_empty_buffer()
{ {
if (m_file_buffer != nullptr) m_gap_buffer = std::make_shared<GapBuffer>();
{ m_eol_at_eof = true;
free_file_buffer();
}
} }
bool Buffer::load_from_file(const char * filename) bool Buffer::load_from_file(const char * filename)
@ -36,26 +40,24 @@ bool Buffer::load_from_file(const char * filename)
return false; return false;
} }
m_file_buffer_size = ((unsigned long)file_size + 2u * System::page_size) & System::page_base_mask; size_t buffer_size = ((unsigned long)file_size + 2u * System::page_size) & System::page_base_mask;
m_file_buffer = (uint8_t *)System::alloc_pages(m_file_buffer_size >> System::page_size_log); uint8_t * buffer = (uint8_t *)System::alloc_pages(buffer_size >> System::page_size_log);
if (m_file_buffer == NULL) if (buffer == NULL)
{ {
return false; return false;
} }
if (!file.read(m_file_buffer, file_size)) if (!file.read(buffer, file_size))
{ {
free_file_buffer(); System::free_pages(buffer, buffer_size >> System::page_size_log);
return false; return false;
} }
TextLoader text_loader; TextLoader text_loader;
size_t loaded_size; size_t loaded_size;
text_loader.load_buffer(m_file_buffer, file_size, &loaded_size); text_loader.load_buffer(buffer, file_size, &loaded_size);
m_eol_at_eof = text_loader.get_eol_at_eof(); m_eol_at_eof = text_loader.get_eol_at_eof();
m_line_endings = text_loader.get_line_endings();
m_encoding = text_loader.get_encoding();
return true; return true;
} }
@ -72,10 +74,3 @@ bool Buffer::write_to_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;
}

View File

@ -5,23 +5,20 @@
#include <memory> #include <memory>
#include "LineEndings.h" #include "LineEndings.h"
#include "Encoding.h" #include "Encoding.h"
#include "GapBuffer.h"
class Buffer class Buffer
{ {
public: public:
Buffer(); Buffer(const char * filename = nullptr);
~Buffer();
bool load_from_file(const char * filename);
bool write_to_file(const char * filename); bool write_to_file(const char * filename);
protected: protected:
uint8_t * m_file_buffer;
unsigned long m_file_buffer_size;
bool m_eol_at_eof; bool m_eol_at_eof;
LineEndings::Type m_line_endings; std::shared_ptr<GapBuffer> m_gap_buffer;
Encoding::Type m_encoding;
void free_file_buffer(); bool load_from_file(const char * filename);
void load_empty_buffer();
}; };
#endif #endif

View File

@ -13,11 +13,12 @@ int main(int argc, char * argv[])
Runtime::init(argv[0], APPNAME); Runtime::init(argv[0], APPNAME);
std::shared_ptr<Buffer> b = std::make_shared<Buffer>(); const char * filename = nullptr;
if (argc > 1) if (argc > 1)
{ {
b->load_from_file(argv[1]); filename = argv[1];
} }
std::shared_ptr<Buffer> b = std::make_shared<Buffer>(filename);
Window w; Window w;
if (!w.create(b)) if (!w.create(b))
{ {