#include <mLib/bits.h>
#include <mLib/hash.h>
+#include <mLib/macros.h>
#include <mLib/sub.h>
#include <mLib/sym.h>
time_t t = time(0);
char *p;
uint32 id;
- key_ref *kr = sym_find(&f->bytag, tag, -1, 0, 0);
+ enum { GUESS = -1, TAG, ID, TYPE }; int lookup;
+ key_ref *kr;
key *k;
- if (kr && !(KEY_EXPIRED(t, kr->k->exp) && KEY_EXPIRED(t, kr->k->del)))
+ if (STRNCMP(tag, ==, "tag:", 4)) { lookup = TAG; tag += 4; }
+ else if (STRNCMP(tag, ==, "id:", 3)) { lookup = ID; tag += 3; }
+ else if (STRNCMP(tag, ==, "type:", 5)) { lookup = TYPE; tag += 5; }
+ else lookup = GUESS;
+
+ if ((lookup == GUESS || lookup == TAG) &&
+ (kr = sym_find(&f->bytag, tag, -1, 0, 0)) != 0 &&
+ !(KEY_EXPIRED(t, kr->k->exp) && KEY_EXPIRED(t, kr->k->del)))
return (kr->k);
- id = strtoul(tag, &p, 16);
- if (!*p && (k = key_byid(f, id)) != 0) return (k);
- return (key_bytype(f, tag));
+
+ if (lookup == GUESS || lookup == ID) {
+ id = strtoul(tag, &p, 16);
+ if (!*p && (k = key_byid(f, id)) != 0) return (k);
+ }
+
+ if ((lookup == GUESS || lookup == TYPE) && (k = key_bytype(f, tag)) != 0)
+ return (k);
+
+ return (0);
}
/* --- @key_qtag@ --- *