+
+ return hash;
+}
+
+
+/*
+ * Hash callback functions.
+ */
+static uint32_t dict_attr_name_hash(const void *data)
+{
+ return dict_hashname(((const DICT_ATTR *)data)->name);
+}
+
+static int dict_attr_name_cmp(const void *one, const void *two)
+{
+ const DICT_ATTR *a = one;
+ const DICT_ATTR *b = two;
+
+ return strcasecmp(a->name, b->name);
+}
+
+static uint32_t dict_attr_value_hash(const void *data)
+{
+ uint32_t hash;
+ const DICT_ATTR *attr = data;
+
+ hash = fr_hash(&attr->vendor, sizeof(attr->vendor));
+ return fr_hash_update(&attr->attr, sizeof(attr->attr), hash);
+}
+
+static int dict_attr_value_cmp(const void *one, const void *two)
+{
+ const DICT_ATTR *a = one;
+ const DICT_ATTR *b = two;
+
+ if (a->vendor < b->vendor) return -1;
+ if (a->vendor > b->vendor) return +1;
+
+ return a->attr - b->attr;
+}
+
+static uint32_t dict_vendor_name_hash(const void *data)
+{
+ return dict_hashname(((const DICT_VENDOR *)data)->name);
+}
+
+static int dict_vendor_name_cmp(const void *one, const void *two)
+{
+ const DICT_VENDOR *a = one;
+ const DICT_VENDOR *b = two;
+
+ return strcasecmp(a->name, b->name);
+}
+
+static uint32_t dict_vendor_value_hash(const void *data)
+{
+ return fr_hash(&(((const DICT_VENDOR *)data)->vendorpec),
+ sizeof(((const DICT_VENDOR *)data)->vendorpec));
+}
+
+static int dict_vendor_value_cmp(const void *one, const void *two)
+{
+ const DICT_VENDOR *a = one;
+ const DICT_VENDOR *b = two;
+
+ return a->vendorpec - b->vendorpec;
+}
+
+static uint32_t dict_value_name_hash(const void *data)
+{
+ uint32_t hash;
+ const DICT_VALUE *dval = data;
+
+ hash = dict_hashname(dval->name);
+ hash = fr_hash_update(&dval->vendor, sizeof(dval->vendor), hash);
+ return fr_hash_update(&dval->attr, sizeof(dval->attr), hash);
+}
+
+static int dict_value_name_cmp(const void *one, const void *two)
+{
+ int rcode;
+ const DICT_VALUE *a = one;
+ const DICT_VALUE *b = two;
+
+ rcode = a->attr - b->attr;
+ if (rcode != 0) return rcode;
+
+ rcode = a->vendor - b->vendor;
+ if (rcode != 0) return rcode;
+
+ return strcasecmp(a->name, b->name);
+}
+
+static uint32_t dict_value_value_hash(const void *data)
+{
+ uint32_t hash;
+ const DICT_VALUE *dval = data;
+
+ hash = fr_hash(&dval->attr, sizeof(dval->attr));
+ hash = fr_hash_update(&dval->vendor, sizeof(dval->vendor), hash);
+ return fr_hash_update(&dval->value, sizeof(dval->value), hash);
+}
+
+static int dict_value_value_cmp(const void *one, const void *two)
+{
+ int rcode;
+ const DICT_VALUE *a = one;
+ const DICT_VALUE *b = two;
+
+ if (a->vendor < b->vendor) return -1;
+ if (a->vendor > b->vendor) return +1;
+
+ rcode = a->attr - b->attr;
+ if (rcode != 0) return rcode;
+
+ return a->value - b->value;