+int zebra_rec_keys_add_hash(zebra_rec_keys_t keys,
+ const char *str, size_t slen,
+ const struct it_key *key)
+{
+ struct zebra_rec_key_entry **kep_first
+ = zebra_rec_keys_mk_hash(keys, str, slen, key);
+ struct zebra_rec_key_entry **kep = kep_first;
+ while (*kep)
+ {
+ struct zebra_rec_key_entry *e = *kep;
+ if (slen == e->len && !memcmp(str, e->buf, slen) &&
+ !key_compare(key, &e->key))
+ {
+ *kep = (*kep)->next; /* out of queue */
+ e->next = *kep_first; /* move to front */
+ *kep_first = e;
+
+ return 0;
+ }
+ kep = &(*kep)->next;
+ }
+ *kep = nmem_malloc(keys->nmem, sizeof(**kep));
+ (*kep)->next = 0;
+ (*kep)->len = slen;
+ memcpy(&(*kep)->key, key, sizeof(*key));
+ (*kep)->buf = nmem_malloc(keys->nmem, slen);
+ memcpy((*kep)->buf, str, slen);
+ return 1;
+}
+