diff --git a/src/core/Buffer.cc b/src/core/Buffer.cc index 630fe72..9be4742 100644 --- a/src/core/Buffer.cc +++ b/src/core/Buffer.cc @@ -56,7 +56,7 @@ bool Buffer::load_from_file(const char * filename) return false; } - size_t buffer_size = ((unsigned long)file_size + 2u * System::page_size) & System::page_base_mask; + size_t buffer_size = ((unsigned long)file_size + System::page_size + (64u * 1024u)) & System::page_base_mask; uint8_t * buffer = (uint8_t *)System::alloc_pages(buffer_size >> System::page_size_log); if (buffer == NULL) { diff --git a/src/core/GapBuffer.cc b/src/core/GapBuffer.cc index cb7fc04..da6c4ff 100644 --- a/src/core/GapBuffer.cc +++ b/src/core/GapBuffer.cc @@ -4,7 +4,8 @@ GapBuffer::GapBuffer() { - m_buffer = (uint8_t *)System::alloc_pages(1u); + int num_pages = (64u * 1024u + System::page_size - 1u) >> System::page_size_log; + m_buffer = (uint8_t *)System::alloc_pages(num_pages); m_buffer_size = System::page_size; m_size = 0u; m_gap_position = 0u; diff --git a/test/src/test_GapBuffer.cc b/test/src/test_GapBuffer.cc index 2d18e58..a704edb 100644 --- a/test/src/test_GapBuffer.cc +++ b/test/src/test_GapBuffer.cc @@ -1,6 +1,7 @@ #include "gtest/gtest.h" #include "GapBuffer.h" #include "System.h" +#include TEST(GapBufferTest, creates_an_empty_buffer) { @@ -22,12 +23,16 @@ TEST(GapBufferTest, allows_inserting) GapBuffer gp; gp.insert(0u, (const uint8_t *)"test", 4u); - EXPECT_EQ("test", gp.get_string()); + EXPECT_EQ('s', *gp.address(2u)); EXPECT_EQ(4u, gp.size()); + EXPECT_EQ("test", gp.get_string()); gp.insert(2u, (const uint8_t *)"12", 2u); - EXPECT_EQ("te12st", gp.get_string()); + /* The gap should be between the '2' and 's' now */ + EXPECT_GT(gp.address(4u) - gp.address(3u), 100u); + EXPECT_EQ('s', *gp.address(4u)); EXPECT_EQ(6u, gp.size()); + EXPECT_EQ("te12st", gp.get_string()); gp.insert(0u, (const uint8_t *)"-", 1u); EXPECT_EQ("-te12st", gp.get_string()); @@ -37,3 +42,18 @@ TEST(GapBufferTest, allows_inserting) EXPECT_EQ("-te12st!", gp.get_string()); EXPECT_EQ(8u, gp.size()); } + +TEST(GapBufferTest, allocates_more_memory_and_copies_buffer_contents_when_needed) +{ + GapBuffer gp; + std::string s("ABCD"); + + gp.insert(0u, (const uint8_t *)"ABCDEFGH", 8u); + for (size_t i = 0u; i < (80u * 1024u); i++) + { + gp.insert(4u, (const uint8_t *)"-", 1u); + s += "-"; + } + s += "EFGH"; + EXPECT_EQ(s, gp.get_string()); +}