#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef struct Trie Trie;
struct Trie {
char key[16];
int end;
Trie *next;
Trie *child;
};
static Trie *trie_create(const char *str)
{
Trie
*trie
= malloc(sizeof(*trie
));
trie->next = NULL;
trie->child = NULL;
trie->end = 0;
return trie;
}
void trie_add(Trie **trie, const char *str)
{
char *tok;
int *p = NULL;
while (tok) {
while (*trie) {
if (strcmp((*trie
)->key
, tok
) == 0) break;
trie = &(*trie)->next;
}
if (*trie == NULL) {
*trie
= malloc(sizeof(**trie
));
(*trie)->next = NULL;
(*trie)->child = NULL;
(*trie)->end = 0;
}
p = &(*trie)->end;
trie = &(*trie)->child;
}
if (p) (*p)++;
}
void trie_delete(Trie *trie)
{
while (trie) {
Trie *t = trie;
trie_delete(trie->child);
trie = trie->next;
}
}
void trie_print(Trie *trie, int level)
{
while (trie) {
printf("%*s%s", level
* 4, "", trie
->key
); if (trie
->end
) printf(" [%d]", trie
->end
);
trie_print(trie->child, level + 1);
trie = trie->next;
}
}
int main()
{
Trie *trie = NULL;
trie_add(&trie, "foo.foo");
trie_add(&trie, "foo.foo");
trie_add(&trie, "foo.bar.foo.*");
trie_add(&trie, "foo.baz.*");
trie_add(&trie, "foo.*.bar");
trie_add(&trie, "bar.foo.*.one");
trie_add(&trie, "bar.foo.*.two");
trie_add(&trie, "foo.foo");
trie_add(&trie, "foo.foo");
trie_add(&trie, "bar");
trie_print(trie, 0);
trie_delete(trie);
return 0;
}
I2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKCgp0eXBlZGVmIHN0cnVjdCBUcmllIFRyaWU7CgpzdHJ1Y3QgVHJpZSB7CiAgICBjaGFyIGtleVsxNl07CiAgICBpbnQgZW5kOwogICAgVHJpZSAqbmV4dDsKICAgIFRyaWUgKmNoaWxkOwp9OwoKc3RhdGljIFRyaWUgKnRyaWVfY3JlYXRlKGNvbnN0IGNoYXIgKnN0cikKewogICAgVHJpZSAqdHJpZSA9IG1hbGxvYyhzaXplb2YoKnRyaWUpKTsKCiAgICB0cmllLT5uZXh0ID0gTlVMTDsKICAgIHRyaWUtPmNoaWxkID0gTlVMTDsKICAgIHRyaWUtPmVuZCA9IDA7CiAgICBzdHJjcHkodHJpZS0+a2V5LCBzdHIpOwogICAgCiAgICByZXR1cm4gdHJpZTsKfQoKdm9pZCB0cmllX2FkZChUcmllICoqdHJpZSwgY29uc3QgY2hhciAqc3RyKSAKewogICAgY2hhciBidWZbc3RybGVuKHN0cikgKyAxXTsKICAgIGNoYXIgKnRvazsKICAgIGludCAqcCA9IE5VTEw7CiAgICAKICAgIHN0cmNweShidWYsIHN0cik7CgogICAgdG9rID0gc3RydG9rKGJ1ZiwgIi4iKTsKICAgIAogICAgd2hpbGUgKHRvaykgewogICAgICAgIHdoaWxlICgqdHJpZSkgewogICAgICAgICAgICBpZiAoc3RyY21wKCgqdHJpZSktPmtleSwgdG9rKSA9PSAwKSBicmVhazsKCiAgICAgICAgICAgIHRyaWUgPSAmKCp0cmllKS0+bmV4dDsKICAgICAgICB9CgogICAgICAgIGlmICgqdHJpZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICp0cmllID0gbWFsbG9jKHNpemVvZigqKnRyaWUpKTsKICAgICAgICAgICAgCiAgICAgICAgICAgICgqdHJpZSktPm5leHQgPSBOVUxMOwogICAgICAgICAgICAoKnRyaWUpLT5jaGlsZCA9IE5VTEw7CiAgICAgICAgICAgICgqdHJpZSktPmVuZCA9IDA7CiAgICAgICAgICAgIHN0cmNweSgoKnRyaWUpLT5rZXksIHRvayk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHAgPSAmKCp0cmllKS0+ZW5kOwogICAgICAgIHRyaWUgPSAmKCp0cmllKS0+Y2hpbGQ7CgogICAgICAgIHRvayA9IHN0cnRvayhOVUxMLCAiLiIpOwogICAgfQogICAgCiAgICBpZiAocCkgKCpwKSsrOwp9Cgp2b2lkIHRyaWVfZGVsZXRlKFRyaWUgKnRyaWUpCnsKICAgIHdoaWxlICh0cmllKSB7CiAgICAgICAgVHJpZSAqdCA9IHRyaWU7ICAgCiAgICAKICAgICAgICB0cmllX2RlbGV0ZSh0cmllLT5jaGlsZCk7CiAgICAgICAgdHJpZSA9IHRyaWUtPm5leHQ7CiAgICAgICAgZnJlZSh0KTsKICAgIH0KfQoKdm9pZCB0cmllX3ByaW50KFRyaWUgKnRyaWUsIGludCBsZXZlbCkKewogICAgd2hpbGUgKHRyaWUpIHsKICAgICAgICBwcmludGYoIiUqcyVzIiwgbGV2ZWwgKiA0LCAiIiwgdHJpZS0+a2V5KTsKICAgICAgICBpZiAodHJpZS0+ZW5kKSBwcmludGYoIiBbJWRdIiwgdHJpZS0+ZW5kKTsKICAgICAgICBwdXRzKCIiKTsKICAgIAogICAgICAgIHRyaWVfcHJpbnQodHJpZS0+Y2hpbGQsIGxldmVsICsgMSk7CiAgICAgICAgdHJpZSA9IHRyaWUtPm5leHQ7CiAgICB9Cn0KCmludCBtYWluKCkKewogICAgVHJpZSAqdHJpZSA9IE5VTEw7CiAgICAKICAgIHRyaWVfYWRkKCZ0cmllLCAiZm9vLmZvbyIpOwogICAgdHJpZV9hZGQoJnRyaWUsICJmb28uZm9vIik7CiAgICB0cmllX2FkZCgmdHJpZSwgImZvby5iYXIuZm9vLioiKTsKICAgIHRyaWVfYWRkKCZ0cmllLCAiZm9vLmJhei4qIik7CiAgICB0cmllX2FkZCgmdHJpZSwgImZvby4qLmJhciIpOwogICAgdHJpZV9hZGQoJnRyaWUsICJiYXIuZm9vLioub25lIik7CiAgICB0cmllX2FkZCgmdHJpZSwgImJhci5mb28uKi50d28iKTsKICAgIHRyaWVfYWRkKCZ0cmllLCAiZm9vLmZvbyIpOwogICAgdHJpZV9hZGQoJnRyaWUsICJmb28uZm9vIik7CiAgICB0cmllX2FkZCgmdHJpZSwgImJhciIpOwoKICAgIHRyaWVfcHJpbnQodHJpZSwgMCk7CgogICAgdHJpZV9kZWxldGUodHJpZSk7CiAgICAKICAgIHJldHVybiAwOwp9Cg==