From f953c730af2b90db99f709258c5d5e50fdcaadf7 Mon Sep 17 00:00:00 2001 From: BossCode45 Date: Fri, 27 Jun 2025 14:54:46 +1200 Subject: Initial commit Bringing a lot of stuff over from my maze-reader project in an attempt to split the image reading code off into a library. --- src/reader.cpp | 110 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 src/reader.cpp (limited to 'src/reader.cpp') diff --git a/src/reader.cpp b/src/reader.cpp new file mode 100644 index 0000000..59b30c0 --- /dev/null +++ b/src/reader.cpp @@ -0,0 +1,110 @@ +#include "reader.h" + +#include "debug.h" + +#include +#include +#include +#include +#include + +Reader::Reader(std::string filename) +{ + file = fopen(filename.c_str(), "rb"); + refreshBuffer(); + ready = true; +} +Reader::~Reader() +{ + if(ready) + fclose(file); +} + +char Reader::readByte() +{ + if(pos == BUFFER_SIZE) + refreshBuffer(); + return buffer[pos++]; +} + +void Reader::refreshBuffer() +{ + fread(buffer, sizeof(buffer), 1, file); + pos = 0; +} + +template<> uint8_t Reader::readData() +{ + return readByte(); +} + +template<> uint16_t Reader::readData() +{ + uint16_t num = 0; + for(int i = 0; i < 2; i++) + { + num += readByte() << (8 * (1-i)); + } + return num; +} + +template<> uint32_t Reader::readData() +{ + uint32_t num = 0; + for(int i = 0; i < 4; i++) + { + uint8_t byte = readByte(); + DEBUG(std::cout << std::hex << 0+byte << " "); + num += byte << (8 * (3-i)); + } + DEBUG(std::cout << std::dec << std::endl); + return num; +} + +template<> uint64_t Reader::readData() +{ + uint64_t num = 0; + for(int i = 0; i < 8; i++) + { + num += readByte() << (8 * (7-i)); + } + return num; +} + +void Reader::readBytes(char* out, size_t len) +{ + while(len > 0) + { + size_t bytesToRead = std::min(len, BUFFER_SIZE - pos); + if(bytesToRead == 0) + { + refreshBuffer(); + continue; + } + memcpy(out, buffer + pos, bytesToRead); + out += bytesToRead; + len -= bytesToRead; + pos += bytesToRead; + } +} + +void Reader::skipBytes(size_t len) +{ + while(len > 0) + { + size_t bytesToRead = std::min(len, BUFFER_SIZE - pos); + if(bytesToRead == 0) + { + refreshBuffer(); + continue; + } + len -= bytesToRead; + pos += bytesToRead; + } +} + +void Reader::close() +{ + fclose(file); + ready = false; +} -- cgit v1.2.3