diff options
author | 2021-12-14 21:38:14 -0500 | |
---|---|---|
committer | 2021-12-14 21:42:42 -0500 | |
commit | 1214aac0928e5c7ebe3484f06a5c9a000f9962ef (patch) | |
tree | 08e4ee14aa16c1fd721dfef0b9dc1eb28471eb8a /src/lib/formats/fsmgr.cpp | |
parent | 8a8b56bc24a398f5bda13b0e24a56012a1252353 (diff) |
Filesystem code cleanup
- Eliminate dependencies on emu.h, replacing most fatalerror calls and floptool's ersatz emu_fatalerror class with standard exception classes
- Use range-based std::string constructors in some methods
- Move filesystem metadata handling to a separate source file
- Eliminate src/emu as an include path for libformats (necessitates kludge in ti99_dsk.cpp)
Diffstat (limited to 'src/lib/formats/fsmgr.cpp')
-rw-r--r-- | src/lib/formats/fsmgr.cpp | 139 |
1 files changed, 50 insertions, 89 deletions
diff --git a/src/lib/formats/fsmgr.cpp b/src/lib/formats/fsmgr.cpp index fa48704f935..1fe13037418 100644 --- a/src/lib/formats/fsmgr.cpp +++ b/src/lib/formats/fsmgr.cpp @@ -5,9 +5,12 @@ // Currently limited to floppies and creation of preformatted images -#include "emu.h" #include "fsmgr.h" +#include "strformat.h" + +#include <stdexcept> + void fs_refcounted_inner::ref() { m_ref ++; @@ -100,17 +103,17 @@ char filesystem_manager_t::directory_separator() const void filesystem_t::format(const fs_meta_data &meta) { - fatalerror("format called on a filesystem not supporting it.\n"); + throw std::logic_error("format called on a filesystem not supporting it"); } filesystem_t::dir_t filesystem_t::root() { - fatalerror("root called on a filesystem not supporting it.\n"); + throw std::logic_error("root called on a filesystem not supporting it"); } fs_meta_data filesystem_t::metadata() { - fatalerror("filesystem_t::metadata called on a filesystem not supporting it.\n"); + throw std::logic_error("filesystem_t::metadata called on a filesystem not supporting it"); } void fsblk_t::set_block_size(uint32_t block_size) @@ -122,24 +125,24 @@ void fsblk_t::set_block_size(uint32_t block_size) uint8_t *fsblk_t::iblock_t::offset(const char *function, uint32_t off, uint32_t size) { if(off + size > m_size) - fatalerror("block_t::%s out-of-block access, offset=%d, size=%d, block size=%d\n", function, off, size, m_size); + throw std::out_of_range(util::string_format("block_t::%s out-of-block access, offset=%d, size=%d, block size=%d", function, off, size, m_size)); return data() + off; } const uint8_t *fsblk_t::iblock_t::rooffset(const char *function, uint32_t off, uint32_t size) { if(off + size > m_size) - fatalerror("block_t::%s out-of-block read access, offset=%d, size=%d, block size=%d\n", function, off, size, m_size); + throw std::out_of_range(util::string_format("block_t::%s out-of-block read access, offset=%d, size=%d, block size=%d\n", function, off, size, m_size)); return rodata() + off; } -void fsblk_t::block_t::copy(u32 offset, const uint8_t *src, u32 size) +void fsblk_t::block_t::copy(uint32_t offset, const uint8_t *src, uint32_t size) { uint8_t *blk = m_object->offset("copy", offset, size); memcpy(blk, src, size); } -void fsblk_t::block_t::fill(u32 offset, uint8_t data, u32 size) +void fsblk_t::block_t::fill(uint32_t offset, uint8_t data, uint32_t size) { uint8_t *blk = m_object->offset("fill", offset, size); memset(blk, data, size); @@ -151,26 +154,26 @@ void fsblk_t::block_t::fill(uint8_t data) memset(blk, data, m_object->size()); } -void fsblk_t::block_t::wstr(u32 offset, const std::string &str) +void fsblk_t::block_t::wstr(uint32_t offset, const std::string &str) { uint8_t *blk = m_object->offset("wstr", offset, str.size()); memcpy(blk, str.data(), str.size()); } -void fsblk_t::block_t::w8(u32 offset, uint8_t data) +void fsblk_t::block_t::w8(uint32_t offset, uint8_t data) { uint8_t *blk = m_object->offset("w8", offset, 1); blk[0] = data; } -void fsblk_t::block_t::w16b(u32 offset, u16 data) +void fsblk_t::block_t::w16b(uint32_t offset, uint16_t data) { uint8_t *blk = m_object->offset("w16b", offset, 2); blk[0] = data >> 8; blk[1] = data; } -void fsblk_t::block_t::w24b(u32 offset, u32 data) +void fsblk_t::block_t::w24b(uint32_t offset, uint32_t data) { uint8_t *blk = m_object->offset("w24b", offset, 3); blk[0] = data >> 16; @@ -178,7 +181,7 @@ void fsblk_t::block_t::w24b(u32 offset, u32 data) blk[2] = data; } -void fsblk_t::block_t::w32b(u32 offset, u32 data) +void fsblk_t::block_t::w32b(uint32_t offset, uint32_t data) { uint8_t *blk = m_object->offset("w32b", offset, 4); blk[0] = data >> 24; @@ -187,14 +190,14 @@ void fsblk_t::block_t::w32b(u32 offset, u32 data) blk[3] = data; } -void fsblk_t::block_t::w16l(u32 offset, u16 data) +void fsblk_t::block_t::w16l(uint32_t offset, uint16_t data) { uint8_t *blk = m_object->offset("w16l", offset, 2); blk[0] = data; blk[1] = data >> 8; } -void fsblk_t::block_t::w24l(u32 offset, u32 data) +void fsblk_t::block_t::w24l(uint32_t offset, uint32_t data) { uint8_t *blk = m_object->offset("w24l", offset, 3); blk[0] = data; @@ -202,7 +205,7 @@ void fsblk_t::block_t::w24l(u32 offset, u32 data) blk[2] = data >> 16; } -void fsblk_t::block_t::w32l(u32 offset, u32 data) +void fsblk_t::block_t::w32l(uint32_t offset, uint32_t data) { uint8_t *blk = m_object->offset("w32l", offset, 4); blk[0] = data; @@ -211,52 +214,49 @@ void fsblk_t::block_t::w32l(u32 offset, u32 data) blk[3] = data >> 24; } -std::string fsblk_t::block_t::rstr(u32 offset, u32 size) +std::string fsblk_t::block_t::rstr(uint32_t offset, uint32_t size) { - const u8 *d = m_object->rooffset("rstr", offset, size); - std::string res; - for(u32 i=0; i != size; i++) - res += char(*d++); - return res; + const uint8_t *d = m_object->rooffset("rstr", offset, size); + return std::string(d, d + size); } -uint8_t fsblk_t::block_t::r8(u32 offset) +uint8_t fsblk_t::block_t::r8(uint32_t offset) { const uint8_t *blk = m_object->offset("r8", offset, 1); return blk[0]; } -uint16_t fsblk_t::block_t::r16b(u32 offset) +uint16_t fsblk_t::block_t::r16b(uint32_t offset) { const uint8_t *blk = m_object->offset("r16b", offset, 2); return (blk[0] << 8) | blk[1]; } -uint32_t fsblk_t::block_t::r24b(u32 offset) +uint32_t fsblk_t::block_t::r24b(uint32_t offset) { const uint8_t *blk = m_object->offset("r24b", offset, 3); return (blk[0] << 16) | (blk[1] << 8) | blk[2]; } -uint32_t fsblk_t::block_t::r32b(u32 offset) +uint32_t fsblk_t::block_t::r32b(uint32_t offset) { const uint8_t *blk = m_object->offset("r32b", offset, 4); return (blk[0] << 24) | (blk[1] << 16) | (blk[2] << 8) | blk[3]; } -uint16_t fsblk_t::block_t::r16l(u32 offset) +uint16_t fsblk_t::block_t::r16l(uint32_t offset) { const uint8_t *blk = m_object->offset("r16l", offset, 2); return blk[0] | (blk[1] << 8); } -uint32_t fsblk_t::block_t::r24l(u32 offset) +uint32_t fsblk_t::block_t::r24l(uint32_t offset) { const uint8_t *blk = m_object->offset("r24l", offset, 3); return blk[0] | (blk[1] << 8) | (blk[2] << 16); } -uint32_t fsblk_t::block_t::r32l(u32 offset) +uint32_t fsblk_t::block_t::r32l(uint32_t offset) { const uint8_t *blk = m_object->offset("r32l", offset, 4); return blk[0] | (blk[1] << 8) | (blk[2] << 16) | (blk[3] << 24); @@ -264,12 +264,12 @@ uint32_t fsblk_t::block_t::r32l(u32 offset) -void filesystem_t::copy(uint8_t *p, const uint8_t *src, u32 size) +void filesystem_t::copy(uint8_t *p, const uint8_t *src, uint32_t size) { memcpy(p, src, size); } -void filesystem_t::fill(uint8_t *p, uint8_t data, u32 size) +void filesystem_t::fill(uint8_t *p, uint8_t data, uint32_t size) { memset(p, data, size); } @@ -284,20 +284,20 @@ void filesystem_t::w8(uint8_t *p, uint8_t data) p[0] = data; } -void filesystem_t::w16b(uint8_t *p, u16 data) +void filesystem_t::w16b(uint8_t *p, uint16_t data) { p[0] = data >> 8; p[1] = data; } -void filesystem_t::w24b(uint8_t *p, u32 data) +void filesystem_t::w24b(uint8_t *p, uint32_t data) { p[0] = data >> 16; p[1] = data >> 8; p[2] = data; } -void filesystem_t::w32b(uint8_t *p, u32 data) +void filesystem_t::w32b(uint8_t *p, uint32_t data) { p[0] = data >> 24; p[1] = data >> 16; @@ -305,20 +305,20 @@ void filesystem_t::w32b(uint8_t *p, u32 data) p[3] = data; } -void filesystem_t::w16l(uint8_t *p, u16 data) +void filesystem_t::w16l(uint8_t *p, uint16_t data) { p[0] = data; p[1] = data >> 8; } -void filesystem_t::w24l(uint8_t *p, u32 data) +void filesystem_t::w24l(uint8_t *p, uint32_t data) { p[0] = data; p[1] = data >> 8; p[2] = data >> 16; } -void filesystem_t::w32l(uint8_t *p, u32 data) +void filesystem_t::w32l(uint8_t *p, uint32_t data) { p[0] = data; p[1] = data >> 8; @@ -326,12 +326,9 @@ void filesystem_t::w32l(uint8_t *p, u32 data) p[3] = data >> 24; } -std::string filesystem_t::rstr(const uint8_t *p, u32 size) +std::string filesystem_t::rstr(const uint8_t *p, uint32_t size) { - std::string res; - for(u32 i=0; i != size; i++) - res += char(*p++); - return res; + return std::string(p, p + size); } uint8_t filesystem_t::r8(const uint8_t *p) @@ -377,77 +374,41 @@ std::string filesystem_t::trim_end_spaces(const std::string &str) filesystem_t::file_t filesystem_t::idir_t::file_create(const fs_meta_data &info) { - fatalerror("file_create called on a filesystem not supporting write\n"); + throw std::logic_error("file_create called on a filesystem not supporting write"); } void filesystem_t::idir_t::file_delete(uint64_t key) { - fatalerror("file_delete called on a filesystem not supporting write\n"); + throw std::logic_error("file_delete called on a filesystem not supporting write"); } -void filesystem_t::ifile_t::replace(const std::vector<u8> &data) +void filesystem_t::ifile_t::replace(const std::vector<uint8_t> &data) { - fatalerror("replace called on a filesystem not supporting write \n"); + throw std::logic_error("replace called on a filesystem not supporting write"); } -void filesystem_t::ifile_t::rsrc_replace(const std::vector<u8> &data) +void filesystem_t::ifile_t::rsrc_replace(const std::vector<uint8_t> &data) { - fatalerror("rsrc_replace called on a filesystem not supporting write or resource forks \n"); + throw std::logic_error("rsrc_replace called on a filesystem not supporting write or resource forks"); } void filesystem_t::ifile_t::metadata_change(const fs_meta_data &info) { - fatalerror("metadata_change called on a filesystem not supporting write \n"); + throw std::logic_error("metadata_change called on a filesystem not supporting write"); } void filesystem_t::idir_t::metadata_change(const fs_meta_data &info) { - fatalerror("metadata_change called on a filesystem not supporting write \n"); + throw std::logic_error("metadata_change called on a filesystem not supporting write"); } void filesystem_t::metadata_change(const fs_meta_data &info) { - fatalerror("metadata_change called on a filesystem not supporting write \n"); -} - -std::vector<u8> filesystem_t::ifile_t::rsrc_read_all() -{ - fatalerror("rsrc_read_all called on a filesystem without resource forks\n"); + throw std::logic_error("metadata_change called on a filesystem not supporting write"); } -const char *fs_meta_data::entry_name(fs_meta_name name) +std::vector<uint8_t> filesystem_t::ifile_t::rsrc_read_all() { - switch(name) { - case fs_meta_name::basic: return "basic"; - case fs_meta_name::creation_date: return "creation_date"; - case fs_meta_name::length: return "length"; - case fs_meta_name::loading_address: return "loading_address"; - case fs_meta_name::locked: return "locked"; - case fs_meta_name::modification_date: return "modification_date"; - case fs_meta_name::name: return "name"; - case fs_meta_name::os_minimum_version: return "os_minimum_version"; - case fs_meta_name::os_version: return "os_version"; - case fs_meta_name::rsrc_length: return "rsrc_length"; - case fs_meta_name::sequential: return "sequential"; - case fs_meta_name::size_in_blocks: return "size_in_blocks"; - } - return ""; + throw std::logic_error("rsrc_read_all called on a filesystem without resource forks"); } - -std::string fs_meta::to_string(fs_meta_type type, const fs_meta &m) -{ - switch(type) { - case fs_meta_type::string: return m.as_string(); - case fs_meta_type::number: return util::string_format("0x%x", m.as_number()); - case fs_meta_type::flag: return m.as_flag() ? "t" : "f"; - case fs_meta_type::date: { - auto dt = m.as_date(); - return util::string_format("%04d-%02d-%02d %02d:%02d:%02d", - dt.year, dt.month, dt.day_of_month, - dt.hour, dt.minute, dt.second); - } - } - return std::string(""); -} - |