SDL_gpu_shadercross: Treat all arguments after -- as positional

From 26bf9467d31c8cca2daadf93b43b70aa45a56d69 Mon Sep 17 00:00:00 2001
From: Anonymous Maarten <[EMAIL REDACTED]>
Date: Fri, 25 Oct 2024 20:14:20 +0200
Subject: [PATCH] Treat all arguments after -- as positional

---
 src/cli.c      | 185 ++++++++++++++++++++++++++-----------------------
 src/version.rc |   2 +-
 2 files changed, 98 insertions(+), 89 deletions(-)

diff --git a/src/cli.c b/src/cli.c
index c125262..a088390 100644
--- a/src/cli.c
+++ b/src/cli.c
@@ -53,104 +53,113 @@ int main(int argc, char *argv[])
     char *filename = NULL;
     size_t fileSize = 0;
     void *fileData = NULL;
+    bool accept_optionals = true;
 
     for (int i = 1; i < argc; i += 1) {
         char *arg = argv[i];
 
-        if (SDL_strcmp(arg, "-h") == 0 || SDL_strcmp(arg, "--help") == 0) {
-            print_help();
-            return 0;
-        } else if (SDL_strcmp(arg, "-s") == 0 || SDL_strcmp(arg, "--source") == 0) {
-            if (i + 1 >= argc) {
-                SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "%s requires an argument", arg);
-                print_help();
-                return 1;
-            }
-            i += 1;
-            if (SDL_strcasecmp(argv[i], "spirv") == 0) {
-                spirvSource = true;
-                sourceValid = true;
-            } else if (SDL_strcasecmp(argv[i], "hlsl") == 0) {
-                spirvSource = false;
-                sourceValid = true;
-            } else {
-                SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Unrecognized source input %s, source must be SPIRV or HLSL!", argv[i]);
+        if (accept_optionals && arg[0] == '-') {
+            if (SDL_strcmp(arg, "-h") == 0 || SDL_strcmp(arg, "--help") == 0) {
                 print_help();
-                return 1;
-            }
-        } else if (SDL_strcmp(arg, "-d") == 0 || SDL_strcmp(arg, "--dest") == 0) {
-            if (i + 1 >= argc) {
-                SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "%s requires an argument", arg);
-                print_help();
-                return 1;
-            }
-            i += 1;
-            if (SDL_strcasecmp(argv[i], "DXBC") == 0) {
-                destinationFormat = SDL_GPU_SHADERFORMAT_DXBC;
-                destinationValid = true;
-            } else if (SDL_strcasecmp(argv[i], "DXIL") == 0) {
-                destinationFormat = SDL_GPU_SHADERFORMAT_DXIL;
-                destinationValid = true;
-            } else if (SDL_strcasecmp(argv[i], "MSL") == 0) {
-                destinationFormat = SDL_GPU_SHADERFORMAT_MSL;
-                destinationValid = true;
-            } else if (SDL_strcasecmp(argv[i], "SPIRV") == 0) {
-                destinationFormat = SDL_GPU_SHADERFORMAT_SPIRV;
-                destinationValid = true;
-            } else {
-                SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Unrecognized destination input %s, destination must be DXBC, DXIL, MSL or SPIRV!", argv[i]);
-                print_help();
-                return 1;
-            }
-        } else if (SDL_strcmp(arg, "-t") == 0 || SDL_strcmp(arg, "--stage") == 0) {
-            if (i + 1 >= argc) {
-                SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "%s requires an argument", arg);
-                print_help();
-                return 1;
-            }
-            i += 1;
-            if (SDL_strcasecmp(argv[i], "vertex") == 0) {
-                shaderStage = SDL_SHADERCROSS_SHADERSTAGE_VERTEX;
-                stageValid = true;
-            } else if (SDL_strcasecmp(argv[i], "fragment") == 0) {
-                shaderStage = SDL_SHADERCROSS_SHADERSTAGE_FRAGMENT;
-                stageValid = true;
-            } else if (SDL_strcasecmp(argv[i], "compute") == 0) {
-                shaderStage = SDL_SHADERCROSS_SHADERSTAGE_COMPUTE;
-                stageValid = true;
+                return 0;
+            } else if (SDL_strcmp(arg, "-s") == 0 || SDL_strcmp(arg, "--source") == 0) {
+                if (i + 1 >= argc) {
+                    SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "%s requires an argument", arg);
+                    print_help();
+                    return 1;
+                }
+                i += 1;
+                if (SDL_strcasecmp(argv[i], "spirv") == 0) {
+                    spirvSource = true;
+                    sourceValid = true;
+                } else if (SDL_strcasecmp(argv[i], "hlsl") == 0) {
+                    spirvSource = false;
+                    sourceValid = true;
+                } else {
+                    SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Unrecognized source input %s, source must be SPIRV or HLSL!", argv[i]);
+                    print_help();
+                    return 1;
+                }
+            } else if (SDL_strcmp(arg, "-d") == 0 || SDL_strcmp(arg, "--dest") == 0) {
+                if (i + 1 >= argc) {
+                    SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "%s requires an argument", arg);
+                    print_help();
+                    return 1;
+                }
+                i += 1;
+                if (SDL_strcasecmp(argv[i], "DXBC") == 0) {
+                    destinationFormat = SDL_GPU_SHADERFORMAT_DXBC;
+                    destinationValid = true;
+                } else if (SDL_strcasecmp(argv[i], "DXIL") == 0) {
+                    destinationFormat = SDL_GPU_SHADERFORMAT_DXIL;
+                    destinationValid = true;
+                } else if (SDL_strcasecmp(argv[i], "MSL") == 0) {
+                    destinationFormat = SDL_GPU_SHADERFORMAT_MSL;
+                    destinationValid = true;
+                } else if (SDL_strcasecmp(argv[i], "SPIRV") == 0) {
+                    destinationFormat = SDL_GPU_SHADERFORMAT_SPIRV;
+                    destinationValid = true;
+                } else {
+                    SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Unrecognized destination input %s, destination must be DXBC, DXIL, MSL or SPIRV!", argv[i]);
+                    print_help();
+                    return 1;
+                }
+            } else if (SDL_strcmp(arg, "-t") == 0 || SDL_strcmp(arg, "--stage") == 0) {
+                if (i + 1 >= argc) {
+                    SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "%s requires an argument", arg);
+                    print_help();
+                    return 1;
+                }
+                i += 1;
+                if (SDL_strcasecmp(argv[i], "vertex") == 0) {
+                    shaderStage = SDL_SHADERCROSS_SHADERSTAGE_VERTEX;
+                    stageValid = true;
+                } else if (SDL_strcasecmp(argv[i], "fragment") == 0) {
+                    shaderStage = SDL_SHADERCROSS_SHADERSTAGE_FRAGMENT;
+                    stageValid = true;
+                } else if (SDL_strcasecmp(argv[i], "compute") == 0) {
+                    shaderStage = SDL_SHADERCROSS_SHADERSTAGE_COMPUTE;
+                    stageValid = true;
+                } else {
+                    SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Unrecognized shader stage input %s, must be vertex, fragment, or compute.", argv[i]);
+                    print_help();
+                    return 1;
+                }
+            } else if (SDL_strcmp(arg, "-e") == 0 || SDL_strcmp(arg, "--entrypoint") == 0) {
+                if (i + 1 >= argc) {
+                    SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "%s requires an argument", arg);
+                    print_help();
+                    return 1;
+                }
+                i += 1;
+                entrypointName = argv[i];
+            } else if (SDL_strcmp(arg, "-m") == 0 || SDL_strcmp(arg, "--model") == 0) {
+                if (i + 1 >= argc) {
+                    SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "%s requires an argument", arg);
+                    print_help();
+                    return 1;
+                }
+                i += 1;
+                shaderModel = SDL_atoi(argv[i]);
+            } else if (SDL_strcmp(arg, "-o") == 0 || SDL_strcmp(arg, "--output") == 0) {
+                if (i + 1 >= argc) {
+                    SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "%s requires an argument", arg);
+                    print_help();
+                    return 1;
+                }
+                i += 1;
+                outputFilename = argv[i];
+            } else if (SDL_strcmp(arg, "--") == 0) {
+                accept_optionals = false;
             } else {
-                SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Unrecognized shader stage input %s, must be vertex, fragment, or compute.", argv[i]);
-                print_help();
-                return 1;
-            }
-        } else if (SDL_strcmp(arg, "-e") == 0 || SDL_strcmp(arg, "--entrypoint") == 0) {
-            if (i + 1 >= argc) {
-                SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "%s requires an argument", arg);
-                print_help();
-                return 1;
-            }
-            i += 1;
-            entrypointName = argv[i];
-        } else if (SDL_strcmp(arg, "-m") == 0 || SDL_strcmp(arg, "--model") == 0) {
-            if (i + 1 >= argc) {
-                SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "%s requires an argument", arg);
-                print_help();
-                return 1;
-            }
-            i += 1;
-            shaderModel = SDL_atoi(argv[i]);
-        } else if (SDL_strcmp(arg, "-o") == 0 || SDL_strcmp(arg, "--output") == 0) {
-            if (i + 1 >= argc) {
-                SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "%s requires an argument", arg);
-                print_help();
+                SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "%s: Unknown argument: %s", argv[0], arg);
+                print_help(1);
                 return 1;
             }
-            i += 1;
-            outputFilename = argv[i];
         } else if (!filename) {
             filename = arg;
         } else {
-            SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "%s: Unknown argument", argv[0]);
+            SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "%s: Unknown argument: %s", argv[0], arg);
             print_help(1);
         }
     }
@@ -160,7 +169,7 @@ int main(int argc, char *argv[])
     }
     fileData = SDL_LoadFile(filename, &fileSize);
     if (fileData == NULL) {
-        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "%s", "Invalid file");
+        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Invalid file (%s)", SDL_GetError());
         return 1;
     }
 
diff --git a/src/version.rc b/src/version.rc
index da758c8..a3c0176 100644
--- a/src/version.rc
+++ b/src/version.rc
@@ -24,7 +24,7 @@ BEGIN
             VALUE "CompanyName", "\0"
             VALUE "FileDescription", "SDL_gpu_shadercross\0"
             VALUE "FileVersion", "1, 0, 0, 0\0"
-            VALUE "InternalName", "SDL_image\0"
+            VALUE "InternalName", "SDL_gpu_shadercross\0"
             VALUE "LegalCopyright", "Copyright (C) 2024 Sam Lantinga\0"
             VALUE "OriginalFilename", "SDL_gpu_shadercross.dll\0"
             VALUE "ProductName", "Simple DirectMedia Layer\0"