unify stod/stoi invalid_argument::what parse

This is a hack to check whether given invalid_argument message belongs
to stoi/stod. It is usually used to catch non-numeric user input where
a number was expected.
This commit is contained in:
Martin Pulec
2024-09-13 12:38:23 +02:00
parent ab25c2d1fc
commit ef0cd7130d
5 changed files with 18 additions and 6 deletions

View File

@@ -1026,8 +1026,7 @@ int main(int argc, char **argv)
try {
ret = parse_fmt(argc, argv, &params);
} catch (invalid_argument &e) {
if (strcmp(e.what(), "stoi") != 0 &&
strcmp(e.what(), "stod") != 0) {
if (!invalid_arg_is_numeric(e.what())) {
throw;
}
MSG(ERROR, "Non-numeric value passed to option "

View File

@@ -1013,8 +1013,7 @@ parse_options(int argc, char *argv[], struct ug_options *opt)
try {
return parse_options_internal(argc, argv, opt);
} catch (logic_error &e) {
if (strcmp(e.what(), "stoi") != 0 &&
strcmp(e.what(), "stod") != 0) {
if (!invalid_arg_is_numeric(e.what())) {
throw;
}
if (dynamic_cast<invalid_argument *>(&e) != nullptr) {

View File

@@ -329,3 +329,16 @@ bool is_arm_mac() {
return false;
#endif
}
/**
* @param what value returned by std::logic_error::what()
* @returns if given std::invalid_argument message belongs to a stoi/stof
* converison
*/
bool invalid_arg_is_numeric(const char *what) {
if (what == nullptr) {
return false;
}
return strcmp(what, "stoi") == 0 || strcmp(what, "stod") == 0;
}

View File

@@ -71,6 +71,8 @@ struct key_val {
};
void print_module_usage(const char *module_name, const struct key_val *options, const struct key_val *options_full, bool print_full_help);
bool invalid_arg_is_numeric(const char *what);
#ifdef __cplusplus
}
#endif

View File

@@ -1416,8 +1416,7 @@ static void *display_decklink_init(struct module *parent, const char *fmt, unsig
try {
succeeded = settings_init(s, fmt, cardId);
} catch (exception &e) {
if (strcmp(e.what(), "stoi") == 0 ||
strcmp(e.what(), "stod") == 0) {
if (invalid_arg_is_numeric(e.what())) {
MSG(ERROR, "Invalid number passed where numeric "
"argument expected!\n");
} else {