size_t record_in_recvd_len; //!< How much of the record we've received so far.
} eap_tls_session_t;
-extern fr_table_t const eap_tls_status_table[];
+extern fr_table_ordered_t const eap_tls_status_table[];
extern size_t eap_tls_status_table_len;
/*
PAIR_LIST_UNKNOWN //!< Unknown list.
} pair_list_t;
-extern fr_table_t const pair_list_table[];
+extern fr_table_ordered_t const pair_list_table[];
extern size_t pair_list_table_len;
typedef enum requests_ref_e {
for (vp = tmpl_cursor_init(NULL, &cursor, request, vpt);
vp;
vp = fr_cursor_next(&cursor)) {
- fr_dict_vendor_t const *vendor;
- fr_table_t const *type;
+ fr_dict_vendor_t const *vendor;
+ fr_table_ordered_t const *type;
if (vp->da->flags.has_tag) {
RIDEBUG2("&%s:%s:%i %s %pV",
#include "parallel_priv.h"
#include "module_priv.h"
-static fr_table_t unlang_action_table[] = {
+static fr_table_t const unlang_action_table[] = {
{ "break", UNLANG_ACTION_BREAK },
{ "calculate-result", UNLANG_ACTION_CALCULATE_RESULT },
{ "next", UNLANG_ACTION_EXECUTE_NEXT },
* that function does too many checks.
*/
for (i = 0; i < fr_value_box_type_table_len; i++) {
- fr_dict_attr_t *n;
- fr_table_t const *p = &fr_value_box_type_table[i];
+ fr_dict_attr_t *n;
+ fr_table_ordered_t const *p = &fr_value_box_type_table[i];
type_name = talloc_typed_asprintf(NULL, "Tmp-Cast-%s", p->name);
extern int fr_debug_lvl; /* 0 = no debugging information */
extern bool log_dates_utc;
-extern fr_table_t const fr_log_levels[];
+extern fr_table_ordered_t const fr_log_levels[];
extern size_t fr_log_levels_len;
typedef enum {
#include <string.h>
-/** Convert a string to an integer
+
+/** Convert a string to an integer using a lexicographically sorted table
+ *
+ * @param[in] table to search in.
+ * @param[in] table_len The number of elements in the table.
+ * @param[in] name to resolve to a number.
+ * @param[in] def Default value if no entry matched.
+ * @return
+ * - num value of matching entry.
+ * - def if no matching entries.
+ */
+int fr_table_sorted_num_by_str(fr_table_t const *table, size_t table_len,
+ char const *name, int def)
+{
+ ssize_t start = 0;
+ ssize_t end = table_len - 1;
+ ssize_t mid;
+
+ int ret;
+
+ if (!name) return def;
+
+ while (start <= end) {
+ mid = start + ((end - start) / 2); /* Avoid overflow */
+
+ ret = strcasecmp(name, table[mid].name);
+ if (ret == 0) return table[mid].number;
+
+ if (ret < 0) {
+ end = mid - 1;
+ } else {
+ start = mid + 1;
+ }
+ }
+
+ return def;
+}
+
+/** Convert a string to an integer using an arbitrarily ordered table
+ *
+ * @param[in] table to search in.
+ * @param[in] table_len The number of elements in the table.
+ * @param[in] name to resolve to a number.
+ * @param[in] def Default value if no entry matched.
+ * @return
+ * - num value of matching entry.
+ * - def if no matching entries.
+ */
+int fr_table_ordered_num_by_str(fr_table_ordered_t const *table, size_t table_len,
+ char const *name, int def)
+{
+ size_t i;
+
+ if (!name) return def;
+
+ for (i = 0; i < table_len; i++) if (strcasecmp(name, table[i].name) == 0) return table[i].number;
+
+ return def;
+}
+
+/** Convert a string matching part of name to an integer using a lexicographically sorted table
*
* @param[in] table to search in.
* @param[in] table_len The number of elements in the table.
* @param[in] name to locate.
+ * @param[in] name_len the maximum amount of name that should be matched.
* @param[in] def Value to return if there are no matches.
* @return
* - num value of matching entry.
* - def if no matching entries.
*/
-int _fr_table_num_by_str(fr_table_t const *table, size_t table_len,
- char const *name, int def)
+int fr_table_sorted_num_by_substr(fr_table_t const *table, size_t table_len,
+ char const *name, size_t name_len, int def)
{
- size_t i;
+ ssize_t start = 0;
+ ssize_t end = table_len - 1;
+ ssize_t mid;
+
+ int ret;
if (!name) return def;
- for (i = 0; i < table_len; i++) {
- if (strcasecmp(table[i].name, name) == 0) return table[i].number;
+ while (start <= end) {
+ mid = start + ((end - start) / 2); /* Avoid overflow */
+
+ /*
+ * Match up to the length of the table entry if len is < 0.
+ */
+ ret = strncasecmp(name, table[mid].name, (name_len < 0) ? strlen(table[mid].name) : name_len);
+ if (ret == 0) return table[mid].number;
+
+ if (ret < 0) {
+ end = mid - 1;
+ } else {
+ start = mid + 1;
+ }
}
return def;
}
-/** Convert a string matching part of name to an integer
+/** Convert a string matching part of name to an integer using an arbitrarily ordered table
*
* @param[in] table to search in.
* @param[in] table_len The number of elements in the table.
* - num value of matching entry.
* - def if no matching entries.
*/
-int _fr_table_num_by_substr(fr_table_t const *table, size_t table_len,
- char const *name, ssize_t name_len, int def)
+int fr_table_ordered_num_by_substr(fr_table_ordered_t const *table, size_t table_len,
+ char const *name, ssize_t name_len, int def)
{
size_t i;
- size_t max;
if (!name) return def;
/*
* Match up to the length of the table entry if len is < 0.
*/
- max = (name_len < 0) ? tlen : (unsigned)name_len;
-
- if (strncasecmp(table[i].name, name, max) == 0) return table[i].number;
+ if (strncasecmp(name, table[i].name, (name_len < 0) ? tlen : name_len) == 0) return table[i].number;
}
return def;
* - num value of matching entry.
* - def if no matching entries.
*/
-int _fr_table_lex_num_by_longest_prefix(fr_table_t const *table, size_t table_len,
+int _fr_table_sorted_num_by_longest_prefix(fr_table_t const *table, size_t table_len,
char const *name, size_t name_len, int def)
{
- size_t start = 0;
- size_t end = table_len - 1;
- size_t mid;
+ ssize_t start = 0;
+ ssize_t end = table_len - 1;
+ ssize_t mid;
int ret;
int num = def;
+ if (!name) return def;
+
while (start <= end) {
mid = start + ((end - start) / 2); /* Avoid overflow */
- ret = strncasecmp(table[mid].name, name, name_len);
+ ret = strncasecmp(name, table[mid].name, name_len);
if (ret == 0) {
size_t tlen;
return num;
}
-/** Efficient string lookup in lexicographically sorted fr_table_t table
- *
- * @param[in] table to search in.
- * @param[in] table_len The number of elements in the table.
- * @param[in] name to locate.
- * @param[in] name_len the maximum amount of name that should be matched.
- * @param[in] def Value to return if there are no matches.
- * @return
- * - num value of matching entry.
- * - def if no matching entries.
- */
-int _fr_table_lex_num_by_str(fr_table_t const *table, size_t table_len,
- char const *name, size_t name_len, int def)
-{
- size_t start = 0;
- size_t end = table_len - 1;
- size_t mid;
-
- int ret;
-
- while (start <= end) {
- mid = start + ((end - start) / 2); /* Avoid overflow */
-
- ret = strncasecmp(table[mid].name, name, name_len);
- if (ret == 0) return table[mid].number;
-
- if (ret < 0) {
- end = mid - 1;
- } else {
- start = mid + 1;
- }
- }
-
- return def;
-}
-
/** Convert an integer to a string
*
* @param[in] table to search in.
* - string value of matching entry.
* - def if no matching entries.
*/
-char const *_fr_table_str_by_num(fr_table_t const *table, size_t table_len,
+char const *_fr_table_str_by_num(fr_table_ordered_t const *table, size_t table_len,
int number, char const *def)
{
size_t i;
#include <stdint.h>
#include <sys/types.h>
-struct fr_table_s {
+typedef struct {
char const *name;
int32_t number;
-};
+} fr_table_t;
-typedef struct fr_table_s fr_table_t;
-typedef struct fr_table_s fr_table_ordered_t;
+typedef struct {
+ char const *name;
+ int32_t number;
+} fr_table_ordered_t;
/** Macro to use as dflt
*
*/
#define NAME_NUMBER_NOT_FOUND INT32_MIN
-int _fr_table_num_by_str(fr_table_t const *table, size_t table_len,
- char const *name, int def);
-
-int _fr_table_num_by_substr(fr_table_t const *table, size_t table_len,
- char const *name, ssize_t name_len, int def);
-
-int _fr_table_lex_num_by_longest_prefix(fr_table_t const *table, size_t table_len,
- char const *name, size_t name_len, int def);
-
-int _fr_table_lex_num_by_str(fr_table_t const *table, size_t table_len,
- char const *name, size_t name_len, int def);
-char const *_fr_table_str_by_num(fr_table_t const *table, size_t table_len,
- int number, char const *def);
+int fr_table_sorted_num_by_str(fr_table_t const *table, size_t table_len,
+ char const *name, int def);
+int fr_table_ordered_num_by_str(fr_table_ordered_t const *table, size_t table_len,
+ char const *name, int def);
-/** Convert a string to an integer
+/** Convert a string to an integer using a sorted or ordered table
*
- * @copybrief _fr_table_num_by_str
+ * @param[in] _table to search in.
+ * @param[in] _name to resolve to a number.
+ * @param[in] _def Default value if no entry matched.
+ * @return
+ * - _def if name matched no entries in the table.
+ * - the numeric value of the matching entry.
*/
-#define fr_table_num_by_str(_table, _name, _def) \
- _fr_table_num_by_str(_table, _table ## _len, _name, _def)
+#define fr_table_num_by_str(_table, _name, _def) \
+_Generic((_table), \
+ fr_table_t const * : fr_table_sorted_num_by_str, \
+ fr_table_ordered_t const * : fr_table_ordered_num_by_str, \
+ fr_table_t * : fr_table_sorted_num_by_str, \
+ fr_table_ordered_t * : fr_table_ordered_num_by_str \
+)(_table, _table ## _len, _name, _def)
+
+int fr_table_sorted_num_by_substr(fr_table_t const *table, size_t table_len,
+ char const *name, size_t name_len, int def);
-/** Convert a string matching part of name to an integer
+int fr_table_ordered_num_by_substr(fr_table_ordered_t const *table, size_t table_len,
+ char const *name, ssize_t name_len, int def);
+
+/** Convert a partial string to an integer using an ordered or sorted table
*
- * @copybrief _fr_table_num_by_substr
+ * @param[in] _table to search in.
+ * @param[in] _name to resolve to a number.
+ * @param[in] _name_len The amount of name to match.
+ * @param[in] _def Default value if no entry matched.
+ * @return
+ * - _def if name matched no entries in the table.
+ * - the numeric value of the matching entry.
*/
-#define fr_table_num_by_substr(_table, _name, _name_len, _def) \
- _fr_table_num_by_substr(_table, _table ## _len, _name, _name_len, _def)
+#define fr_table_num_by_substr(_table, _name, _name_len, _def) \
+_Generic((_table), \
+ fr_table_t const * : fr_table_sorted_num_by_substr, \
+ fr_table_ordered_t const * : fr_table_ordered_num_by_substr, \
+ fr_table_t * : fr_table_sorted_num_by_substr, \
+ fr_table_ordered_t * : fr_table_ordered_num_by_substr \
+)(_table, _table ## _len, _name, _name_len, _def)
+
+int _fr_table_sorted_num_by_longest_prefix(fr_table_t const *table, size_t table_len,
+ char const *name, size_t name_len, int def);
/** Find the longest string match in a lexicographically sorted fr_table_t table
*
- * @copybrief _fr_table_lex_num_by_longest_prefix
+ * @copybrief _fr_table_sorted_num_by_longest_prefix
*/
-#define fr_table_lex_num_by_longest_prefix(_table, _name, _name_len, _def) \
- _fr_table_lex_num_by_longest_prefix(_table, _table ## _len, _name, _name_len, _def)
+#define fr_table_sorted_num_by_longest_prefix(_table, _name, _name_len, _def) \
+ _fr_table_sorted_num_by_longest_prefix(_table, , _name, _name_len, _def)
-/** Efficient string lookup in lexicographically sorted fr_table_t table
- *
- * @copybrief _fr_table_lex_num_by_str
- */
-#define fr_table_lex_num_by_str(_table, _name, _name_len, _def) \
- _fr_table_lex_num_by_str(_table, _table ## _len, _name, _name_len, _def)
+
+char const *_fr_table_str_by_num(fr_table_ordered_t const *table, size_t table_len,
+ int number, char const *def);
/** Convert an integer to a string
*
- * @copybrief _fr_table_str_from_int
+ * @param[in] _table to search in.
+ * @param[in] _number to resolve to a string.
+ * @param[in] _def Default string to return if there's no match.
+ * @return
+ * - _def if _number name matched no entries in the table.
+ * - the string value of the matching entry.
*/
-#define fr_table_str_by_num(_table, _number, _def) \
- _fr_table_str_by_num(_table, _table ## _len, _number, _def)
+#define fr_table_str_by_num(_table, _number, _def) \
+_Generic((_table), \
+ fr_table_t const * : _fr_table_str_by_num, \
+ fr_table_ordered_t const * : _fr_table_str_by_num, \
+ fr_table_t * : _fr_table_str_by_num, \
+ fr_table_ordered_t * : _fr_table_str_by_num \
+)((fr_table_ordered_t const *)_table, _table ## _len, _number, _def)
+
#ifdef __cplusplus
}
#endif
* Returns 0 or special token value.
*/
static FR_TOKEN getthing(char const **ptr, char *buf, int buflen, bool tok,
- fr_table_t const *tokenlist, size_t tokenlist_len, bool unescape)
+ fr_table_ordered_t const *tokenlist, size_t tokenlist_len, bool unescape)
{
char *s;
char const *p;
*/
#define FR_TABLE_NOT_FOUND INT32_MIN
-extern fr_table_t const fr_tokens_table[];
+extern fr_table_ordered_t const fr_tokens_table[];
extern size_t fr_tokens_table_len;
extern fr_table_t const fr_token_quotes_table[];
extern size_t fr_token_quotes_table_len;
extern "C" {
#endif
-extern fr_table_t const fr_value_box_type_table[];
+extern fr_table_ordered_t const fr_value_box_type_table[];
extern size_t fr_value_box_type_table_len;
extern size_t const fr_value_box_field_sizes[];