Sfoglia il codice sorgente

improved filename extract code and name_from_image switch

phe78 2 anni fa
parent
commit
0487ac21a9
2 ha cambiato i file con 45 aggiunte e 31 eliminazioni
  1. 42 31
      src/ZuluSCSI_disk.cpp
  2. 3 0
      src/ZuluSCSI_disk.h

+ 42 - 31
src/ZuluSCSI_disk.cpp

@@ -230,21 +230,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];
 
@@ -262,8 +280,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)
@@ -295,28 +311,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')
@@ -425,7 +429,13 @@ bool scsiDiskOpenHDDImage(int target_idx, const char *filename, int scsi_id, int
         PLATFORM_CONFIG_HOOK(&img);
 #endif
 
-        setDefaultDriveInfo(target_idx, filename);
+        if (img.name_from_image) 
+        { 
+            setNameFromImage(img, filename); 
+            logmsg("Vendor / product id set from image file name");
+        }
+
+        setDefaultDriveInfo(target_idx);
 
         if (img.prefetchbytes > 0)
         {
@@ -555,8 +565,9 @@ static void scsiDiskLoadConfig(int target_idx, const char *section)
     img.deviceTypeModifier = ini_getl(section, "TypeModifier", img.deviceTypeModifier, CONFIGFILE);
     img.sectorsPerTrack = ini_getl(section, "SectorsPerTrack", img.sectorsPerTrack, CONFIGFILE);
     img.headsPerCylinder = ini_getl(section, "HeadsPerCylinder", img.headsPerCylinder, CONFIGFILE);
-    img.quirks = ini_getl(section, "Quirks", img.quirks, 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/ZuluSCSI_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;