Refactored option parsing.
This commit is contained in:
parent
25adaaa56e
commit
319a0fd7d7
|
@ -87,47 +87,47 @@ parse_options(const char *str, const option_map *opts,
|
||||||
"pairs separated with commas"), str);
|
"pairs separated with commas"), str);
|
||||||
|
|
||||||
// Look for the option name from the option map.
|
// Look for the option name from the option map.
|
||||||
bool found = false;
|
size_t i = 0;
|
||||||
for (size_t i = 0; opts[i].name != NULL; ++i) {
|
while (true) {
|
||||||
if (strcmp(name, opts[i].name) != 0)
|
if (opts[i].name == NULL)
|
||||||
continue;
|
message_fatal(_("%s: Invalid option name"),
|
||||||
|
name);
|
||||||
|
|
||||||
if (opts[i].map != NULL) {
|
if (strcmp(name, opts[i].name) == 0)
|
||||||
// value is a string which we should map
|
break;
|
||||||
// to an integer.
|
|
||||||
size_t j;
|
|
||||||
for (j = 0; opts[i].map[j].name != NULL; ++j) {
|
|
||||||
if (strcmp(opts[i].map[j].name, value)
|
|
||||||
== 0)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (opts[i].map[j].name == NULL)
|
++i;
|
||||||
message_fatal(_("%s: Invalid option "
|
|
||||||
"value"), value);
|
|
||||||
|
|
||||||
set(filter_options, i, opts[i].map[j].id,
|
|
||||||
value);
|
|
||||||
|
|
||||||
} else if (opts[i].min == UINT64_MAX) {
|
|
||||||
// value is a special string that will be
|
|
||||||
// parsed by set().
|
|
||||||
set(filter_options, i, 0, value);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
// value is an integer.
|
|
||||||
const uint64_t v = str_to_uint64(name, value,
|
|
||||||
opts[i].min, opts[i].max);
|
|
||||||
set(filter_options, i, v, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!found)
|
// Option was found from the map. See how we should handle it.
|
||||||
message_fatal(_("%s: Invalid option name"), name);
|
if (opts[i].map != NULL) {
|
||||||
|
// value is a string which we should map
|
||||||
|
// to an integer.
|
||||||
|
size_t j;
|
||||||
|
for (j = 0; opts[i].map[j].name != NULL; ++j) {
|
||||||
|
if (strcmp(opts[i].map[j].name, value) == 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opts[i].map[j].name == NULL)
|
||||||
|
message_fatal(_("%s: Invalid option value"),
|
||||||
|
value);
|
||||||
|
|
||||||
|
set(filter_options, i, opts[i].map[j].id, value);
|
||||||
|
|
||||||
|
} else if (opts[i].min == UINT64_MAX) {
|
||||||
|
// value is a special string that will be
|
||||||
|
// parsed by set().
|
||||||
|
set(filter_options, i, 0, value);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// value is an integer.
|
||||||
|
const uint64_t v = str_to_uint64(name, value,
|
||||||
|
opts[i].min, opts[i].max);
|
||||||
|
set(filter_options, i, v, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if it was the last option.
|
||||||
if (split == NULL)
|
if (split == NULL)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue