aboutsummaryrefslogtreecommitdiff
path: root/src/reader.cpp
diff options
context:
space:
mode:
authorBossCode45 <boss@tehbox.org>2025-06-27 14:54:46 +1200
committerBossCode45 <boss@tehbox.org>2025-07-24 12:48:21 +1200
commitf953c730af2b90db99f709258c5d5e50fdcaadf7 (patch)
treeadbc79f0d48a74a42fd0eb22d85f03696a99dc42 /src/reader.cpp
parent06a2928d96b3d9aeaffb19013ba71a5cb6d96381 (diff)
downloadtehimage-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.cpp110
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;
+}