Explorar o código

improved filename extract code and name_from_image switch

phe78 %!s(int64=2) %!d(string=hai) anos
pai
achega
e252cb9a85
Modificáronse 3 ficheiros con 43 adicións e 31 borrados
  1. 0 1
      lib/SCSI2SD/include/scsi2sd.h
  2. 40 30
      src/BlueSCSI_disk.cpp
  3. 3 0
      src/BlueSCSI_disk.h

+ 0 - 1
lib/SCSI2SD/include/scsi2sd.h

@@ -84,7 +84,6 @@ typedef enum
 	S2S_CFG_QUIRKS_OMTI = 2,
 	S2S_CFG_QUIRKS_XEBEC = 4,
 	S2S_CFG_QUIRKS_VMS = 8,
-	S2S_CFG_QUIRKS_EMU = 9
 } S2S_CFG_QUIRKS;
 
 typedef enum

+ 40 - 30
src/BlueSCSI_disk.cpp

@@ -218,21 +218,39 @@ static void formatDriveInfoField(char *field, int fieldsize, bool align_right)
 }
 
 // remove path and extension from filename
-const char* get_image_name(const char* filename)
-{
-    char *j, *r;
+void extractFileName(const char* path, char* output) {
+
+    const char *lastSlash, *lastDot;
+    int fileNameLength;
+
+    lastSlash = strrchr(path, '/');
+    if (!lastSlash) lastSlash = path;
+        else lastSlash++;
+
+    lastDot = strrchr(lastSlash, '.');
+    if (lastDot && (lastDot > lastSlash)) {
+        fileNameLength = lastDot - lastSlash;
+        strncpy(output, lastSlash, fileNameLength);
+        output[fileNameLength] = '\0';
+    } else {
+        strcpy(output, lastSlash);
+    }
+}
 
-    r = (char *)malloc(strlen(filename));
-    strcpy(r, strrchr(filename,'/') + 5);
-    j = strrchr(r, '.');
-    *j = '\0';
+void setNameFromImage(image_config_t &img, const char *filename) {
 
-   return r;
+    char image_name[MAX_FILE_PATH];
+
+    extractFileName(filename, image_name);
+    memset(img.vendor, 0, 8);
+    strncpy(img.vendor, image_name, 8);
+    memset(img.prodId, 0, 8);
+    strncpy(img.prodId, image_name+8, 8);
 }
 
 // Set default drive vendor / product info after the image file
 // is loaded and the device type is known.
-static void setDefaultDriveInfo(int target_idx, const char* filename)
+static void setDefaultDriveInfo(int target_idx)
 {
     image_config_t &img = g_DiskImages[target_idx];
 
@@ -250,8 +268,6 @@ static void setDefaultDriveInfo(int target_idx, const char* filename)
     static const char *apl_driveinfo_magopt[4]    = APPLE_DRIVEINFO_MAGOPT;
     static const char *apl_driveinfo_tape[4]      = APPLE_DRIVEINFO_TAPE;
 
-    static const char *image_name;
-
     const char **driveinfo = NULL;
 
     if (img.quirks == S2S_CFG_QUIRKS_APPLE)
@@ -283,28 +299,16 @@ static void setDefaultDriveInfo(int target_idx, const char* filename)
         }
     }
 
-    if (img.quirks == S2S_CFG_QUIRKS_EMU)
+    if (img.vendor[0] == '\0')
     {
-            image_name = get_image_name(filename);
-            memset(img.vendor, 0, 8);
-            strncpy(img.vendor, image_name, 8);
-            memset(img.prodId, 0, 8);
-            strncpy(img.prodId, image_name+8, 8);
+        memset(img.vendor, 0, sizeof(img.vendor));
+        strncpy(img.vendor, driveinfo[0], sizeof(img.vendor));
     }
 
-    else
+    if (img.prodId[0] == '\0')
     {
-        if (img.vendor[0] == '\0')
-        {
-            memset(img.vendor, 0, sizeof(img.vendor));
-            strncpy(img.vendor, driveinfo[0], sizeof(img.vendor));
-        }
-
-        if (img.prodId[0] == '\0')
-        {
-            memset(img.prodId, 0, sizeof(img.prodId));
-            strncpy(img.prodId, driveinfo[1], sizeof(img.prodId));
-        }
+        memset(img.prodId, 0, sizeof(img.prodId));
+        strncpy(img.prodId, driveinfo[1], sizeof(img.prodId));
     }
 
     if (img.revision[0] == '\0')
@@ -417,8 +421,13 @@ bool scsiDiskOpenHDDImage(int target_idx, const char *filename, int scsi_id, int
         {
             debuglog("---- Read prefetch enabled: ", (int)img.prefetchbytes, " bytes");
         }
+        if (img.name_from_image)
+        {
+            setNameFromImage(img, filename);
+            log("Vendor / product id set from image file name");
+        }
 
-        setDefaultDriveInfo(target_idx, filename);
+        setDefaultDriveInfo(target_idx);
 
 #ifdef PLATFORM_CONFIG_HOOK
         PLATFORM_CONFIG_HOOK(&img);
@@ -552,6 +561,7 @@ static void scsiDiskLoadConfig(int target_idx, const char *section)
     img.bytesPerSector = ini_getl(section, "BlockSize", img.bytesPerSector, CONFIGFILE);
     img.quirks = ini_getl(section, "Quirks", img.quirks, CONFIGFILE);
     img.rightAlignStrings = ini_getbool(section, "RightAlignStrings", 0, CONFIGFILE);
+    img.name_from_image = ini_getbool(section, "NameFromImage", 0, CONFIGFILE);
     img.prefetchbytes = ini_getl(section, "PrefetchBytes", img.prefetchbytes, CONFIGFILE);
     img.reinsert_on_inquiry = ini_getbool(section, "ReinsertCDOnInquiry", img.reinsert_on_inquiry, CONFIGFILE);
     img.reinsert_after_eject = ini_getbool(section, "ReinsertAfterEject", img.reinsert_after_eject, CONFIGFILE);

+ 3 - 0
src/BlueSCSI_disk.h

@@ -78,6 +78,9 @@ struct image_config_t: public S2S_TargetCfg
     // This field uses -1 for default when field is not set in .ini
     int rightAlignStrings;
 
+    // Set Vendor / Product Id from image file name
+    bool name_from_image;
+
     // Maximum amount of bytes to prefetch
     int prefetchbytes;