diff --git a/AK/Vector.h b/AK/Vector.h index fd25487ce6e..e75e6a58c95 100644 --- a/AK/Vector.h +++ b/AK/Vector.h @@ -161,8 +161,6 @@ public: return false; } - // NOTE: Vector::is_null() exists for the benefit of String::copy(). - bool is_null() const { return false; } bool is_empty() const { return size() == 0; } ALWAYS_INLINE size_t size() const { return m_size; } size_t capacity() const { return m_capacity; } diff --git a/Userland/Libraries/LibCore/IODevice.cpp b/Userland/Libraries/LibCore/IODevice.cpp index 6dd7e3dc9c9..fb45152999d 100644 --- a/Userland/Libraries/LibCore/IODevice.cpp +++ b/Userland/Libraries/LibCore/IODevice.cpp @@ -105,14 +105,31 @@ bool IODevice::can_read_line() const { if (m_eof && !m_buffered_data.is_empty()) return true; + if (m_buffered_data.contains_slow('\n')) return true; + if (!can_read_from_fd()) return false; - populate_read_buffer(); - if (m_eof && !m_buffered_data.is_empty()) - return true; - return m_buffered_data.contains_slow('\n'); + + while (true) { + // Populate buffer until a newline is found or we reach EOF. + + auto previous_buffer_size = m_buffered_data.size(); + populate_read_buffer(); + auto new_buffer_size = m_buffered_data.size(); + + if (m_error) + return false; + + if (m_eof) + return !m_buffered_data.is_empty(); + + if (m_buffered_data.contains_in_range('\n', previous_buffer_size, new_buffer_size - 1)) + return true; + } + + return true; } bool IODevice::can_read() const