From: Arran Cudbard-Bell Date: Sat, 18 Apr 2020 20:21:32 +0000 (-0500) Subject: table: Add table indexed by numeric value X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2ba786f807551ebfd5231ed05d2ae6ea3a957595;p=thirdparty%2Ffreeradius-server.git table: Add table indexed by numeric value i.e. an array lookup... # Conflicts: # src/lib/util/table.c --- diff --git a/src/lib/util/table.c b/src/lib/util/table.c index 15f54908cdb..8e38c6d2e56 100644 --- a/src/lib/util/table.c +++ b/src/lib/util/table.c @@ -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) diff --git a/src/lib/util/table.h b/src/lib/util/table.h index b4d414c7137..bac3656d351 100644 --- a/src/lib/util/table.h +++ b/src/lib/util/table.h @@ -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