diff --git a/AK/StringBuilder.cpp b/AK/StringBuilder.cpp index 572a8e8590c..a8c2cbcfbb1 100644 --- a/AK/StringBuilder.cpp +++ b/AK/StringBuilder.cpp @@ -11,6 +11,11 @@ inline void StringBuilder::will_append(size_t size) m_buffer.grow(max(16u, m_buffer.size() * 2 + size)); } +StringBuilder::StringBuilder(size_t initial_capacity) +{ + m_buffer.grow(initial_capacity); +} + void StringBuilder::append(const String& str) { if (str.is_empty()) @@ -20,6 +25,15 @@ void StringBuilder::append(const String& str) m_length += str.length(); } +void StringBuilder::append(const char* characters, size_t length) +{ + if (!length) + return; + will_append(length); + memcpy(m_buffer.pointer() + m_length, characters, length); + m_length += length; +} + void StringBuilder::append(char ch) { will_append(1); diff --git a/AK/StringBuilder.h b/AK/StringBuilder.h index 434f7a917b1..60c7569f0f7 100644 --- a/AK/StringBuilder.h +++ b/AK/StringBuilder.h @@ -7,11 +7,12 @@ namespace AK { class StringBuilder { public: - StringBuilder() { } + explicit StringBuilder(size_t initial_capacity = 16); ~StringBuilder() { } void append(const String&); void append(char); + void append(const char*, size_t); void appendf(const char*, ...); String build(); diff --git a/Kernel/FileSystem.cpp b/Kernel/FileSystem.cpp index 7cd4f8c1605..bc1d1d21466 100644 --- a/Kernel/FileSystem.cpp +++ b/Kernel/FileSystem.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include "FileSystem.h" #include "MemoryManager.h" @@ -51,29 +52,25 @@ FS* FS::from_fsid(dword id) ByteBuffer Inode::read_entire(FileDescriptor* descriptor) const { size_t initial_size = metadata().size ? metadata().size : 4096; - auto contents = ByteBuffer::create_uninitialized(initial_size); + StringBuilder builder(initial_size); ssize_t nread; byte buffer[4096]; - byte* out = contents.pointer(); off_t offset = 0; for (;;) { nread = read_bytes(offset, sizeof(buffer), buffer, descriptor); ASSERT(nread <= (ssize_t)sizeof(buffer)); if (nread <= 0) break; - memcpy(out, buffer, nread); - out += nread; + builder.append((const char*)buffer, nread); offset += nread; - ASSERT(offset <= (ssize_t)initial_size); // FIXME: Support dynamically growing the buffer. } if (nread < 0) { kprintf("Inode::read_entire: ERROR: %d\n", nread); return nullptr; } - contents.trim(offset); - return contents; + return builder.to_byte_buffer(); } FS::DirectoryEntry::DirectoryEntry(const char* n, InodeIdentifier i, byte ft)