aboutsummaryrefslogtreecommitdiffstats
path: root/src/libstrongswan/definitions.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libstrongswan/definitions.c')
-rw-r--r--src/libstrongswan/definitions.c60
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);
+}