change Buffer to start using GapBuffer
This commit is contained in:
parent
444653822e
commit
0cbc36c5ff
@ -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;
|
|
||||||
}
|
|
||||||
|
@ -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
|
||||||
|
@ -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))
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user