#include #include #include #include #include std::string rez::file::path() const { return resource.name(); } long rez::file::tell() { return offset; } int rez::file::seek(long offset) { if (offset < 0 || offset > resource.entry.size) return -1; else if (io.seek(resource.entry.pos + offset)) return -1; this->offset = offset; return 0; } int rez::file::eof() const { return offset >= resource.entry.size; } int rez::file::read(void *b, size_t n) { const rez::entry &entry = resource.entry; unsigned long roffset = offset + entry.pos, end = entry.pos + entry.size, remaining = end - roffset; if (n > remaining) { std::cerr << path() << ": requested " << n << " bytes, only " << remaining << " remaining" << std::endl; return -1; } if (seek(offset) || io.read(b, n)) return -1; offset += n; return 0; } int rez::file::read(unsigned char &b) { return read(&b, sizeof b); } int rez::file::read(std::string &s, size_t len) { for (size_t i = 0; i < len; i++) { char b; if (read(&b, sizeof b)) return -1; s += b; } return 0; } int rez::file::read_le(uint16_t &w) { unsigned char b[sizeof w]; if (read(b, sizeof b)) return -1; w = b[0] | (b[1] << 8); return 0; } int rez::file::read_le(uint32_t &w) { unsigned char b[sizeof w]; if (read(b, sizeof b)) return -1; w = b[0] | (b[1] << 8u) | (b[2] << 16u) | (b[3] << 24u); return 0; } rez::file::file(const rez::resource &resource, rez::io &io) : resource(resource), offset(0), io(io) { }