diff options
Diffstat (limited to 'src/libstrongswan')
-rw-r--r-- | src/libstrongswan/tests/suites/test_enum.c | 51 | ||||
-rw-r--r-- | src/libstrongswan/utils/enum.c | 7 | ||||
-rw-r--r-- | src/libstrongswan/utils/enum.h | 25 |
3 files changed, 57 insertions, 26 deletions
diff --git a/src/libstrongswan/tests/suites/test_enum.c b/src/libstrongswan/tests/suites/test_enum.c index 512448a88..b48b51c0e 100644 --- a/src/libstrongswan/tests/suites/test_enum.c +++ b/src/libstrongswan/tests/suites/test_enum.c @@ -120,41 +120,50 @@ END_TEST */ static struct { + bool found; int val; char *str; } enum_tests_cont[] = { - {CONT1, "CONT1"}, - {CONT2, "CONT2"}, - {CONT2, "CoNt2"}, - {CONT3, "CONT3"}, - {CONT4, "CONT4"}, - {CONT5, "CONT5"}, - {-1, "asdf"}, - {-1, ""}, - {-1, NULL}, + {TRUE, CONT1, "CONT1"}, + {TRUE, CONT2, "CONT2"}, + {TRUE, CONT2, "CoNt2"}, + {TRUE, CONT3, "CONT3"}, + {TRUE, CONT4, "CONT4"}, + {TRUE, CONT5, "CONT5"}, + {FALSE, 0, "asdf"}, + {FALSE, 0, ""}, + {FALSE, 0, NULL}, }, enum_tests_split[] = { - {SPLIT1, "SPLIT1"}, - {SPLIT1, "split1"}, - {SPLIT2, "SPLIT2"}, - {SPLIT2, "SpLiT2"}, - {SPLIT3, "SPLIT3"}, - {SPLIT4, "SPLIT4"}, - {SPLIT5, "SPLIT5"}, - {-1, "asdf"}, - {-1, ""}, - {-1, NULL}, + {TRUE, SPLIT1, "SPLIT1"}, + {TRUE, SPLIT1, "split1"}, + {TRUE, SPLIT2, "SPLIT2"}, + {TRUE, SPLIT2, "SpLiT2"}, + {TRUE, SPLIT3, "SPLIT3"}, + {TRUE, SPLIT4, "SPLIT4"}, + {TRUE, SPLIT5, "SPLIT5"}, + {FALSE, 0, "asdf"}, + {FALSE, 0, ""}, + {FALSE, 0, NULL}, }; START_TEST(test_enum_from_name_cont) { - int val = enum_from_name(test_enum_cont_names, enum_tests_cont[_i].str); + int val = 0; + bool found; + + found = enum_from_name(test_enum_cont_names, enum_tests_cont[_i].str, &val); + ck_assert(enum_tests_cont[_i].found == found); ck_assert_int_eq(val, enum_tests_cont[_i].val); } END_TEST START_TEST(test_enum_from_name_split) { - int val = enum_from_name(test_enum_split_names, enum_tests_split[_i].str); + int val = 0; + bool found; + + found = enum_from_name(test_enum_split_names, enum_tests_split[_i].str, &val); + ck_assert(enum_tests_split[_i].found == found); ck_assert_int_eq(val, enum_tests_split[_i].val); } END_TEST diff --git a/src/libstrongswan/utils/enum.c b/src/libstrongswan/utils/enum.c index 465121e79..f96fe2989 100644 --- a/src/libstrongswan/utils/enum.c +++ b/src/libstrongswan/utils/enum.c @@ -40,7 +40,7 @@ char *enum_to_name(enum_name_t *e, int val) /** * See header. */ -int enum_from_name(enum_name_t *e, char *name) +bool enum_from_name_as_int(enum_name_t *e, const char *name, int *val) { do { @@ -50,12 +50,13 @@ int enum_from_name(enum_name_t *e, char *name) { if (name && strcaseeq(name, e->names[i])) { - return e->first + i; + *val = e->first + i; + return TRUE; } } } while ((e = e->next)); - return -1; + return FALSE; } /** diff --git a/src/libstrongswan/utils/enum.h b/src/libstrongswan/utils/enum.h index a2f97d05e..a16485772 100644 --- a/src/libstrongswan/utils/enum.h +++ b/src/libstrongswan/utils/enum.h @@ -120,9 +120,30 @@ char *enum_to_name(enum_name_t *e, int val); * * @param e enum names for this enum value * @param name name to get enum value for - * @return enum value, -1 if not found + * @þaram valp variable sized pointer receiving value + * @return TRUE if enum name found, FALSE otherwise */ -int enum_from_name(enum_name_t *e, char *name); +#define enum_from_name(e, name, valp) ({ \ + int _val; \ + int _found = enum_from_name_as_int(e, name, &_val); \ + if (_found) \ + { \ + *(valp) = _val; \ + } \ + _found; }) + +/** + * Convert a enum string back to its enum value, integer pointer variant. + * + * This variant takes integer pointer only, use enum_from_name() to pass + * enum type pointers for the result. + * + * @param e enum names for this enum value + * @param name name to get enum value for + * @þaram val integer pointer receiving value + * @return TRUE if enum name found, FALSE otherwise + */ +bool enum_from_name_as_int(enum_name_t *e, const char *name, int *val); /** * printf hook function for enum_names_t. |