Feature: Add ability for subparsers to consume extra arguments

This commit is contained in:
Vicki Pfau 2025-01-10 02:45:27 -08:00
parent 080a79fdee
commit 77e50f7aec
2 changed files with 17 additions and 1 deletions

View File

@ -44,6 +44,7 @@ struct mSubParser {
bool (*parse)(struct mSubParser* parser, int option, const char* arg);
bool (*parseLong)(struct mSubParser* parser, const char* option, const char* arg);
void (*apply)(struct mSubParser* parser, struct mCoreConfig* config);
bool (*handleExtraArg)(struct mSubParser* parser, const char* arg);
const char* extraOptions;
const struct mOption* longOptions;
void* opts;

View File

@ -187,7 +187,21 @@ bool mArgumentsParse(struct mArguments* args, int argc, char* const* argv, struc
argc -= optind;
argv += optind;
if (argc > 1) {
return false;
for (j = 0; j < argc; ++j) {
bool handled = false;
for (i = 0; i < nSubparsers; ++i) {
if (!subparsers[i].handleExtraArg) {
continue;
}
handled = subparsers[i].handleExtraArg(&subparsers[i], argv[j]);
if (handled) {
break;
}
}
if (!handled) {
return false;
}
}
} else if (argc == 1) {
args->fname = strdup(argv[0]);
} else {
@ -303,6 +317,7 @@ void mSubParserGraphicsInit(struct mSubParser* parser, struct mGraphicsOpts* opt
parser->apply = _applyGraphicsArgs;
parser->extraOptions = GRAPHICS_OPTIONS;
parser->longOptions = _graphicsLongOpts;
parser->handleExtraArg = NULL;
opts->multiplier = 0;
opts->fullscreen = false;
}