foxygit / doom Log in
commit 2471097d1b5d9c44349c0a6f18196178f53be25f
Author:     Fabian Greffrath <fabian@greffrath.com>
AuthorDate: Mon Mar 27 11:38:52 2023 +0200
Commit:     Fabian Greffrath <fabian@greffrath.com>
CommitDate: Mon Mar 27 11:45:57 2023 +0200

    check if drag-n-dropped .lmp files could be demo lumps

    and pass them to the -playdemo parameter if appropriate.

    @JNechaevsky @Dasperal @rfomin
---
 src/m_argv.c | 95 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 89 insertions(+), 6 deletions(-)

diff --git a/src/m_argv.c b/src/m_argv.c
index 193910f0..fb953d5f 100644
--- a/src/m_argv.c
+++ b/src/m_argv.c
@@ -291,14 +291,76 @@ enum
     FILETYPE_IWAD =    0x2,
     FILETYPE_PWAD =    0x4,
     FILETYPE_DEH =     0x8,
+    FILETYPE_DEMO =    0x10,
 };

+static boolean FileIsDemoLump(const char *filename)
+{
+    FILE *handle;
+    int count, ver;
+    byte buf[12], *p = buf;
+
+    handle = M_fopen(filename, "rb");
+
+    if (handle == NULL)
+    {
+        return false;
+    }
+
+    count = fread(buf, 1, sizeof(buf), handle);
+    fclose(handle);
+
+    if (count != sizeof(buf))
+    {
+        return false;
+    }
+
+    ver = *p++;
+
+    if (ver >= 0 && ver <= 4) // v1.0/v1.1/v1.2
+    {
+        p--;
+    }
+    else
+    {
+        switch (ver)
+        {
+            case 104: // v1.4
+            case 105: // v1.5
+            case 106: // v1.6/v1.666
+            case 107: // v1.7/v1.7a
+            case 108: // v1.8
+            case 109: // v1.9
+            case 111: // v1.91 hack
+                break;
+            default:
+                return false;
+                break;
+        }
+    }
+
+    if (*p++ > 5) // skill
+    {
+        return false;
+    }
+    if (*p++ > 9) // episode
+    {
+        return false;
+    }
+    if (*p++ > 99) // map
+    {
+        return false;
+    }
+
+    return true;
+}
+
 static int GuessFileType(const char *name)
 {
     int ret = FILETYPE_UNKNOWN;
     const char *base;
     char *lower;
-    static boolean iwad_found = false;
+    static boolean iwad_found = false, demo_found = false;

     base = M_BaseName(name);
     lower = M_StringDuplicate(base);
@@ -311,11 +373,24 @@ static int GuessFileType(const char *name)
         ret = FILETYPE_IWAD;
         iwad_found = true;
     }
-    else if (M_StringEndsWith(lower, ".wad") ||
-             M_StringEndsWith(lower, ".lmp"))
+    else if (M_StringEndsWith(lower, ".wad"))
     {
         ret = FILETYPE_PWAD;
     }
+    else if (M_StringEndsWith(lower, ".lmp"))
+    {
+        // only ever add one argument to the -playdemo parameter
+
+        if (demo_found == false && FileIsDemoLump(name))
+        {
+            ret = FILETYPE_DEMO;
+            demo_found = true;
+        }
+        else
+        {
+            ret = FILETYPE_PWAD;
+        }
+    }
     else if (M_StringEndsWith(lower, ".deh") ||
 //           M_StringEndsWith(lower, ".bex") ||
              M_StringEndsWith(lower, ".hhe") ||
@@ -356,10 +431,11 @@ void M_AddLooseFiles(void)
         return;
     }

-    // allocate space for up to three additional regular parameters
+    // allocate space for up to four additional regular parameters
+    // (-iwad, -merge, -deh, -playdemo)

-    arguments = malloc((myargc + 3) * sizeof(*arguments));
-    memset(arguments, 0, (myargc + 3) * sizeof(*arguments));
+    arguments = malloc((myargc + 4) * sizeof(*arguments));
+    memset(arguments, 0, (myargc + 4) * sizeof(*arguments));

     // check the command line and make sure it does not already
     // contain any regular parameters or response files
@@ -409,6 +485,12 @@ void M_AddLooseFiles(void)
         arguments[myargc].type = FILETYPE_DEH - 1;
         myargc++;
     }
+    if (types & FILETYPE_DEMO)
+    {
+        arguments[myargc].str = M_StringDuplicate("-playdemo");
+        arguments[myargc].type = FILETYPE_DEMO - 1;
+        myargc++;
+    }

     newargv = malloc(myargc * sizeof(*newargv));

@@ -426,6 +508,7 @@ void M_AddLooseFiles(void)

     free(arguments);

+    free(myargv);
     myargv = newargv;
 }
 #endif