X-Git-Url: http://git.asbjorn.it/?a=blobdiff_plain;ds=sidebyside;f=lib%2Fq.c;h=e57810770e430b82319e4a6de5e078261d8d294f;hb=067b8f578c7b189840383b979ea4ca8ccc88ebe9;hp=def25ba997f262c3432faf6e62e153a4e3e56d07;hpb=baf1f621c945198d5b54c5415a2a2b648adf51b6;p=swftools.git diff --git a/lib/q.c b/lib/q.c index def25ba..e578107 100644 --- a/lib/q.c +++ b/lib/q.c @@ -278,6 +278,40 @@ void** heap_flatten(heap_t*h) return nodes; } +// ------------------------------- trie -------------------------------------- + +void trie_put(trie_t**t, unsigned const char*id) +{ + if(!*t) { + (*t) = rfx_calloc(sizeof(trie_t)); + (*t)->rest = (unsigned char*)strdup(id); + return; + } + if((*t)->rest && (*t)->rest[0]) { + // shift whatever's currently in here one node down + trie_put(&(*t)->row[(*t)->rest[0]], (*t)->rest+1); + (*t)->rest = 0; + } + if(id[0]) { + trie_put(&(*t)->row[id[0]], id+1); + } else { + (*t)->rest = ""; + } +} + +int trie_lookup(trie_t*t, unsigned const char*id) +{ + while(t) { + if(t->rest && !strcmp(t->rest, id)) + return 1; + t = t->row[id[0]]; + if(!*id) + return 0; + id++; + } + return 0; +} + // ------------------------------- crc32 -------------------------------------- static unsigned int*crc32 = 0; static void crc32_init(void) @@ -604,7 +638,7 @@ char ptr_equals(const void*o1, const void*o2) } unsigned int ptr_hash(const void*o) { - return string_hash3(&o, sizeof(o)); + return string_hash3((const char*)&o, sizeof(o)); } void* ptr_dup(const void*o) { @@ -1214,6 +1248,20 @@ void list_free_(void*_list) } *list = 0; } +void list_deep_free_(void*_list) +{ + commonlist_t**list = (commonlist_t**)_list; + commonlist_t*l = *list; + while(l) { + commonlist_t*next = l->next; + if(l->entry) { + free(l->entry);l->entry=0; + } + free(l); + l = next; + } + *list = 0; +} void*list_clone_(void*_list) { commonlist_t*l = *(commonlist_t**)_list;