27RCSIDH(table_h,
"$Id: 38c2d2be6e904ae2d086d3947245f6eb9305acd9 $")
110#define FR_TABLE_INDEXED_ENTRY(_v) [_v] = { L(STRINGIFY(_v)), _v }
125#define FR_TABLE_INDEXED_BIT_POS_ENTRY(_v) [__builtin_ctz(_v) + 1] = { L(STRINGIFY(_v)), _v }
130#define NAME_NUMBER_NOT_FOUND INT32_MIN
134#define TABLE_IDX(_table, _idx, _element_size) (((uint8_t const *)(_table)) + ((_idx) * (_element_size)))
135#define ELEM_STR(_offset) (*((fr_table_elem_name_t const *)(_offset))).str
136#define ELEM_LEN(_offset) (*((fr_table_elem_name_t const *)(_offset))).len
149#define TABLE_TYPE_NAME_FUNC(_func, _our_table_type, _our_name, _our_def_type, _our_return_type) \
150_our_return_type _our_name(_our_table_type table, size_t table_len, char const *name, _our_def_type def) \
152 _our_return_type ret; \
153 _our_table_type found; \
154 found = (_our_table_type)_func(table, table_len, sizeof(((_our_table_type)0)[0]), name); \
156 memcpy(&ret, &def, sizeof(ret)); \
159 memcpy(&ret, &found->value, sizeof(ret)); \
174#define TABLE_TYPE_NAME_FUNC_RPTR(_func, _our_table_type, _our_name, _our_def_type, _our_out_type) \
175bool _our_name(_our_out_type *out, _our_table_type table, size_t table_len, char const *name, _our_def_type def) \
177 _our_table_type found; \
178 found = (_our_table_type)_func(table, table_len, sizeof(((_our_table_type)0)[0]), name); \
183 *out = &found->value; \
203#define TABLE_TYPE_NAME_LEN_FUNC(_func, _our_table_type, _our_name, _our_def_type, _our_return_type) \
204_our_return_type _our_name(_our_table_type table, size_t table_len, char const *name, ssize_t name_len, _our_def_type def) \
206 _our_return_type ret; \
207 _our_table_type found; \
208 found = (_our_table_type)_func(table, table_len, sizeof(((_our_table_type)0)[0]), name, name_len); \
210 memcpy(&ret, &def, sizeof(ret)); \
213 memcpy(&ret, &found->value, sizeof(ret)); \
236#define TABLE_TYPE_NAME_LEN_FUNC_RPTR(_func, _our_table_type, _our_name, _our_def_type, _our_out_type) \
237bool _our_name(_our_out_type *out, _our_table_type table, size_t table_len, char const *name, ssize_t name_len, _our_def_type def) \
239 _our_table_type found; \
240 found = (_our_table_type)_func(table, table_len, sizeof(((_our_table_type)0)[0]), name, name_len); \
245 *out = &found->value; \
264#define TABLE_TYPE_NAME_MATCH_LEN_FUNC(_func, _our_table_type, _our_name, _our_def_type, _our_return_type) \
265_our_return_type _our_name(size_t *match_len, _our_table_type table, size_t table_len, char const *name, ssize_t name_len, _our_def_type def) \
267 _our_return_type ret; \
268 _our_table_type found; \
269 found = (_our_table_type)_func(match_len, table, table_len, sizeof(((_our_table_type)0)[0]), name, name_len); \
271 memcpy(&ret, &def, sizeof(ret)); \
274 memcpy(&ret, &found->value, sizeof(ret)); \
294#define TABLE_TYPE_NAME_MATCH_LEN_FUNC_RPTR(_func, _our_table_type, _our_name, _our_def_type, _our_out_type) \
295bool _our_name(size_t *match_len, _our_out_type *out, _our_table_type table, size_t table_len, char const *name, ssize_t name_len, _our_def_type def) \
297 _our_table_type found; \
298 found = (_our_table_type)_func(match_len, table, table_len, sizeof(((_our_table_type)0)[0]), name, name_len); \
303 *out = &found->value; \
313#define TABLE_TYPE_VALUE_FUNC(_our_table_type, _our_name, _our_value_type) \
314char const *_our_name(_our_table_type table, size_t table_len, _our_value_type value, char const *def) \
317 for (i = 0; i < table_len; i++) if (table[i].value == value) return table[i].name.str; \
327#define TABLE_TYPE_VALUE_INDEX_BIT_FIELD_FUNC(_our_table_type, _our_name, _our_value_type) \
328char const *_our_name(_our_table_type table, size_t table_len, _our_value_type value, char const *def) \
330 uint8_t idx = fr_high_bit_pos(value); \
331 if (idx >= table_len) return def; \
332 if (!table[idx].name.str) return def; \
333 return table[idx].name.str; \
342#define TABLE_TYPE_VALUE_INDEX_FUNC(_our_table_type, _our_name, _our_value_type) \
343char const *_our_name(_our_table_type table, size_t table_len, _our_value_type value, char const *def) \
345 if (value >= table_len) return def; \
346 if (!table[value].name.str) return def; \
347 return table[value].name.str; \
369 if (!
name)
return NULL;
371 while (start <= end) {
374 mid = start + ((end - start) / 2);
376 offset =
TABLE_IDX(table, mid, element_size);
378 if (ret == 0)
return offset;
404 if (!
name)
return NULL;
406 for (i = 0; i < table_len; i++) {
407 void const *offset =
TABLE_IDX(table, i, element_size);
436 if (!
name)
return NULL;
438 while (start <= end) {
441 mid = start + ((end - start) / 2);
443 offset =
TABLE_IDX(table, mid, element_size);
450 if (ret == 0)
return offset;
480 if (!
name)
return NULL;
482 for (i = 0; i < table_len; i++) {
486 offset =
TABLE_IDX(table, i, element_size);
493 if ((name_len > 0) && (name_len < (
int) tlen))
continue;
499 (name_len < 0) ? tlen : (
size_t)name_len) == 0)
return offset;
525 void const *table,
size_t table_len,
size_t element_size,
533 void const *found = NULL;
535 if (!
name)
return NULL;
536 if (name_len < 0) name_len = strlen(
name);
538 while (start <= end) {
543 mid = start + ((end - start) / 2);
545 offset =
TABLE_IDX(table, mid, element_size);
554 if (tlen == (
size_t)name_len) {
555 if (match_len) *match_len = tlen;
565 if (tlen < (
size_t)name_len) {
567 if (match_len) *match_len = tlen;
581 if (!found && match_len) *match_len = 0;
601 void const *table,
size_t table_len,
size_t element_size,
605 size_t found_len = 0;
606 void const *found = NULL;
608 if (!
name)
return NULL;
609 if (name_len < 0) name_len = strlen(
name);
611 for (i = 0; i < table_len; i++) {
615 offset =
TABLE_IDX(table, i, element_size);
618 (tolower(
name[j]) == tolower((
ELEM_STR(offset))[j])); j++);
624 if ((
ELEM_STR(offset))[j] !=
'\0')
continue;
629 if (j == (
size_t)name_len) {
630 if (match_len) *match_len = name_len;
646 if (match_len) *match_len = found_len;
657#define fr_table_str_by_str_value(_table, _str_value, _def) \
659 fr_table_ptr_sorted_t const * : _fr_table_ptr_by_str_value((fr_table_ptr_sorted_t const *)_table, _table ## _len, _str_value, _def), \
660 fr_table_ptr_ordered_t const * : _fr_table_ptr_by_str_value((fr_table_ptr_sorted_t const *)_table, _table ## _len, _str_value, _def), \
661 fr_table_ptr_sorted_t * : _fr_table_ptr_by_str_value((fr_table_ptr_sorted_t const *)_table, _table ## _len, _str_value, _def), \
662 fr_table_ptr_ordered_t * : _fr_table_ptr_by_str_value((fr_table_ptr_sorted_t const *)_table, _table ## _len, _str_value, _def))
665 char const *
name,
int def);
668 char const *
name,
int def);
671 char const *
name,
void const *def);
674 char const *
name,
void const *def);
685#define fr_table_value_by_str(_table, _name, _def) \
687 fr_table_num_sorted_t const * : fr_table_sorted_num_by_str, \
688 fr_table_num_ordered_t const * : fr_table_ordered_num_by_str, \
689 fr_table_num_sorted_t * : fr_table_sorted_num_by_str, \
690 fr_table_num_ordered_t * : fr_table_ordered_num_by_str, \
691 fr_table_ptr_sorted_t const * : fr_table_sorted_ptr_by_str, \
692 fr_table_ptr_ordered_t const * : fr_table_ordered_ptr_by_str, \
693 fr_table_ptr_sorted_t * : fr_table_sorted_ptr_by_str, \
694 fr_table_ptr_ordered_t * : fr_table_ordered_ptr_by_str, \
695 fr_table_num_indexed_bit_pos_t * : fr_table_ordered_num_by_str, \
696 fr_table_num_indexed_bit_pos_t const * : fr_table_ordered_num_by_str, \
697 fr_table_num_indexed_t * : fr_table_ordered_num_by_str, \
698 fr_table_num_indexed_t const * : fr_table_ordered_num_by_str \
699)(_table, _table ## _len, _name, _def)
708 char const *
name,
ssize_t name_len,
void const *def);
711 char const *
name,
ssize_t name_len,
void const *def);
725#define fr_table_value_by_substr(_table, _name, _name_len, _def) \
727 fr_table_num_sorted_t const * : fr_table_sorted_num_by_substr, \
728 fr_table_num_ordered_t const * : fr_table_ordered_num_by_substr, \
729 fr_table_num_sorted_t * : fr_table_sorted_num_by_substr, \
730 fr_table_num_ordered_t * : fr_table_ordered_num_by_substr, \
731 fr_table_ptr_sorted_t const * : fr_table_sorted_ptr_by_substr, \
732 fr_table_ptr_ordered_t const * : fr_table_ordered_ptr_by_substr, \
733 fr_table_ptr_sorted_t * : fr_table_sorted_ptr_by_substr, \
734 fr_table_ptr_ordered_t * : fr_table_ordered_ptr_by_substr, \
735 fr_table_num_indexed_bit_pos_t * : fr_table_ordered_num_by_substr, \
736 fr_table_num_indexed_bit_pos_t const * : fr_table_ordered_num_by_substr, \
737 fr_table_num_indexed_t * : fr_table_ordered_num_by_substr, \
738 fr_table_num_indexed_t const * : fr_table_ordered_num_by_substr \
739)(_table, _table ## _len, _name, _name_len, _def)
748 char const *
name,
ssize_t name_len,
void const *def);
751 char const *
name,
ssize_t name_len,
void const *def);
764#define fr_table_value_by_longest_prefix(_match_len, _table, _name, _name_len, _def) \
766 fr_table_num_sorted_t const * : fr_table_sorted_num_by_longest_prefix, \
767 fr_table_num_ordered_t const * : fr_table_ordered_num_by_longest_prefix, \
768 fr_table_num_sorted_t * : fr_table_sorted_num_by_longest_prefix, \
769 fr_table_num_ordered_t * : fr_table_ordered_num_by_longest_prefix, \
770 fr_table_ptr_sorted_t const * : fr_table_sorted_ptr_by_longest_prefix, \
771 fr_table_ptr_ordered_t const * : fr_table_ordered_ptr_by_longest_prefix, \
772 fr_table_ptr_sorted_t * : fr_table_sorted_ptr_by_longest_prefix, \
773 fr_table_ptr_ordered_t * : fr_table_ordered_ptr_by_longest_prefix, \
774 fr_table_num_indexed_bit_pos_t * : fr_table_ordered_num_by_longest_prefix, \
775 fr_table_num_indexed_bit_pos_t const * : fr_table_ordered_num_by_longest_prefix, \
776 fr_table_num_indexed_t * : fr_table_ordered_num_by_longest_prefix, \
777 fr_table_num_indexed_t const * : fr_table_ordered_num_by_longest_prefix \
778)(_match_len, _table, _table ## _len, _name, _name_len, _def)
781 int number,
char const *def);
783 int number,
char const *def);
785 void const *ptr,
char const *def);
787 void const *ptr,
char const *def);
790 uint64_t number,
char const *def);
793 unsigned int number,
char const *def);
804#define fr_table_str_by_value(_table, _number, _def) \
806 fr_table_num_sorted_t const * : fr_table_sorted_str_by_num, \
807 fr_table_num_ordered_t const * : fr_table_ordered_str_by_num, \
808 fr_table_num_sorted_t * : fr_table_sorted_str_by_num, \
809 fr_table_num_ordered_t * : fr_table_ordered_str_by_num, \
810 fr_table_ptr_sorted_t const * : fr_table_sorted_str_by_ptr, \
811 fr_table_ptr_ordered_t const * : fr_table_ordered_str_by_ptr, \
812 fr_table_ptr_sorted_t * : fr_table_sorted_str_by_ptr, \
813 fr_table_ptr_ordered_t * : fr_table_ordered_str_by_ptr, \
814 fr_table_num_indexed_bit_pos_t * : fr_table_indexed_str_by_bit_field, \
815 fr_table_num_indexed_bit_pos_t const * : fr_table_indexed_str_by_bit_field, \
816 fr_table_num_indexed_t * : fr_table_indexed_str_by_num, \
817 fr_table_num_indexed_t const * : fr_table_indexed_str_by_num \
818)(_table, _table ## _len, _number, _def)
820#define TABLE_TYPE_NEEDLE_LEN_FUNC(_our_table_type, _our_name) \
821static inline size_t _our_name(_our_table_type table, size_t table_len) \
824 for (i = 0; i < table_len; i++) if (table[i].name.len > max) max = table[i].name.len; \
835#define fr_table_max_needle_len(_table) \
837 fr_table_num_sorted_t const * : fr_table_num_sorted_max_needle_len, \
838 fr_table_num_ordered_t const * : fr_table_num_ordered_max_needle_len, \
839 fr_table_num_sorted_t * : fr_table_num_sorted_max_needle_len, \
840 fr_table_num_ordered_t * : fr_table_num_ordered_max_needle_len, \
841 fr_table_ptr_sorted_t const * : fr_table_ptr_sorted_max_needle_len, \
842 fr_table_ptr_ordered_t const * : fr_table_ptr_ordered_max_needle_len, \
843 fr_table_ptr_sorted_t * : fr_table_ptr_sorted_max_needle_len, \
844 fr_table_ptr_ordered_t * : fr_table_ptr_ordered_max_needle_len, \
845 fr_table_num_indexed_bit_pos_t * : fr_table_num_indexed_bit_pos_max_needle_len, \
846 fr_table_num_indexed_bit_pos_t const * : fr_table_num_indexed_bit_pos_max_needle_len, \
847 fr_table_num_indexed_t * : fr_table_num_indexed_max_needle_len, \
848 fr_table_num_indexed_t const * : fr_table_num_indexed_max_needle_len \
849)(_table, _table ## _len)
int strncasecmp(char *s1, char *s2, int n)
int strcasecmp(char *s1, char *s2)
void * fr_table_ordered_ptr_by_longest_prefix(size_t *match_len, fr_table_ptr_ordered_t const *table, size_t table_len, char const *name, ssize_t name_len, void const *def)
char const * str
Literal string.
int fr_table_ordered_num_by_substr(fr_table_num_ordered_t const *table, size_t table_len, char const *name, ssize_t name_len, int def)
void * fr_table_sorted_ptr_by_substr(fr_table_ptr_sorted_t const *table, size_t table_len, char const *name, ssize_t name_len, void const *def)
#define ELEM_STR(_offset)
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)
static void const * table_ordered_value_by_longest_prefix(size_t *match_len, void const *table, size_t table_len, size_t element_size, char const *name, ssize_t name_len)
Find the longest string match using an arbitrarily ordered table.
char const * fr_table_ordered_str_by_ptr(fr_table_ptr_ordered_t const *table, size_t table_len, void const *ptr, char const *def)
char const * fr_table_sorted_str_by_num(fr_table_num_sorted_t const *table, size_t table_len, int number, char const *def)
int fr_table_ordered_num_by_longest_prefix(size_t *match_len, fr_table_num_ordered_t const *table, size_t table_len, char const *name, ssize_t name_len, int def)
void * fr_table_ordered_ptr_by_str(fr_table_ptr_ordered_t const *table, size_t table_len, char const *name, void const *def)
#define TABLE_TYPE_NEEDLE_LEN_FUNC(_our_table_type, _our_name)
static void const * table_ordered_value_by_substr(void const *table, size_t table_len, size_t element_size, char const *name, ssize_t name_len)
Convert a string matching part of name to an integer using an arbitrarily ordered table.
char const * _fr_table_ptr_by_str_value(fr_table_ptr_sorted_t const *table, size_t table_len, char const *str_val, char const *def)
Brute force search a sorted or ordered ptr table, assuming the pointers are strings.
char const * fr_table_sorted_str_by_ptr(fr_table_ptr_sorted_t const *table, size_t table_len, void const *ptr, char const *def)
static void const * table_sorted_value_by_substr(void const *table, size_t table_len, size_t element_size, char const *name, ssize_t name_len)
Convert a string matching part of name to an integer using a lexicographically sorted table.
int fr_table_sorted_num_by_substr(fr_table_num_sorted_t const *table, size_t table_len, char const *name, ssize_t name_len, int def)
fr_table_elem_name_t name
fr_table_elem_name_t name
static void const * table_ordered_value_by_str(void const *table, size_t table_len, size_t element_size, char const *name)
Convert a string to a value using an arbitrarily ordered table.
fr_table_elem_name_t name
fr_table_elem_name_t name
int fr_table_sorted_num_by_str(fr_table_num_sorted_t const *table, size_t table_len, char const *name, int def)
static void const * table_sorted_value_by_longest_prefix(size_t *match_len, void const *table, size_t table_len, size_t element_size, char const *name, ssize_t name_len)
Find the longest string match using a lexicographically sorted table.
static void const * table_sorted_value_by_str(void const *table, size_t table_len, size_t element_size, char const *name)
Convert a string to a value using a lexicographically sorted table.
int fr_table_ordered_num_by_str(fr_table_num_ordered_t const *table, size_t table_len, char const *name, int def)
#define TABLE_IDX(_table, _idx, _element_size)
void * fr_table_sorted_ptr_by_str(fr_table_ptr_sorted_t const *table, size_t table_len, char const *name, void const *def)
void * fr_table_ordered_ptr_by_substr(fr_table_ptr_ordered_t const *table, size_t table_len, char const *name, ssize_t name_len, void const *def)
fr_table_elem_name_t name
fr_table_elem_name_t name
size_t len
Literal string length.
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)
#define ELEM_LEN(_offset)
void * fr_table_sorted_ptr_by_longest_prefix(size_t *match_len, fr_table_ptr_sorted_t const *table, size_t table_len, char const *name, ssize_t name_len, void const *def)
int fr_table_sorted_num_by_longest_prefix(size_t *match_len, fr_table_num_sorted_t const *table, size_t table_len, char const *name, ssize_t name_len, int def)
char const * fr_table_ordered_str_by_num(fr_table_num_ordered_t const *table, size_t table_len, int number, char const *def)
An element in a table indexed by bit position.
An element in a table indexed by numeric value.
An element in an arbitrarily ordered array of name to num mappings.
An element in a lexicographically sorted array of name to num mappings.
An element in an arbitrarily ordered array of name to ptr mappings.
An element in a lexicographically sorted array of name to ptr mappings.