mirror of
https://github.com/kovidgoyal/kitty
synced 2026-07-27 18:51:41 +02:00
Avoid double lookups of flag aliases
This commit is contained in:
@@ -173,10 +173,10 @@ dest_for_alias(CLISpec *spec, const char *alias) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
is_alias_bool(CLISpec* spec, const char *alias) {
|
is_alias_bool(CLISpec* spec, const char *alias, const char **dest_out) {
|
||||||
const char *dest = dest_for_alias(spec, alias);
|
*dest_out = dest_for_alias(spec, alias);
|
||||||
if (!dest) return false;
|
if (!*dest_out) return false;
|
||||||
flag_hash_itr itr = vt_get(&spec->flag_map, dest);
|
flag_hash_itr itr = vt_get(&spec->flag_map, *dest_out);
|
||||||
return itr.data->val.defval.type == CLI_VALUE_BOOL;
|
return itr.data->val.defval.type == CLI_VALUE_BOOL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -190,8 +190,8 @@ add_list_value(CLISpec *spec, const char *dest, const char *val) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
process_cli_arg(CLISpec* spec, const char *alias, const char *payload) {
|
process_cli_arg(CLISpec* spec, const char *alias, const char *payload, const char *dest) {
|
||||||
const char *dest = dest_for_alias(spec, alias);
|
if (!dest) dest = dest_for_alias(spec, alias);
|
||||||
if (!dest) return false;
|
if (!dest) return false;
|
||||||
flag_hash_itr itr = vt_get(&spec->flag_map, dest);
|
flag_hash_itr itr = vt_get(&spec->flag_map, dest);
|
||||||
const FlagSpec *flag = &itr.data->val;
|
const FlagSpec *flag = &itr.data->val;
|
||||||
@@ -286,6 +286,7 @@ parse_cli_loop(CLISpec *spec, bool save_original_argv, int argc, char **argv) {
|
|||||||
}
|
}
|
||||||
char flag[3] = {'-', 0, 0};
|
char flag[3] = {'-', 0, 0};
|
||||||
const char *current_option = NULL;
|
const char *current_option = NULL;
|
||||||
|
const char *dest_for_current_arg = NULL;
|
||||||
for (int i = 1; i < argc; i++) {
|
for (int i = 1; i < argc; i++) {
|
||||||
char *arg = argv[i];
|
char *arg = argv[i];
|
||||||
switch(state) {
|
switch(state) {
|
||||||
@@ -304,26 +305,27 @@ parse_cli_loop(CLISpec *spec, bool save_original_argv, int argc, char **argv) {
|
|||||||
payload = has_equal + 1;
|
payload = has_equal + 1;
|
||||||
}
|
}
|
||||||
if (is_long_opt) {
|
if (is_long_opt) {
|
||||||
if (is_alias_bool(spec, arg)) {
|
if (is_alias_bool(spec, arg, &dest_for_current_arg)) {
|
||||||
if (!process_cli_arg(spec, arg, payload)) return false;
|
if (!process_cli_arg(spec, arg, payload, dest_for_current_arg)) return false;
|
||||||
} else {
|
} else {
|
||||||
|
if (spec->errmsg) return false;
|
||||||
if (has_equal) {
|
if (has_equal) {
|
||||||
if (!process_cli_arg(spec, arg, payload)) return false;
|
if (!process_cli_arg(spec, arg, payload, dest_for_current_arg)) return false;
|
||||||
} else {
|
} else {
|
||||||
state = EXPECTING_ARG;
|
state = EXPECTING_ARG;
|
||||||
current_option = arg;
|
current_option = arg;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (spec->errmsg) return false;
|
|
||||||
} else {
|
} else {
|
||||||
for (const char *letter = arg + 1; *letter; letter++) {
|
for (const char *letter = arg + 1; *letter; letter++) {
|
||||||
flag[1] = *letter;
|
flag[1] = *letter;
|
||||||
if (letter[1]) {
|
if (letter[1]) {
|
||||||
if (!process_cli_arg(spec, flag, NULL)) return false;
|
if (!process_cli_arg(spec, flag, NULL, NULL)) return false;
|
||||||
} else {
|
} else {
|
||||||
if (is_alias_bool(spec, flag) || payload) {
|
if (is_alias_bool(spec, flag, &dest_for_current_arg) || payload) {
|
||||||
if (!process_cli_arg(spec, flag, payload)) return false;
|
if (!process_cli_arg(spec, flag, payload, dest_for_current_arg)) return false;
|
||||||
} else {
|
} else {
|
||||||
|
if (spec->errmsg) return false;
|
||||||
state = EXPECTING_ARG;
|
state = EXPECTING_ARG;
|
||||||
current_option = flag;
|
current_option = flag;
|
||||||
}
|
}
|
||||||
@@ -338,7 +340,7 @@ parse_cli_loop(CLISpec *spec, bool save_original_argv, int argc, char **argv) {
|
|||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case EXPECTING_ARG: {
|
case EXPECTING_ARG: {
|
||||||
if (current_option && !process_cli_arg(spec, current_option, arg)) return false;
|
if (current_option && !process_cli_arg(spec, current_option, arg, NULL)) return false;
|
||||||
current_option = NULL; state = NORMAL;
|
current_option = NULL; state = NORMAL;
|
||||||
} break;
|
} break;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user