diff options
Diffstat (limited to 'src/lib/formats/jfd_dsk.cpp')
-rw-r--r-- | src/lib/formats/jfd_dsk.cpp | 53 |
1 files changed, 35 insertions, 18 deletions
diff --git a/src/lib/formats/jfd_dsk.cpp b/src/lib/formats/jfd_dsk.cpp index 7f2dc52e23b..46e933cedf1 100644 --- a/src/lib/formats/jfd_dsk.cpp +++ b/src/lib/formats/jfd_dsk.cpp @@ -2,7 +2,7 @@ // copyright-holders:Nigel Barnes /********************************************************************* - formats/jfd_dsk.c + formats/jfd_dsk.cpp JASPP Floppy Disk image format @@ -158,9 +158,16 @@ *********************************************************************/ -#include <zlib.h> #include "formats/jfd_dsk.h" +#include "ioprocs.h" +#include "multibyte.h" + +#include "osdcore.h" // osd_printf_* + +#include <zlib.h> + + static const uint8_t JFD_HEADER[4] = { 'J', 'F', 'D', 'I' }; static const uint8_t GZ_HEADER[2] = { 0x1f, 0x8b }; @@ -168,26 +175,31 @@ jfd_format::jfd_format() { } -const char *jfd_format::name() const +const char *jfd_format::name() const noexcept { return "jfd"; } -const char *jfd_format::description() const +const char *jfd_format::description() const noexcept { return "JASPP Floppy Disk image"; } -const char *jfd_format::extensions() const +const char *jfd_format::extensions() const noexcept { return "jfd"; } -int jfd_format::identify(io_generic *io, uint32_t form_factor) +int jfd_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) const { - uint64_t size = io_generic_size(io); + uint64_t size; + if (io.length(size) || !size) + return 0; + std::vector<uint8_t> img(size); - io_generic_read(io, &img[0], 0, size); + auto const [ioerr, actual] = read_at(io, 0, &img[0], size); + if (ioerr || (actual != size)) + return 0; int err; std::vector<uint8_t> gz_ptr(4); @@ -211,26 +223,31 @@ int jfd_format::identify(io_generic *io, uint32_t form_factor) err = inflateEnd(&d_stream); if (err != Z_OK) return 0; - img = gz_ptr; + img = std::move(gz_ptr); } if (!memcmp(&img[0], JFD_HEADER, sizeof(JFD_HEADER))) { - return 100; + return FIFID_SIGN; } return 0; } -bool jfd_format::load(io_generic *io, uint32_t form_factor, floppy_image *image) +bool jfd_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image &image) const { - uint64_t size = io_generic_size(io); + uint64_t size; + if (io.length(size)) + return false; + std::vector<uint8_t> img(size); - io_generic_read(io, &img[0], 0, size); + auto const [ioerr, actual] = read_at(io, 0, &img[0], size); + if (ioerr || (actual != size)) + return false; int err; std::vector<uint8_t> gz_ptr; z_stream d_stream; - int inflate_size = (img[size - 1] << 24) | (img[size - 2] << 16) | (img[size - 3] << 8) | img[size - 4]; + int inflate_size = get_u32le(&img[size - 4]); if (!memcmp(&img[0], GZ_HEADER, sizeof(GZ_HEADER))) { gz_ptr.resize(inflate_size); @@ -259,7 +276,7 @@ bool jfd_format::load(io_generic *io, uint32_t form_factor, floppy_image *image) return false; } size = inflate_size; - img = gz_ptr; + img = std::move(gz_ptr); } osd_printf_verbose("jfd_dsk: loading %s\n", &img[48]); @@ -352,14 +369,14 @@ bool jfd_format::load(io_generic *io, uint32_t form_factor, floppy_image *image) build_wd_track_mfm(track / 2, track % 2, image, den[0] * 50000, spt, sects, 90, 32, 22); } } - image->set_variant(floppy_image::DSDD); + image.set_variant(floppy_image::DSDD); return true; } -bool jfd_format::supports_save() const +bool jfd_format::supports_save() const noexcept { return false; } -const floppy_format_type FLOPPY_JFD_FORMAT = &floppy_image_format_creator<jfd_format>; +const jfd_format FLOPPY_JFD_FORMAT; |