X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fq.c;h=55a4c06f8d50db3493a104658d5513d522afc444;hb=780e53f414a281c516c153a578638c4f7414434c;hp=943803364ae8f9ce9659582360fab4e43e1ebf10;hpb=ddf646ca8e7a6f30ed99c144b46483199cfb8e8f;p=swftools.git diff --git a/lib/q.c b/lib/q.c index 9438033..55a4c06 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) @@ -1060,7 +1094,6 @@ array_t* array_new2(type_t*type) { void*array_getkey(array_t*array, int nr) { if(nr > array->num || nr<0) { printf("error: reference to element %d in array[%d]\n", nr, array->num); - *(int*)0 = 0xdead; return 0; } return array->d[nr].name; @@ -1068,7 +1101,6 @@ void*array_getkey(array_t*array, int nr) { void*array_getvalue(array_t*array, int nr) { if(nr > array->num || nr<0) { printf("error: reference to element %d in array[%d]\n", nr, array->num); - *(int*)0 = 0xdead; return 0; } return array->d[nr].data;