Refactored option parsing.

This commit is contained in:
Lasse Collin 2009-09-01 20:40:01 +03:00
parent 25adaaa56e
commit 319a0fd7d7
1 changed files with 36 additions and 36 deletions

View File

@ -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;