From 01db131adb2ec7e07bed7d5db7db551d8e0b64b2 Mon Sep 17 00:00:00 2001 From: scawful Date: Tue, 21 Jan 2025 22:13:00 -0500 Subject: [PATCH] Add flag handling for ROM file in main application --- src/app/main.cc | 14 +++++++++----- src/util/flag.h | 17 +++++++++++++---- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/app/main.cc b/src/app/main.cc index b5980ff7..68a593ab 100644 --- a/src/app/main.cc +++ b/src/app/main.cc @@ -5,6 +5,7 @@ #include "absl/debugging/failure_signal_handler.h" #include "absl/debugging/symbolize.h" #include "app/core/controller.h" +#include "util/flag.h" /** * @namespace yaze @@ -12,19 +13,22 @@ */ using namespace yaze; +DECLARE_FLAG(std::string, rom_file); +DEFINE_FLAG(std::string, rom_file, "", "The ROM file to load."); + int main(int argc, char** argv) { absl::InitializeSymbolizer(argv[0]); - absl::FailureSignalHandlerOptions options; options.symbolize_stacktrace = true; options.use_alternate_stack = true; options.alarm_on_failure_secs = true; options.call_previous_handler = true; absl::InstallFailureSignalHandler(options); - - std::string rom_filename; - if (argc > 1) { - rom_filename = argv[1]; + yaze::util::FlagParser parser(yaze::util::global_flag_registry()); + RETURN_IF_EXCEPTION(parser.Parse(argc, argv)); + std::string rom_filename = ""; + if (!FLAGS_rom_file.empty()) { + rom_filename = FLAGS_rom_file; } #ifdef __APPLE__ diff --git a/src/util/flag.h b/src/util/flag.h index db1bec6d..a3977fa3 100644 --- a/src/util/flag.h +++ b/src/util/flag.h @@ -96,7 +96,6 @@ class FlagRegistry { std::unordered_map> flags_; }; - inline FlagRegistry* global_flag_registry() { // Guaranteed to be initialized once per process. static FlagRegistry* registry = new FlagRegistry(); @@ -106,9 +105,10 @@ inline FlagRegistry* global_flag_registry() { #define DECLARE_FLAG(type, name) extern yaze::util::Flag* FLAGS_##name // Defines a global Flag* FLAGS_ and registers it. -#define DEFINE_FLAG(type, name, default_val, help_text) \ - yaze::util::Flag* FLAGS_##name = \ - yaze::util::global_flag_registry()->RegisterFlag("--" #name, (default_val), (help_text)) +#define DEFINE_FLAG(type, name, default_val, help_text) \ + yaze::util::Flag* FLAGS_##name = \ + yaze::util::global_flag_registry()->RegisterFlag( \ + "--" #name, (default_val), (help_text)) // Retrieves the current value of a declared flag. #define FLAG_VALUE(name) (FLAGS_##name->Get()) @@ -117,6 +117,15 @@ class FlagParser { public: explicit FlagParser(FlagRegistry* registry) : registry_(registry) {} + // Parses flags out of the given command line arguments. + void Parse(int argc, char** argv) { + std::vector tokens; + for (int i = 0; i < argc; i++) { + tokens.push_back(argv[i]); + } + Parse(&tokens); + } + // Parses flags out of the given token list. Recognizes forms: // --flag=value or --flag value // Any token not recognized as a flag is left in `leftover`.