diff options
Diffstat (limited to 'src/libstrongswan/definitions.c')
-rw-r--r-- | src/libstrongswan/definitions.c | 60 |
1 files changed, 43 insertions, 17 deletions
diff --git a/src/libstrongswan/definitions.c b/src/libstrongswan/definitions.c index 04db34949..087476838 100644 --- a/src/libstrongswan/definitions.c +++ b/src/libstrongswan/definitions.c @@ -21,39 +21,65 @@ * for more details. */ -#include <stdlib.h> +#include <printf.h> +#include <stdio.h> #include "definitions.h" /* - * Described in header. + * Described in header */ -char *mapping_find(mapping_t * maps, int value) +static char *enum_name(enum_name_t *e, long val) { - int i = 0; - while (maps[i].value != MAPPING_END) + do { - if (maps[i].value == value) + if (val >= e->first && val <= e->last) { - return maps[i].string; + return e->names[val - e->first]; } - i++; } - return "INVALID MAPPING"; + while ((e = e->next)); + return NULL; } -/* - * Described in header + +/** + * output handler in printf() for enum names */ -const char *enum_name(enum_names *ed, unsigned long val) +static int print_enum(FILE *stream, const struct printf_info *info, + const void *const *args) { - enum_names *p; + enum_name_t *ed = *((void**)(args[0])); + long val = *((size_t*)(args[1])); + char *name; + + name = enum_name(ed, val); + if (name == NULL) + { + return fprintf(stream, "(unknown enum value: %ld)", val); + } + return fprintf(stream, "%s", name); +} - for (p = ed; p != NULL; p = p->en_next_range) +/** + * arginfo handler in printf() for enum names + */ +static int print_enum_arginfo(const struct printf_info *info, size_t n, int *argtypes) +{ + if (n > 1) { - if (p->en_first <= val && val <= p->en_last) - return p->en_names[val - p->en_first]; + /* enum_names ptr */ + argtypes[0] = PA_POINTER; + /* value */ + argtypes[1] = PA_INT; } - return NULL; + return 2; } +/** + * register printf() handlers for enum names + */ +static void __attribute__ ((constructor))print_register() +{ + register_printf_function(ENUM_PRINTF_SPEC, print_enum, print_enum_arginfo); +} |