enum: Return boolean result for enum_from_name() lookup

Handling the result for enum_from_name() is difficult, as checking for
negative return values requires a cast if the enum type is unsigned. The new
signature clearly differentiates lookup result from lookup value.

Further, this actually allows to convert real -1 enum values, which could not
be distinguished from "not-found" and the -1 return value.

This also fixes several clang warnings where enums are unsigned.
This commit is contained in:
Martin Willi
2014-05-16 15:42:07 +02:00
parent 9ee8b3b41f
commit 064fe9c963
28 changed files with 102 additions and 85 deletions
@@ -202,6 +202,7 @@ METHOD(coupling_validator_t, destroy, void,
coupling_validator_t *coupling_validator_create()
{
private_coupling_validator_t *this;
hash_algorithm_t alg;
char *path, *hash;
INIT(this,
@@ -219,8 +220,13 @@ coupling_validator_t *coupling_validator_create()
hash = lib->settings->get_str(lib->settings,
"%s.plugins.coupling.hash", "sha1", lib->ns);
this->hasher = lib->crypto->create_hasher(lib->crypto,
enum_from_name(hash_algorithm_short_names, hash));
if (!enum_from_name(hash_algorithm_short_names, hash, &alg))
{
DBG1(DBG_CFG, "unknown coupling hash algorithm: %s", hash);
destroy(this);
return NULL;
}
this->hasher = lib->crypto->create_hasher(lib->crypto, alg);
if (!this->hasher)
{
DBG1(DBG_CFG, "unsupported coupling hash algorithm: %s", hash);
@@ -362,8 +362,7 @@ static linked_list_t* parse_selector(char *selector)
vendor = atoi(token);
token = pos;
}
type = enum_from_name(radius_attribute_type_names, token);
if (type == -1)
if (!enum_from_name(radius_attribute_type_names, token, &type))
{
type = atoi(token);
}
@@ -465,7 +465,6 @@ load_tester_creds_t *load_tester_creds_create()
.private = load_issuer_key(),
.ca = load_issuer_cert(),
.cas = linked_list_create(),
.digest = enum_from_name(hash_algorithm_short_names, digest),
.psk = shared_key_create(SHARED_IKE,
chunk_clone(chunk_create(psk, strlen(psk)))),
.pwd = shared_key_create(SHARED_EAP,
@@ -477,7 +476,7 @@ load_tester_creds_t *load_tester_creds_create()
this->cas->insert_last(this->cas, this->ca->get_ref(this->ca));
}
if (this->digest == -1)
if (!enum_from_name(hash_algorithm_short_names, digest, &this->digest))
{
DBG1(DBG_CFG, "invalid load-tester digest: '%s', using sha1", digest);
this->digest = HASH_SHA1;
@@ -487,4 +486,3 @@ load_tester_creds_t *load_tester_creds_create()
return &this->public;
}
+1 -2
View File
@@ -584,8 +584,7 @@ static void stroke_loglevel(private_stroke_socket_t *this,
}
else
{
group = enum_from_name(debug_names, msg->loglevel.type);
if ((int)group < 0)
if (!enum_from_name(debug_names, msg->loglevel.type, &group))
{
fprintf(out, "unknown type '%s'!\n", msg->loglevel.type);
return;
+1 -2
View File
@@ -729,8 +729,7 @@ CALLBACK(list_certs, vici_message_t*,
char *str;
str = request->get_str(request, "ANY", "type");
type = enum_from_name(certificate_type_names, str);
if (type == -1)
if (!enum_from_name(certificate_type_names, str, &type))
{
b = vici_builder_create();
return b->finalize(b);