}
}
+struct tlvdb *tlvdb_find_next(struct tlvdb *tlvdb, tlv_tag_t tag) {
+ if (!tlvdb)
+ return NULL;
+
+ return tlvdb_find(tlvdb->next, tag);
+}
+
+struct tlvdb *tlvdb_find(struct tlvdb *tlvdb, tlv_tag_t tag) {
+ if (!tlvdb)
+ return NULL;
+
+ for (; tlvdb; tlvdb = tlvdb->next) {
+ if (tlvdb->tag.tag == tag)
+ return tlvdb;
+ }
+
+ return NULL;
+}
+
+struct tlvdb *tlvdb_find_path(struct tlvdb *tlvdb, tlv_tag_t tag[]) {
+ int i = 0;
+ struct tlvdb *tnext = tlvdb;
+
+ while (tnext && tag[i]) {
+ tnext = tlvdb_find(tnext, tag[i]);
+ i++;
+ if (tag[i] && tnext) {
+ tnext = tnext->children;
+ }
+ }
+
+ return tnext;
+}
+
void tlvdb_add(struct tlvdb *tlvdb, struct tlvdb *other)
{
while (tlvdb->next) {
tlvdb->next = other;
}
-void tlvdb_visit(const struct tlvdb *tlvdb, tlv_cb cb, void *data)
+void tlvdb_visit(const struct tlvdb *tlvdb, tlv_cb cb, void *data, int level)
{
struct tlvdb *next = NULL;
for (; tlvdb; tlvdb = next) {
next = tlvdb->next;
- cb(data, &tlvdb->tag);
- tlvdb_visit(tlvdb->children, cb, data);
+ cb(data, &tlvdb->tag, level, (tlvdb->children == NULL));
+ tlvdb_visit(tlvdb->children, cb, data, level + 1);
}
}
return NULL;
}
+const struct tlv *tlvdb_get_inchild(const struct tlvdb *tlvdb, tlv_tag_t tag, const struct tlv *prev) {
+ tlvdb = tlvdb->children;
+ return tlvdb_get(tlvdb, tag, prev);
+}
+
unsigned char *tlv_encode(const struct tlv *tlv, size_t *len)
{
size_t size = tlv->len;