added private flag to asn1_init
[strongswan.git] / src / libstrongswan / definitions.c
index c6cabe5..0874768 100644 (file)
@@ -6,7 +6,8 @@
  */
 
 /*
- * Copyright (C) 2005 Jan Hutter, Martin Willi
+ * Copyright (C) 2005-2006 Martin Willi
+ * Copyright (C) 2005 Jan Hutter
  * Hochschule fuer Technik Rapperswil
  *
  * This program is free software; you can redistribute it and/or modify it
  * 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);
+}