From 1cada3948da6eabe93d8df6a785593c83be9f424 Mon Sep 17 00:00:00 2001 From: kalaposfos13 <153381648+kalaposfos13@users.noreply.github.com> Date: Sun, 10 Nov 2024 12:22:22 +0100 Subject: [PATCH] Added non-GUI related upgrades to SDL version --- src/main.cpp | 80 ++++++++++++++++++++++++++++++++++++++------- src/qt_gui/main.cpp | 2 +- 2 files changed, 69 insertions(+), 13 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index de1d92326..a86c53300 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,6 +1,11 @@ // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include "functional" +#include "iostream" +#include "string" +#include "unordered_map" + #include #include "common/memory_patcher.h" #include "emulator.h" @@ -14,26 +19,77 @@ int main(int argc, char* argv[]) { SetConsoleOutputCP(CP_UTF8); #endif + bool has_game_argument = false; + std::string game_path; + + // Map of argument strings to lambda functions + std::unordered_map> arg_map = { + {"-h", + [&](int&) { + std::cout << "Usage: shadps4 [options] \n" + "Options:\n" + " -g, --game Specify game path to launch\n" + " -p, --patch Apply specified patch file\n" + " -h, --help Display this help message\n"; + exit(0); + }}, + {"--help", [&](int& i) { arg_map["-h"](i); }}, + + {"-g", + [&](int& i) { + if (i + 1 < argc) { + game_path = argv[++i]; + has_game_argument = true; + } else { + std::cerr << "Error: Missing argument for -g/--game\n"; + exit(1); + } + }}, + {"--game", [&](int& i) { arg_map["-g"](i); }}, + + {"-p", + [&](int& i) { + if (i + 1 < argc) { + MemoryPatcher::patchFile = argv[++i]; + } else { + std::cerr << "Error: Missing argument for -p/--patch\n"; + exit(1); + } + }}, + {"--patch", [&](int& i) { arg_map["-p"](i); }}, + }; + if (argc == 1) { - fmt::print("Usage: {} \n", argv[0]); - return -1; - } - // check if eboot file exists - if (!std::filesystem::exists(argv[1])) { - fmt::print("Eboot.bin file not found\n"); + int dummy = 0; // one does not simply pass 0 directly + arg_map.at("-h")(dummy); return -1; } - for (int i = 0; i < argc; i++) { - std::string curArg = argv[i]; - if (curArg == "-p") { - std::string patchFile = argv[i + 1]; - MemoryPatcher::patchFile = patchFile; + // Parse command-line arguments using the map + for (int i = 1; i < argc; ++i) { + std::string cur_arg = argv[i]; + auto it = arg_map.find(cur_arg); + if (it != arg_map.end()) { + it->second(i); // Call the associated lambda function + } else if (i == argc - 1 && !has_game_argument) { + // Assume the last argument is the game file if not specified via -g/--game + game_path = argv[i]; + has_game_argument = true; + } else { + std::cerr << "Unknown argument: " << cur_arg << "\n"; + return 1; } } + // Check if the game path or ID exists + if (!has_game_argument || !std::filesystem::exists(game_path)) { + std::cerr << "Error: Game file not found\n"; + return -1; + } + + // Run the emulator with the specified game Core::Emulator emulator; - emulator.Run(argv[1]); + emulator.Run(game_path); return 0; } diff --git a/src/qt_gui/main.cpp b/src/qt_gui/main.cpp index 5384829d9..4c6ec7a0d 100644 --- a/src/qt_gui/main.cpp +++ b/src/qt_gui/main.cpp @@ -40,7 +40,7 @@ int main(int argc, char* argv[]) { std::cout << "Usage: emulator [options]\n" "Options:\n" " No arguments: Opens the GUI.\n" - " -g, --game Specify game path or ID to launch\n" + " -g, --game Specify or to launch\n" " -p, --patch Apply specified patch file\n" " -s, --show-gui Show the GUI\n" " -h, --help Display this help message\n";