diff --git a/Libraries/LibCore/CFileStreamReader.h b/Libraries/LibCore/CFileStreamReader.h new file mode 100644 index 0000000000..1f6d6438aa --- /dev/null +++ b/Libraries/LibCore/CFileStreamReader.h @@ -0,0 +1,31 @@ +#pragma once + +#include +#include + +class CFileStreamReader { +public: + CFileStreamReader(CFile& file) + : m_file(file) + { + } + + bool handle_read_failure() + { + return exchange(m_had_failure, false); + } + + template + CFileStreamReader& operator>>(T& value) + { + int nread = m_file.read((u8*)&value, sizeof(T)); + ASSERT(nread == sizeof(T)); + if (nread != sizeof(T)) + m_had_failure = true; + return *this; + } + +private: + CFile& m_file; + bool m_had_failure { false }; +}; diff --git a/Libraries/LibCore/CIODevice.cpp b/Libraries/LibCore/CIODevice.cpp index 90f24f8bfe..a585e1a8dd 100644 --- a/Libraries/LibCore/CIODevice.cpp +++ b/Libraries/LibCore/CIODevice.cpp @@ -22,6 +22,13 @@ const char* CIODevice::error_string() const return strerror(m_error); } +int CIODevice::read(u8* buffer, int length) +{ + auto read_buffer = read(length); + memcpy(buffer, read_buffer.data(), length); + return read_buffer.size(); +} + ByteBuffer CIODevice::read(int max_size) { if (m_fd < 0) diff --git a/Libraries/LibCore/CIODevice.h b/Libraries/LibCore/CIODevice.h index 2af344542c..b50e8135b8 100644 --- a/Libraries/LibCore/CIODevice.h +++ b/Libraries/LibCore/CIODevice.h @@ -28,6 +28,9 @@ public: bool has_error() const { return m_error != 0; } + + int read(u8* buffer, int length); + ByteBuffer read(int max_size); ByteBuffer read_line(int max_size); ByteBuffer read_all();