X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fq.c;h=b1553b5a126af3f335ddb517199f538d388135e2;hb=b641c574ebe37ed07e588d4577d853d74e999c99;hp=e57810770e430b82319e4a6de5e078261d8d294f;hpb=067b8f578c7b189840383b979ea4ca8ccc88ebe9;p=swftools.git diff --git a/lib/q.c b/lib/q.c index e578107..b1553b5 100644 --- a/lib/q.c +++ b/lib/q.c @@ -295,7 +295,7 @@ void trie_put(trie_t**t, unsigned const char*id) if(id[0]) { trie_put(&(*t)->row[id[0]], id+1); } else { - (*t)->rest = ""; + (*t)->rest = strdup(""); } } @@ -304,14 +304,28 @@ 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++; + t = t->row[*id++]; } return 0; } +char trie_remove(trie_t*t, unsigned const char*id) +{ + while(t) { + if(t->rest && !strcmp(t->rest, id)) { + free(t->rest); + t->rest = 0; + return 1; + } + if(!*id) + return 0; + t = t->row[*id++]; + } +} + + // ------------------------------- crc32 -------------------------------------- static unsigned int*crc32 = 0; static void crc32_init(void) @@ -764,6 +778,14 @@ void dict_init(dict_t*h, int size) h->num = 0; h->key_type = &charptr_type; } +void dict_init2(dict_t*h, type_t*t, int size) +{ + memset(h, 0, sizeof(dict_t)); + h->hashsize = size; + h->slots = h->hashsize?(dictentry_t**)rfx_calloc(sizeof(dictentry_t*)*h->hashsize):0; + h->num = 0; + h->key_type = t; +} dict_t*dict_clone(dict_t*o) { @@ -925,7 +947,7 @@ char dict_del(dict_t*h, const void*key) memset(e, 0, sizeof(dictentry_t)); rfx_free(e); if(e == head) { - h->slots[hash] = 0; + h->slots[hash] = next; } else { assert(prev); prev->next = next; @@ -1094,7 +1116,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; @@ -1102,7 +1123,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;