diff options
author | 2021-10-05 03:34:45 +1100 | |
---|---|---|
committer | 2021-10-05 03:34:45 +1100 | |
commit | aeb9eae87469e67bc6a91caf3840c34c11d959fc (patch) | |
tree | 45bffedf374dbce47caca633ad7bda547592e6c9 /src/lib/formats/cbm_crt.cpp | |
parent | 33723892a3f06e678d817b36aef84364c32848ec (diff) |
util: Further API cleanups: (#8661)
* Turned `core_file` into an implementation of `random_read_write`.
* Turned PNG errors into a standard error category.
* Added a helper for generating what look like derived classes on-the-fly.
Diffstat (limited to 'src/lib/formats/cbm_crt.cpp')
-rw-r--r-- | src/lib/formats/cbm_crt.cpp | 50 |
1 files changed, 33 insertions, 17 deletions
diff --git a/src/lib/formats/cbm_crt.cpp b/src/lib/formats/cbm_crt.cpp index a61c3247844..2aca7688711 100644 --- a/src/lib/formats/cbm_crt.cpp +++ b/src/lib/formats/cbm_crt.cpp @@ -41,6 +41,8 @@ #include "cbm_crt.h" +#include "corefile.h" + #include "osdcore.h" // osd_printf_* @@ -134,9 +136,10 @@ std::string cbm_crt_get_card(util::core_file &file) { // read the header cbm_crt_header header; - file.read(&header, CRT_HEADER_LENGTH); + size_t actual; + std::error_condition err = file.read(&header, CRT_HEADER_LENGTH, actual); - if (memcmp(header.signature, CRT_SIGNATURE, 16) == 0) + if (!err && (CRT_HEADER_LENGTH == actual) && !memcmp(header.signature, CRT_SIGNATURE, 16)) { uint16_t hardware = pick_integer_be(header.hardware, 0, 2); @@ -153,11 +156,14 @@ std::string cbm_crt_get_card(util::core_file &file) bool cbm_crt_read_header(util::core_file &file, size_t *roml_size, size_t *romh_size, int *exrom, int *game) { + size_t actual; + // read the header cbm_crt_header header; - file.read(&header, CRT_HEADER_LENGTH); + if (file.read(&header, CRT_HEADER_LENGTH, actual)) + return false; - if (memcmp(header.signature, CRT_SIGNATURE, 16) != 0) + if ((CRT_HEADER_LENGTH != actual) || (memcmp(header.signature, CRT_SIGNATURE, 16) != 0)) return false; uint16_t hardware = pick_integer_be(header.hardware, 0, 2); @@ -177,11 +183,12 @@ bool cbm_crt_read_header(util::core_file &file, size_t *roml_size, size_t *romh_ while (!file.eof()) { cbm_crt_chip chip; - file.read(&chip, CRT_CHIP_LENGTH); + if (file.read(&chip, CRT_CHIP_LENGTH, actual) || (CRT_CHIP_LENGTH != actual)) + return false; - uint16_t address = pick_integer_be(chip.start_address, 0, 2); - uint16_t size = pick_integer_be(chip.image_size, 0, 2); - uint16_t type = pick_integer_be(chip.chip_type, 0, 2); + const uint16_t address = pick_integer_be(chip.start_address, 0, 2); + const uint16_t size = pick_integer_be(chip.image_size, 0, 2); + const uint16_t type = pick_integer_be(chip.chip_type, 0, 2); if (LOG) { @@ -198,7 +205,8 @@ bool cbm_crt_read_header(util::core_file &file, size_t *roml_size, size_t *romh_ default: osd_printf_verbose("Invalid CHIP loading address!\n"); break; } - file.seek(size, SEEK_CUR); + if (file.seek(size, SEEK_CUR)) + return false; } return true; @@ -211,25 +219,33 @@ bool cbm_crt_read_header(util::core_file &file, size_t *roml_size, size_t *romh_ bool cbm_crt_read_data(util::core_file &file, uint8_t *roml, uint8_t *romh) { + if (file.seek(CRT_HEADER_LENGTH, SEEK_SET)) + return false; + uint32_t roml_offset = 0; uint32_t romh_offset = 0; - file.seek(CRT_HEADER_LENGTH, SEEK_SET); - while (!file.eof()) { + size_t actual; + cbm_crt_chip chip; - file.read(&chip, CRT_CHIP_LENGTH); + if (file.read(&chip, CRT_CHIP_LENGTH, actual) || (CRT_CHIP_LENGTH != actual)) + return false; - uint16_t address = pick_integer_be(chip.start_address, 0, 2); - uint16_t size = pick_integer_be(chip.image_size, 0, 2); + const uint16_t address = pick_integer_be(chip.start_address, 0, 2); + const uint16_t size = pick_integer_be(chip.image_size, 0, 2); + std::error_condition err; switch (address) { - case 0x8000: file.read(roml + roml_offset, size); roml_offset += size; break; - case 0xa000: file.read(romh + romh_offset, size); romh_offset += size; break; - case 0xe000: file.read(romh + romh_offset, size); romh_offset += size; break; + case 0x8000: err = file.read(roml + roml_offset, size, actual); roml_offset += size; break; + case 0xa000: err = file.read(romh + romh_offset, size, actual); romh_offset += size; break; + case 0xe000: err = file.read(romh + romh_offset, size, actual); romh_offset += size; break; + // FIXME: surely one needs to report an error or skip over the data if the load address is not recognised? } + if (err) // TODO: check size - all bets are off if the address isn't recognised anyway + return false; } return true; |