diff --git a/src/config.c b/src/config.c index b480eeb1e..26a74ab74 100644 --- a/src/config.c +++ b/src/config.c @@ -1352,9 +1352,10 @@ load_floppy_and_cdrom_drives(void) fatal("load_floppy_and_cdrom_drives(): strlen(p) > 511 " "(fdd_image_history[%i][%i])\n", c, i); else - strncpy(fdd_image_history[c][i], p, 511); + snprintf(fdd_image_history[c][i], 511, "%s", p); } else - path_append_filename(fdd_image_history[c][i], usr_path, p); + snprintf(fdd_image_history[c][i], 511, "%s%$s%s", usr_path, + path_get_slash(usr_path), p); path_normalize(fdd_image_history[c][i]); } } @@ -1452,6 +1453,24 @@ load_floppy_and_cdrom_drives(void) if ((cdrom[c].host_drive == 0x200) && (strlen(cdrom[c].image_path) == 0)) cdrom[c].host_drive = 0; + for (int i = 0; i < MAX_PREV_IMAGES; i++) { + cdrom[c].image_history[i] = (char *) calloc(MAX_IMAGE_PATH_LEN + 1, sizeof(char)); + sprintf(temp, "cdrom_%02i_image_history_%02i", c + 1, i + 1); + p = ini_section_get_string(cat, temp, NULL); + if (p) { + if (path_abs(p)) { + if (strlen(p) > 511) + fatal("load_floppy_and_cdrom_drives(): strlen(p) > 511 " + "(cdrom[%i].image_history[%i])\n", c, i); + else + snprintf(cdrom[c].image_history[i], 511, "%s", p); + } else + snprintf(cdrom[c].image_history[i], 511, "%s%$s%s", usr_path, + path_get_slash(usr_path), p); + path_normalize(cdrom[c].image_history[i]); + } + } + /* If the CD-ROM is disabled, delete all its variables. */ if (cdrom[c].bus_type == CDROM_BUS_DISABLED) { sprintf(temp, "cdrom_%02i_host_drive", c + 1); @@ -1468,27 +1487,15 @@ load_floppy_and_cdrom_drives(void) sprintf(temp, "cdrom_%02i_image_path", c + 1); ini_section_delete_var(cat, temp); + + for (int i = 0; i < MAX_PREV_IMAGES; i++) { + sprintf(temp, "cdrom_%02i_image_history_%02i", c + 1, i + 1); + ini_section_delete_var(cat, temp); + } } sprintf(temp, "cdrom_%02i_iso_path", c + 1); ini_section_delete_var(cat, temp); - - for (int i = 0; i < MAX_PREV_IMAGES; i++) { - cdrom[c].image_history[i] = (char *) calloc(MAX_IMAGE_PATH_LEN + 1, sizeof(char)); - sprintf(temp, "cdrom_%02i_image_history_%02i", c + 1, i + 1); - p = ini_section_get_string(cat, temp, NULL); - if (p) { - if (path_abs(p)) { - if (strlen(p) > 511) - fatal("load_floppy_and_cdrom_drives(): strlen(p) > 511 " - "(cdrom[%i].image_history[%i])\n", c, i); - else - strncpy(cdrom[c].image_history[i], p, 511); - } else - path_append_filename(cdrom[c].image_history[i], usr_path, p); - path_normalize(cdrom[c].image_history[i]); - } - } } } @@ -1646,7 +1653,25 @@ load_other_removable_devices(void) path_append_filename(zip_drives[c].image_path, usr_path, p); path_normalize(zip_drives[c].image_path); - /* If the CD-ROM is disabled, delete all its variables. */ + for (int i = 0; i < MAX_PREV_IMAGES; i++) { + zip_drives[c].image_history[i] = (char *) calloc(MAX_IMAGE_PATH_LEN + 1, sizeof(char)); + sprintf(temp, "zip_%02i_image_history_%02i", c + 1, i + 1); + p = ini_section_get_string(cat, temp, NULL); + if (p) { + if (path_abs(p)) { + if (strlen(p) > 511) + fatal("load_other_removable_devices(): strlen(p) > 511 " + "(zip_drives[%i].image_history[%i])\n", c, i); + else + snprintf(zip_drives[c].image_history[i], 511, "%s", p); + } else + snprintf(zip_drives[c].image_history[i], 511, "%s%$s%s", usr_path, + path_get_slash(usr_path), p); + path_normalize(zip_drives[c].image_history[i]); + } + } + + /* If the ZIP drive is disabled, delete all its variables. */ if (zip_drives[c].bus_type == ZIP_BUS_DISABLED) { sprintf(temp, "zip_%02i_host_drive", c + 1); ini_section_delete_var(cat, temp); @@ -1662,10 +1687,12 @@ load_other_removable_devices(void) sprintf(temp, "zip_%02i_image_path", c + 1); ini_section_delete_var(cat, temp); - } - sprintf(temp, "zip_%02i_iso_path", c + 1); - ini_section_delete_var(cat, temp); + for (int i = 0; i < MAX_PREV_IMAGES; i++) { + sprintf(temp, "zip_%02i_image_history_%02i", c + 1, i + 1); + ini_section_delete_var(cat, temp); + } + } } memset(temp, 0x00, sizeof(temp)); @@ -1736,7 +1763,25 @@ load_other_removable_devices(void) path_append_filename(mo_drives[c].image_path, usr_path, p); path_normalize(mo_drives[c].image_path); - /* If the CD-ROM is disabled, delete all its variables. */ + for (int i = 0; i < MAX_PREV_IMAGES; i++) { + mo_drives[c].image_history[i] = (char *) calloc(MAX_IMAGE_PATH_LEN + 1, sizeof(char)); + sprintf(temp, "mo_%02i_image_history_%02i", c + 1, i + 1); + p = ini_section_get_string(cat, temp, NULL); + if (p) { + if (path_abs(p)) { + if (strlen(p) > 511) + fatal("load_other_removable_devices(): strlen(p) > 511 " + "(mo_drives[%i].image_history[%i])\n", c, i); + else + snprintf(mo_drives[c].image_history[i], 511, "%s", p); + } else + snprintf(mo_drives[c].image_history[i], 511, "%s%$s%s", usr_path, + path_get_slash(usr_path), p); + path_normalize(mo_drives[c].image_history[i]); + } + } + + /* If the MO drive is disabled, delete all its variables. */ if (mo_drives[c].bus_type == MO_BUS_DISABLED) { sprintf(temp, "mo_%02i_host_drive", c + 1); ini_section_delete_var(cat, temp); @@ -1752,10 +1797,12 @@ load_other_removable_devices(void) sprintf(temp, "mo_%02i_image_path", c + 1); ini_section_delete_var(cat, temp); - } - sprintf(temp, "mo_%02i_iso_path", c + 1); - ini_section_delete_var(cat, temp); + for (int i = 0; i < MAX_PREV_IMAGES; i++) { + sprintf(temp, "mo_%02i_image_history_%02i", c + 1, i + 1); + ini_section_delete_var(cat, temp); + } + } } } diff --git a/src/include/86box/mo.h b/src/include/86box/mo.h index a11c4d636..99b985635 100644 --- a/src/include/86box/mo.h +++ b/src/include/86box/mo.h @@ -27,6 +27,8 @@ #define MO_TIME 10.0 +#define MO_IMAGE_HISTORY 4 + typedef struct mo_type_t { uint32_t sectors; uint16_t bytes_per_sector; @@ -113,6 +115,8 @@ typedef struct mo_drive_t { char image_path[1024]; char prev_image_path[1024]; + char *image_history[MO_IMAGE_HISTORY]; + uint32_t type; uint32_t medium_size; uint32_t base; diff --git a/src/include/86box/path.h b/src/include/86box/path.h index 5ef0d9488..41ef5e65e 100644 --- a/src/include/86box/path.h +++ b/src/include/86box/path.h @@ -3,5 +3,6 @@ extern char *path_get_filename(char *s); extern char *path_get_extension(char *s); extern void path_append_filename(char *dest, const char *s1, const char *s2); extern void path_slash(char *path); +extern char *path_get_slash(char *path); extern void path_normalize(char *path); extern int path_abs(char *path); \ No newline at end of file diff --git a/src/include/86box/zip.h b/src/include/86box/zip.h index 9ff69d092..6e53fbf36 100644 --- a/src/include/86box/zip.h +++ b/src/include/86box/zip.h @@ -29,6 +29,8 @@ #define ZIP_250_SECTORS (489532) +#define ZIP_IMAGE_HISTORY 4 + enum { ZIP_BUS_DISABLED = 0, ZIP_BUS_ATAPI = 5, @@ -61,6 +63,8 @@ typedef struct zip_drive_t { char image_path[1024]; char prev_image_path[1024]; + char *image_history[ZIP_IMAGE_HISTORY]; + uint32_t is_250; uint32_t medium_size; uint32_t base; diff --git a/src/qt/qt_platform.cpp b/src/qt/qt_platform.cpp index 9e2264221..a8f9591d7 100644 --- a/src/qt/qt_platform.cpp +++ b/src/qt/qt_platform.cpp @@ -304,6 +304,18 @@ path_slash(char *path) path_normalize(path); } +char * +path_get_slash(char *path) +{ + auto len = strlen(path); + std::string ret = ""; + + if (path[len - 1] != '/') + ret = "/"; + + return (char *) ret.c_str(); +} + void path_append_filename(char *dest, const char *s1, const char *s2) { diff --git a/src/unix/unix.c b/src/unix/unix.c index c389c9c45..770822919 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -310,6 +310,17 @@ path_slash(char *path) path_normalize(path); } +char * +path_get_slash(char *path) +{ + char *ret = ""; + + if (path[strlen(path) - 1] != '/') + ret = "/"; + + return ret; +} + void plat_put_backslash(char *s) { diff --git a/src/win/win.c b/src/win/win.c index 3e3535a32..7314370ce 100644 --- a/src/win/win.c +++ b/src/win/win.c @@ -734,9 +734,20 @@ path_normalize(char *path) void path_slash(char *path) { - if ((path[strlen(path) - 1] != '\\') && (path[strlen(path) - 1] != '/')) { + if ((path[strlen(path) - 1] != '\\') && (path[strlen(path) - 1] != '/')) strcat(path, "\\"); - } +} + +/* Return a trailing (back)slash if necessary. */ +char * +path_get_slash(char *path) +{ + char *ret = ""; + + if ((path[strlen(path) - 1] != '\\') && (path[strlen(path) - 1] != '/')) + ret = "\\"; + + return ret; } /* Check if the given path is absolute or not. */