From 845eb582a68297448be1cbb811b3aede66db9974 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 16 Mar 2024 12:16:09 -0500 Subject: [PATCH] fix .dnm and .eft loading --- src/engine/engine.h | 2 +- src/engine/fileOps/fileOpsCommon.cpp | 23 ++++++++++++++++++++--- src/engine/fileOps/fileOpsCommon.h | 1 + src/gui/gui.cpp | 2 +- src/main.cpp | 2 +- 5 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/engine/engine.h b/src/engine/engine.h index 4ddd45ee8..4cfdbdc67 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -632,7 +632,7 @@ class DivEngine { void createNew(const char* description, String sysName, bool inBase64=true); void createNewFromDefaults(); // load a file. - bool load(unsigned char* f, size_t length); + bool load(unsigned char* f, size_t length, const char* nameHint=NULL); // play a binary command stream. bool playStream(unsigned char* f, size_t length); // get the playing stream. diff --git a/src/engine/fileOps/fileOpsCommon.cpp b/src/engine/fileOps/fileOpsCommon.cpp index 7610d6260..52e1d31be 100644 --- a/src/engine/fileOps/fileOpsCommon.cpp +++ b/src/engine/fileOps/fileOpsCommon.cpp @@ -19,10 +19,10 @@ #include "fileOpsCommon.h" -bool DivEngine::load(unsigned char* f, size_t slen) { +bool DivEngine::load(unsigned char* f, size_t slen, const char* nameHint) { unsigned char* file; size_t len; - if (slen<18) { + if (slen<21) { logE("too small!"); lastError="file is too small"; delete[] f; @@ -31,6 +31,21 @@ bool DivEngine::load(unsigned char* f, size_t slen) { if (!systemsRegistered) registerSystems(); + // step 0: get extension of file + String extS; + if (nameHint!=NULL) { + const char* ext=strrchr(nameHint,'.'); + if (ext!=NULL) { + for (; *ext; ext++) { + char i=*ext; + if (i>='A' && i<='Z') { + i+='a'-'A'; + } + extS+=i; + } + } + } + // step 1: try loading as a zlib-compressed file logD("trying zlib..."); try { @@ -128,7 +143,9 @@ bool DivEngine::load(unsigned char* f, size_t slen) { if (memcmp(file,DIV_DMF_MAGIC,16)==0) { return loadDMF(file,len); } else if (memcmp(file,DIV_FTM_MAGIC,18)==0) { - return loadFTM(file,len,false,false,false); + return loadFTM(file,len,(extS==".dnm"),false,(extS==".eft")); + } else if (memcmp(file,DIV_DNM_MAGIC,21)==0) { + return loadFTM(file,len,true,true,false); } else if (memcmp(file,DIV_FUR_MAGIC,16)==0) { return loadFur(file,len); } else if (memcmp(file,DIV_FUR_MAGIC_DS0,16)==0) { diff --git a/src/engine/fileOps/fileOpsCommon.h b/src/engine/fileOps/fileOpsCommon.h index e758f0ed5..1ba6eff8a 100644 --- a/src/engine/fileOps/fileOpsCommon.h +++ b/src/engine/fileOps/fileOpsCommon.h @@ -49,6 +49,7 @@ struct NotZlibException { #define DIV_DMF_MAGIC ".DelekDefleMask." #define DIV_FUR_MAGIC "-Furnace module-" #define DIV_FTM_MAGIC "FamiTracker Module" +#define DIV_DNM_MAGIC "Dn-FamiTracker Module" #define DIV_FC13_MAGIC "SMOD" #define DIV_FC14_MAGIC "FC14" #define DIV_S3M_MAGIC "SCRM" diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 151dd93e9..20060f536 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -2215,7 +2215,7 @@ int FurnaceGUI::load(String path) { return 1; } fclose(f); - if (!e->load(file,(size_t)len)) { + if (!e->load(file,(size_t)len,path.c_str())) { lastError=e->getLastError(); logE("could not open file!"); return 1; diff --git a/src/main.cpp b/src/main.cpp index 9c86b16c5..10e8bec5a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -612,7 +612,7 @@ int main(int argc, char** argv) { return 1; } fclose(f); - if (!e.load(file,(size_t)len)) { + if (!e.load(file,(size_t)len,fileName.c_str())) { reportError(fmt::sprintf("could not open file! (%s)",e.getLastError())); e.everythingOK(); finishLogFile();