diff --git a/main.cpp b/main.cpp index c64983c..50120e9 100644 --- a/main.cpp +++ b/main.cpp @@ -40,6 +40,11 @@ along with this program. If not, see . #include #include +#ifdef _WIN32 +#include +#else +#include +#endif using namespace std; static void sigint_handler(int signum) { @@ -64,6 +69,26 @@ static string appDescription = string( "\n" ); +/// Check for an existing directory (returns error message if check fails) +class WorkingDirectoryValidator : public CLI::detail::ExistingDirectoryValidator { +public: + WorkingDirectoryValidator() { + func_ = [](std::string& filename) { + std::string result = CLI::ExistingDirectory.operator()(filename); + if (result.empty()) { + #ifdef _WIN32 + _chdir(filename.c_str()); + #else + chdir(filename.c_str()); + #endif + } + return result; + }; + } +}; + +const WorkingDirectoryValidator WorkingDirectory; + void run_machine(std::string machine_str, std::string bootrom_path, uint32_t execution_mode, uint32_t profiling_interval_ms); int main(int argc, char** argv) { @@ -77,11 +102,14 @@ int main(int argc, char** argv) { bool realtime_enabled = false; bool debugger_enabled = false; string bootrom_path("bootrom.bin"); + string working_directory_path("."); app.add_flag("-r,--realtime", realtime_enabled, "Run the emulator in real-time"); app.add_flag("-d,--debugger", debugger_enabled, "Enter the built-in debugger"); + app.add_option("-w,--workingdir", working_directory_path, "Specifies working directory") + ->check(WorkingDirectory); app.add_option("-b,--bootrom", bootrom_path, "Specifies BootROM path") ->check(CLI::ExistingFile); app.add_flag("--deterministic", is_deterministic,