From: Martin Willi Date: Fri, 20 Aug 2010 18:45:05 +0000 (+0200) Subject: Implemented generic enum name to enum value mapping X-Git-Tag: 4.5.0~431 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f9efac2ba338a5e5f322ee7853ec9cda8f3f0bcd;p=thirdparty%2Fstrongswan.git Implemented generic enum name to enum value mapping --- diff --git a/src/libstrongswan/enum.c b/src/libstrongswan/enum.c index 946a54deb8..258a5b410f 100644 --- a/src/libstrongswan/enum.c +++ b/src/libstrongswan/enum.c @@ -16,12 +16,14 @@ #include #include +#include + #include "enum.h" /** - * get the name of an enum value in a enum_name_t list + * See header. */ -static char *enum_name(enum_name_t *e, int val) +char *enum_to_name(enum_name_t *e, int val) { do { @@ -34,6 +36,27 @@ static char *enum_name(enum_name_t *e, int val) return NULL; } +/** + * See header. + */ +int enum_from_name(enum_name_t *e, char *name) +{ + do + { + int i, count = e->last - e->first; + + for (i = 0; i < count; i++) + { + if (strcaseeq(name, e->names[i])) + { + return e->first + i; + } + } + } + while ((e = e->next)); + return -1; +} + /** * Described in header. */ @@ -43,7 +66,7 @@ int enum_printf_hook(char *dst, size_t len, printf_hook_spec_t *spec, enum_name_t *ed = *((enum_name_t**)(args[0])); int val = *((int*)(args[1])); - char *name = enum_name(ed, val); + char *name = enum_to_name(ed, val); if (name == NULL) { diff --git a/src/libstrongswan/enum.h b/src/libstrongswan/enum.h index 691f9f2bcb..d5f169772b 100644 --- a/src/libstrongswan/enum.h +++ b/src/libstrongswan/enum.h @@ -106,6 +106,24 @@ struct enum_name_t { */ #define ENUM(name, first, last, ...) ENUM_BEGIN(name, first, last, __VA_ARGS__); ENUM_END(name, last) +/** + * Convert a enum value to its string representation. + * + * @param e enum names for this enum value + * @param val enum value to get string for + * @return string for enum, NULL if not found + */ +char *enum_to_name(enum_name_t *e, int val); + +/** + * Convert a enum string back to its enum value. + * + * @param e enum names for this enum value + * @param name name to get enum value for + * @return enum value, -1 if not found + */ +int enum_from_name(enum_name_t *e, char *name); + /** * printf hook function for enum_names_t. *