diff options
| author | Xavier Del Campo Romero <xavi92@disroot.org> | 2025-12-04 13:58:02 +0100 |
|---|---|---|
| committer | Xavier Del Campo Romero <xavi92@disroot.org> | 2025-12-15 23:04:39 +0100 |
| commit | 600ff28dd73f2cf17725382b68a4b1b2573f2e34 (patch) | |
| tree | a105c686458d8998438652aeca6299cf9000edcd /src/rez/dir.cpp | |
| download | globalops-main.tar.gz | |
Diffstat (limited to 'src/rez/dir.cpp')
| -rw-r--r-- | src/rez/dir.cpp | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/src/rez/dir.cpp b/src/rez/dir.cpp new file mode 100644 index 0000000..62e37fb --- /dev/null +++ b/src/rez/dir.cpp @@ -0,0 +1,117 @@ +#include <rez/dir.h> +#include <rez/io.h> +#include <iostream> + +const rez::dir::entrymap &rez::dir::entries() const +{ + return m_entries; +} + +const std::string &rez::dir::name() const +{ + return m_name; +} + +int rez::dir::read(const struct entry::cfg &cfg, rez::io &io, + std::string &name, direntry &de, unsigned level) +{ + rez::entry entry; + + if (entry.read(io)) + return -1; + + switch (entry.type) + { + case entry::type::dir: + { + long offset; + dir subdir; + + if (io.read(subdir.m_name, cfg.maxdirlen) + || (offset = io.tell()) < 0) + return -1; + + struct entry::cfg scfg = cfg; + +#if 0 + for (unsigned i = 0; i < level + 1; i++) + std::cout << "|\t"; + + std::cout << "name: " << subdir.m_name << std::endl; +#endif + + subdir.entry = entry; + scfg.size = entry.size; + scfg.offset = entry.pos; + + if (subdir.read(scfg, io, level + 1) || io.seek(offset)) + return -1; + + name = subdir.m_name; + de = subdir; + } + break; + + case entry::type::resource: + { + resource resource; + + resource.entry = entry; + + if (resource.read(cfg, io)) + return -1; + +#if 0 + for (unsigned i = 0; i < level + 1; i++) + std::cout << "|\t"; + + std::cout << "name: " << resource.name() << std::endl; +#endif + + name = resource.name(); + de = resource; + } + break; + + default: + std::cerr << "Invalid entry type " << entry.type << std::endl; + return -1; + } + + return 0; +} + +int rez::dir::read(const struct entry::cfg &cfg, rez::io &io, unsigned level) +{ + unsigned long size = cfg.size; + long before = cfg.offset; + + if (io.seek(cfg.offset)) + return -1; + + while (size) + { + std::string name; + direntry de; + long after; + + if (read(cfg, io, name, de, level) + || (after = io.tell()) < 0) + return -1; + + unsigned long r = after - before; + + if (r > size) + { + std::cerr << m_name << ": exceeded maximum direntry length " + "(" << cfg.size << ")" << std::endl; + return -1; + } + + m_entries[name] = de; + before = after; + size -= r; + } + + return 0; +} |
