diff options
| author | BossCode45 <boss@tehbox.org> | 2025-06-27 14:54:46 +1200 |
|---|---|---|
| committer | BossCode45 <boss@tehbox.org> | 2025-07-24 12:48:21 +1200 |
| commit | f953c730af2b90db99f709258c5d5e50fdcaadf7 (patch) | |
| tree | adbc79f0d48a74a42fd0eb22d85f03696a99dc42 /src/reader.cpp | |
| parent | 06a2928d96b3d9aeaffb19013ba71a5cb6d96381 (diff) | |
| download | tehimage-f953c730af2b90db99f709258c5d5e50fdcaadf7.tar.gz tehimage-f953c730af2b90db99f709258c5d5e50fdcaadf7.zip | |
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.
Diffstat (limited to 'src/reader.cpp')
| -rw-r--r-- | src/reader.cpp | 110 |
1 files changed, 110 insertions, 0 deletions
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 <algorithm> +#include <cstddef> +#include <cstdint> +#include <cstring> +#include <iostream> + +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<uint8_t>() +{ + return readByte(); +} + +template<> uint16_t Reader::readData<uint16_t>() +{ + 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>() +{ + 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>() +{ + 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; +} |
