]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
table: Add table indexed by numeric value
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Sat, 18 Apr 2020 20:21:32 +0000 (15:21 -0500)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Sat, 18 Apr 2020 20:21:32 +0000 (15:21 -0500)
i.e. an array lookup...

# Conflicts:
# src/lib/util/table.c

src/lib/util/table.c
src/lib/util/table.h

index 15f54908cdb6d924ce9385f164394d4ed4995694..8e38c6d2e56dc9801498d3ea6a703bfe5442d04a 100644 (file)
@@ -107,6 +107,13 @@ char const *_our_name(_our_table_type table, size_t table_len, _our_value_type v
        return table[idx].name; \
 }
 
+#define TABLE_TYPE_VALUE_INDEX_FUNC(_our_table_type, _our_name, _our_value_type) \
+char const *_our_name(_our_table_type table, size_t table_len, _our_value_type value, char const *def) \
+{ \
+       if (value >= table_len) return def; \
+       return table[value].name; \
+}
+
 /** Convert a string to a value using a lexicographically sorted table
  *
  * @param[in] table            to search in.
@@ -444,3 +451,8 @@ TABLE_TYPE_VALUE_FUNC(fr_table_ptr_ordered_t const *, fr_table_ordered_str_by_pt
  *     definitions for flag values.
  */
 TABLE_TYPE_VALUE_INDEX_BIT_FIELD_FUNC(fr_table_num_indexed_bit_pos_t const *, fr_table_indexed_str_by_bit_field, uint64_t)
+
+/*
+ *     Array lookup based on numeric value
+ */
+TABLE_TYPE_VALUE_INDEX_BIT_FIELD_FUNC(fr_table_num_indexed_t const *, fr_table_indexed_str_by_num, unsigned int)
index b4d414c7137743c7b641d2dae95d8a40b594a72c..bac3656d3512b6965087c08f5e9daf036ad02fbb 100644 (file)
@@ -76,6 +76,15 @@ typedef struct {
        uint64_t                value;
 } fr_table_num_indexed_bit_pos_t;
 
+/** An element in a table indexed by numeric value
+ *
+ * i.e. if the value is 0, we return the string mapped to the first element of the table.
+ */
+typedef struct {
+       char const              *name;
+       unsigned int            value;
+} fr_table_num_indexed_t;
+
 /** Macro to use as dflt
  *
  */
@@ -114,7 +123,9 @@ _Generic((_table), \
         fr_table_ptr_sorted_t *                : fr_table_sorted_ptr_by_str,                   \
         fr_table_ptr_ordered_t *               : fr_table_ordered_ptr_by_str,                  \
         fr_table_num_indexed_bit_pos_t *       : fr_table_ordered_num_by_str,                  \
-        fr_table_num_indexed_bit_pos_t const * : fr_table_ordered_num_by_str                   \
+        fr_table_num_indexed_bit_pos_t const * : fr_table_ordered_num_by_str,                  \
+        fr_table_num_indexed_t *               : fr_table_ordered_num_by_str,                  \
+        fr_table_num_indexed_t const *         : fr_table_ordered_num_by_str                   \
 )(_table, _table ## _len, _name, _def)
 
 int            fr_table_sorted_num_by_substr(fr_table_num_sorted_t const *table, size_t table_len,
@@ -152,7 +163,9 @@ _Generic((_table), \
         fr_table_ptr_sorted_t *                : fr_table_sorted_ptr_by_substr,                \
         fr_table_ptr_ordered_t *               : fr_table_ordered_ptr_by_substr,               \
         fr_table_num_indexed_bit_pos_t *       : fr_table_ordered_num_by_substr,               \
-        fr_table_num_indexed_bit_pos_t const * : fr_table_ordered_num_by_substr                \
+        fr_table_num_indexed_bit_pos_t const * : fr_table_ordered_num_by_substr,               \
+        fr_table_num_indexed_t *               : fr_table_ordered_num_by_substr,               \
+        fr_table_num_indexed_t const *         : fr_table_ordered_num_by_substr                \
 )(_table, _table ## _len, _name, _name_len, _def)
 
 int    fr_table_sorted_num_by_longest_prefix(size_t *match_len, fr_table_num_sorted_t const *table, size_t table_len,
@@ -189,7 +202,9 @@ _Generic((_table), \
         fr_table_ptr_sorted_t *                : fr_table_sorted_ptr_by_longest_prefix,        \
         fr_table_ptr_ordered_t *               : fr_table_ordered_ptr_by_longest_prefix,       \
         fr_table_num_indexed_bit_pos_t *       : fr_table_ordered_num_by_longest_prefix,       \
-        fr_table_num_indexed_bit_pos_t const * : fr_table_ordered_num_by_longest_prefix        \
+        fr_table_num_indexed_bit_pos_t const * : fr_table_ordered_num_by_longest_prefix,       \
+        fr_table_num_indexed_t *               : fr_table_ordered_num_by_longest_prefix,       \
+        fr_table_num_indexed_t const *         : fr_table_ordered_num_by_longest_prefix        \
 )(_match_len, _table, _table ## _len, _name, _name_len, _def)
 
 char const     *fr_table_ordered_str_by_num(fr_table_num_ordered_t const *table, size_t table_len,
@@ -204,6 +219,9 @@ char const  *fr_table_sorted_str_by_ptr(fr_table_ptr_sorted_t const *table, size_
 char const     *fr_table_indexed_str_by_bit_field(fr_table_num_indexed_bit_pos_t const *table, size_t table_len,
                                                   uint64_t number, char const *def);
 
+char const     *fr_table_indexed_str_by_num(fr_table_num_indexed_t const *table, size_t table_len,
+                                            unsigned int number, char const *def);
+
 /** Convert an integer to a string
  *
  * @param[in] _table           to search in.
@@ -224,7 +242,9 @@ _Generic((_table), \
         fr_table_ptr_sorted_t *                : fr_table_sorted_str_by_ptr,                   \
         fr_table_ptr_ordered_t *               : fr_table_ordered_str_by_ptr,                  \
         fr_table_num_indexed_bit_pos_t *       : fr_table_indexed_str_by_bit_field,            \
-        fr_table_num_indexed_bit_pos_t const * : fr_table_indexed_str_by_bit_field             \
+        fr_table_num_indexed_bit_pos_t const * : fr_table_indexed_str_by_bit_field,            \
+        fr_table_num_indexed_t *               : fr_table_indexed_str_by_num,                  \
+        fr_table_num_indexed_t const *         : fr_table_indexed_str_by_num                   \
 )(_table, _table ## _len, _number, _def)
 
 #ifdef __cplusplus