X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fq.c;h=512e3d01a80f99322dc3d060d3078d49a369da8e;hb=2e2252fba96c094b53475c87bc41f25fe6b946bb;hp=3b9a62faddb43936fa9a813b3cae21f0665aec2f;hpb=dc2f5b1a42742e40a1e5f9dfc6ecb63997e6cd09;p=swftools.git diff --git a/lib/q.c b/lib/q.c index 3b9a62f..512e3d0 100644 --- a/lib/q.c +++ b/lib/q.c @@ -393,10 +393,12 @@ unsigned int crc32_add_byte(unsigned int checksum, unsigned char b) } unsigned int crc32_add_string(unsigned int checksum, const char*s) { + if(!crc32) + crc32_init(); if(!s) return checksum; while(*s) { - checksum = crc32_add_byte(checksum, *s); + checksum = checksum>>8 ^ crc32[(*s^checksum)&0xff]; s++; } return checksum; @@ -800,11 +802,10 @@ int dict_count(dict_t*h) return h->num; } -void dict_do_lookup(dict_t*h, const void*key, void***match) +static inline dictentry_t* dict_do_lookup(dict_t*h, const void*key) { if(!h->num) { - *match = 0; - return; + return 0; } unsigned int ohash = h->key_type->hash(key); @@ -813,8 +814,7 @@ void dict_do_lookup(dict_t*h, const void*key, void***match) /* check first entry for match */ dictentry_t*e = h->slots[hash]; if(e && h->key_type->equals(e->key, key)) { - *match = &e->data; - return; + return e; } else if(e) { e = e->next; } @@ -830,31 +830,40 @@ void dict_do_lookup(dict_t*h, const void*key, void***match) dict_expand(h, newsize); hash = ohash % h->hashsize; e = h->slots[hash]; + if(e && h->key_type->equals(e->key, key)) { + // omit move to front + return e; + } else if(e) { + e = e->next; + } } /* check subsequent entries for a match */ + dictentry_t*last = h->slots[hash]; while(e) { if(h->key_type->equals(e->key, key)) { - *match = &e->data; - return; + /* move to front- makes a difference of about 10% in most applications */ + last->next = e->next; + e->next = h->slots[hash]; + h->slots[hash] = e; + return e; } + last=e; e = e->next; } - *match = 0; + return 0; } void* dict_lookup(dict_t*h, const void*key) { - void**data = 0; - dict_do_lookup(h, key, &data); - if(data) - return *data; + dictentry_t*e = dict_do_lookup(h, key); + if(e) + return e->data; return 0; } char dict_contains(dict_t*h, const void*key) { - void**data = 0; - dict_do_lookup(h, key, &data); - return !!data; + dictentry_t*e = dict_do_lookup(h, key); + return !!e; } char dict_del(dict_t*h, const void*key) @@ -923,16 +932,18 @@ void dict_foreach_value(dict_t*h, void (*runFunction)(void*)) } } -void dict_free_all(dict_t*h, void (*freeFunction)(void*)) +void dict_free_all(dict_t*h, char free_keys, void (*free_data_function)(void*)) { int t; for(t=0;thashsize;t++) { dictentry_t*e = h->slots[t]; while(e) { dictentry_t*next = e->next; - h->key_type->free(e->key); - if(freeFunction) { - freeFunction(e->data); + if(free_keys) { + h->key_type->free(e->key); + } + if(free_data_function) { + free_data_function(e->data); } memset(e, 0, sizeof(dictentry_t)); rfx_free(e); @@ -944,9 +955,20 @@ void dict_free_all(dict_t*h, void (*freeFunction)(void*)) memset(h, 0, sizeof(dict_t)); } +void dict_clear_shallow(dict_t*h) +{ + dict_free_all(h, 0, 0); +} + void dict_clear(dict_t*h) { - dict_free_all(h, 0); + dict_free_all(h, 1, 0); +} + +void dict_destroy_shallow(dict_t*dict) +{ + dict_clear_shallow(dict); + rfx_free(dict); } void dict_destroy(dict_t*dict) @@ -1001,7 +1023,7 @@ void map_dump(map_t*map, FILE*fi, const char*prefix) void map_clear(map_t*map) { map_internal_t*m = (map_internal_t*)map->internal; - dict_free_all(&m->d, freestring); + dict_free_all(&m->d, 1, freestring); rfx_free(m); } void map_destroy(map_t*map)