Skip to content

Commit

Permalink
LibCore: Add CFileStreamReader, a simple streaming CFile reader.
Browse files Browse the repository at this point in the history
This is extremely barebones right now, but can be used to easily read binary
data from a CFile piece by piece.
  • Loading branch information
awesomekling committed Jul 27, 2019
1 parent be1025c commit a292d8c
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 0 deletions.
31 changes: 31 additions & 0 deletions Libraries/LibCore/CFileStreamReader.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
#pragma once

#include <AK/StdLibExtras.h>
#include <LibCore/CFile.h>

class CFileStreamReader {
public:
CFileStreamReader(CFile& file)
: m_file(file)
{
}

bool handle_read_failure()
{
return exchange(m_had_failure, false);
}

template<typename T>
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 };
};
7 changes: 7 additions & 0 deletions Libraries/LibCore/CIODevice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
3 changes: 3 additions & 0 deletions Libraries/LibCore/CIODevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ class CIODevice : public CObject {

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();
Expand Down

0 comments on commit a292d8c

Please sign in to comment.