X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fq.c;h=9bdcdf07cdf0524a1f45b7663b07fdc85b37d5ed;hb=0145b57ec3f740ab015cc314835d18a59ea1748e;hp=a53994a463e654f4c4907dd7d468725938750664;hpb=95373c20bb54780d9b38d1cb3877c8a6303afa49;p=swftools.git diff --git a/lib/q.c b/lib/q.c index a53994a..9bdcdf0 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,10 +802,11 @@ int dict_count(dict_t*h) return h->num; } -void* dict_lookup(dict_t*h, const void*key) +static inline dictentry_t* dict_do_lookup(dict_t*h, const void*key) { - if(!h->num) + if(!h->num) { return 0; + } unsigned int ohash = h->key_type->hash(key); unsigned int hash = ohash % h->hashsize; @@ -811,7 +814,7 @@ void* dict_lookup(dict_t*h, const void*key) /* check first entry for match */ dictentry_t*e = h->slots[hash]; if(e && h->key_type->equals(e->key, key)) { - return e->data; + return e; } else if(e) { e = e->next; } @@ -827,17 +830,42 @@ void* dict_lookup(dict_t*h, const void*key) 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)) { - return e->data; + /* 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; } return 0; } +void* dict_lookup(dict_t*h, const void*key) +{ + dictentry_t*e = dict_do_lookup(h, key); + if(e) + return e->data; + return 0; +} +char dict_contains(dict_t*h, const void*key) +{ + dictentry_t*e = dict_do_lookup(h, key); + return !!e; +} + char dict_del(dict_t*h, const void*key) { if(!h->num) @@ -1103,6 +1131,20 @@ int list_length_(void*_list) return 0; return l->info[0].size; } +void list_concat_(void*_l1, void*_l2) +{ + commonlist_t**l1 = (commonlist_t**)_l1; + commonlist_t**l2 = (commonlist_t**)_l2; + + if(!*l1) { + *l1 = *l2; + } else if(*l2) { + (*l1)->info[0].last->next = *l2; + (*l1)->info[0].last = (*l2)->info[0].last; + (*l1)->info[0].size += (*l2)->info[0].size; + } + *l2 = 0; +} void list_append_(void*_list, void*entry) { commonlist_t**list = (commonlist_t**)_list;