#include #include #include namespace Util { std::vector OpenROM(const std::string &filename, size_t &sizeAdjusted) { auto buf = ircolib::read_file_binary(filename); sizeAdjusted = ircolib::next_pow2(buf.size()); return buf; } std::vector OpenArchive(const std::string &path, size_t &sizeAdjusted) { const auto stream = ar_open_file(fs::path(path).string().c_str()); if (!stream) { ircolib::panic("Could not open archive! Are you sure it's an archive?"); } ar_archive *archive = ar_open_zip_archive(stream, false); if (!archive) archive = ar_open_rar_archive(stream); if (!archive) archive = ar_open_7z_archive(stream); if (!archive) archive = ar_open_tar_archive(stream); if (!archive) { ar_close(stream); ircolib::panic( "Could not open archive! Are you sure it's a supported archive? (7z, zip, rar and tar are supported)"); } std::vector buf{}; std::vector rom_exts{".n64", ".z64", ".v64", ".N64", ".Z64", ".V64"}; while (ar_parse_entry(archive)) { auto filename = ar_entry_get_name(archive); auto extension = fs::path(filename).extension(); if (std::ranges::any_of(rom_exts, [&](const auto &x) { return extension == x; })) { const auto size = ar_entry_get_size(archive); sizeAdjusted = ircolib::next_pow2(size); buf.resize(sizeAdjusted); ar_entry_uncompress(archive, buf.data(), size); break; } ar_close_archive(archive); ar_close(stream); ircolib::panic("Could not find any rom image in the archive!"); } ar_close_archive(archive); ar_close(stream); return buf; } } // namespace Util