diff options
author | 2021-10-05 03:34:45 +1100 | |
---|---|---|
committer | 2021-10-05 03:34:45 +1100 | |
commit | aeb9eae87469e67bc6a91caf3840c34c11d959fc (patch) | |
tree | 45bffedf374dbce47caca633ad7bda547592e6c9 /src/emu/diimage.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/emu/diimage.cpp')
-rw-r--r-- | src/emu/diimage.cpp | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/src/emu/diimage.cpp b/src/emu/diimage.cpp index 2c8d389c826..031ed46eb30 100644 --- a/src/emu/diimage.cpp +++ b/src/emu/diimage.cpp @@ -434,11 +434,13 @@ bool device_image_interface::run_hash(util::core_file &file, u32 skip_bytes, uti hashes.reset(); // figure out the size, and "cap" the skip bytes - u64 size = file.size(); - skip_bytes = (u32) std::min((u64) skip_bytes, size); + u64 size; + if (file.length(size)) + return false; + skip_bytes = u32(std::min<u64>(skip_bytes, size)); // seek to the beginning - file.seek(skip_bytes, SEEK_SET); + file.seek(skip_bytes, SEEK_SET); // TODO: check error return u64 position = skip_bytes; // keep on reading hashes @@ -448,9 +450,10 @@ bool device_image_interface::run_hash(util::core_file &file, u32 skip_bytes, uti uint8_t buffer[8192]; // read bytes - const u32 count = (u32) std::min(size - position, (u64) sizeof(buffer)); - const u32 actual_count = file.read(buffer, count); - if (actual_count == 0) + const size_t count = size_t(std::min<u64>(size - position, sizeof(buffer))); + size_t actual_count; + const std::error_condition filerr = file.read(buffer, count, actual_count); + if (filerr || !actual_count) return false; position += actual_count; @@ -460,7 +463,7 @@ bool device_image_interface::run_hash(util::core_file &file, u32 skip_bytes, uti hashes.end(); // cleanup - file.seek(0, SEEK_SET); + file.seek(0, SEEK_SET); // TODO: check error return return true; } |