diff --git a/CHANGES b/CHANGES index 54250b83c..ffa699414 100644 --- a/CHANGES +++ b/CHANGES @@ -31,6 +31,7 @@ Misc: - GBA: Additional savestate sanity checks - GBA: Check for cycle count being too high - All: Reset next event to cycles instead of zero to interrupt + - All: Add --version flag 0.3.0: (2015-08-16) Features: diff --git a/src/platform/commandline.c b/src/platform/commandline.c index 3502df37c..2842cf7e4 100644 --- a/src/platform/commandline.c +++ b/src/platform/commandline.c @@ -47,6 +47,7 @@ static const struct option _options[] = { { "help", no_argument, 0, 'h' }, { "movie", required_argument, 0, 'v' }, { "patch", required_argument, 0, 'p' }, + { "version", no_argument, 0, '\0' }, { 0, 0, 0, 0 } }; @@ -68,8 +69,17 @@ bool parseArguments(struct GBAArguments* opts, struct GBAConfig* config, int arg // TODO: modularize options to subparsers strncat(options, subparser->extraOptions, sizeof(options) - strlen(options) - 1); } - while ((ch = getopt_long(argc, argv, options, _options, 0)) != -1) { + int index = 0; + while ((ch = getopt_long(argc, argv, options, _options, &index)) != -1) { + const struct option* opt = &_options[index]; switch (ch) { + case '\0': + if (strcmp(opt->name, "version") == 0) { + opts->showVersion = true; + } else { + return false; + } + break; case 'b': GBAConfigSetDefaultValue(config, "bios", optarg); break; @@ -122,7 +132,7 @@ bool parseArguments(struct GBAArguments* opts, struct GBAConfig* config, int arg argc -= optind; argv += optind; if (argc != 1) { - return opts->showHelp; + return opts->showHelp || opts->showVersion; } opts->fname = strdup(argv[0]); return true; @@ -226,7 +236,12 @@ void usage(const char* arg0, const char* extraOptions) { puts(" -v, --movie FILE Play back a movie of recorded input"); puts(" -p, --patch FILE Apply a specified patch file when running"); puts(" -s, --frameskip N Skip every N frames"); + puts(" --version Print version and exit"); if (extraOptions) { puts(extraOptions); } } + +void version(const char* arg0) { + printf("%s %s (%s)\n", arg0, projectVersion, gitCommit); +} diff --git a/src/platform/commandline.h b/src/platform/commandline.h index 32275633b..02d15b326 100644 --- a/src/platform/commandline.h +++ b/src/platform/commandline.h @@ -31,6 +31,7 @@ struct GBAArguments { enum DebuggerType debuggerType; bool debugAtStart; bool showHelp; + bool showVersion; }; struct SubParser { @@ -51,6 +52,7 @@ bool parseArguments(struct GBAArguments* opts, struct GBAConfig* config, int arg void freeArguments(struct GBAArguments* opts); void usage(const char* arg0, const char* extraOptions); +void version(const char* arg0); void initParserForGraphics(struct SubParser* parser, struct GraphicsOpts* opts); struct ARMDebugger* createDebugger(struct GBAArguments* opts, struct GBAThread* context); diff --git a/src/platform/perf-main.c b/src/platform/perf-main.c index 942dd57d9..a2b49bc28 100644 --- a/src/platform/perf-main.c +++ b/src/platform/perf-main.c @@ -77,6 +77,13 @@ int main(int argc, char** argv) { GBAConfigDeinit(&config); return !parsed; } + if (args.showVersion) { + version(argv[0]); + freeArguments(&args); + GBAConfigFreeOpts(&opts); + GBAConfigDeinit(&config); + return 0; + } renderer.outputBuffer = malloc(256 * 256 * 4); renderer.outputBufferStride = 256; diff --git a/src/platform/sdl/main.c b/src/platform/sdl/main.c index 78dda4706..78ab4c70e 100644 --- a/src/platform/sdl/main.c +++ b/src/platform/sdl/main.c @@ -67,6 +67,13 @@ int main(int argc, char** argv) { GBAConfigDeinit(&config); return !parsed; } + if (args.showVersion) { + version(argv[0]); + freeArguments(&args); + GBAConfigFreeOpts(&opts); + GBAConfigDeinit(&config); + return 0; + } GBAConfigMap(&config, &opts);