X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fq.c;h=0b19aa96f2b612c84cc2d3cbf3e9ffb76b2ba2eb;hb=b49af457d8554794e1550e3051a4fcd67a965d8a;hp=543d5795760ff9f76702105485d74bf420863881;hpb=8495925885c6adaebada05f11e6f6b1a8b687e2c;p=swftools.git diff --git a/lib/q.c b/lib/q.c index 543d579..0b19aa9 100644 --- a/lib/q.c +++ b/lib/q.c @@ -600,25 +600,46 @@ static int max(int x, int y) { dict_t*dict_new() { dict_t*d = rfx_alloc(sizeof(dict_t)); - dict_init(d); + dict_init(d, INITIAL_SIZE); return d; } dict_t*dict_new2(type_t*t) { dict_t*d = rfx_alloc(sizeof(dict_t)); - dict_init(d); + dict_init(d, INITIAL_SIZE); d->key_type = t; return d; } -void dict_init(dict_t*h) +void dict_init(dict_t*h, int size) { memset(h, 0, sizeof(dict_t)); - h->hashsize = INITIAL_SIZE; + h->hashsize = size; h->slots = h->hashsize?(dictentry_t**)rfx_calloc(sizeof(dictentry_t*)*h->hashsize):0; h->num = 0; h->key_type = &charptr_type; } +dict_t*dict_clone(dict_t*o) +{ + dict_t*h = rfx_alloc(sizeof(dict_t)); + memcpy(h, o, sizeof(dict_t)); + h->slots = h->hashsize?(dictentry_t**)rfx_calloc(sizeof(dictentry_t*)*h->hashsize):0; + int t; + for(t=0;thashsize;t++) { + dictentry_t*e = o->slots[t]; + while(e) { + dictentry_t*n = (dictentry_t*)rfx_alloc(sizeof(dictentry_t)); + memcpy(n, e, sizeof(dictentry_t)); + n->key = h->key_type->dup(e->key); + n->data = e->data; + n->next = h->slots[t]; + h->slots[t] = n; + e = e->next; + } + } + return h; +} + static void dict_expand(dict_t*h, int newlen) { assert(h->hashsize < newlen); @@ -746,7 +767,7 @@ char dict_del(dict_t*h, const void*key) return 0; } -static dictentry_t* dict_get_slot(dict_t*h, const void*key) +dictentry_t* dict_get_slot(dict_t*h, const void*key) { if(!h->num) return 0; @@ -799,6 +820,7 @@ void dict_free_all(dict_t*h, void (*freeFunction)(void*)) rfx_free(e); e = next; } + h->slots[t]=0; } rfx_free(h->slots); memset(h, 0, sizeof(dict_t)); @@ -827,7 +849,7 @@ void map_init(map_t*map) map_internal_t*m; map->internal = (map_internal_t*)rfx_calloc(sizeof(map_internal_t)); m = (map_internal_t*)map->internal; - dict_init(&m->d); + dict_init(&m->d, INITIAL_SIZE); } void map_put(map_t*map, string_t t1, string_t t2) { @@ -987,7 +1009,7 @@ void list_append_(void*_list, void*entry) commonlist_t**list = (commonlist_t**)_list; commonlist_t* n = 0; if(!*list) { - n = malloc(sizeof(commonlist_t)+sizeof(listinfo_t)); + n = (commonlist_t*)malloc(sizeof(commonlist_t)+sizeof(listinfo_t)); *list = n; (*list)->info[0].size = 0; } else { @@ -999,6 +1021,23 @@ void list_append_(void*_list, void*entry) (*list)->info[0].last = n; (*list)->info[0].size++; } +/* notice: prepending uses slighly more space than appending */ +void list_prepend_(void*_list, void*entry) +{ + commonlist_t**list = (commonlist_t**)_list; + commonlist_t* n = (commonlist_t*)malloc(sizeof(commonlist_t)+sizeof(listinfo_t)); + int size = 0; + commonlist_t* last = 0; + if(*list) { + last = (*list)->info[0].last; + size = (*list)->info[0].size; + } + n->next = *list; + n->entry = entry; + *list = n; + (*list)->info[0].last = last; + (*list)->info[0].size = size+1; +} void list_free_(void*_list) { commonlist_t**list = (commonlist_t**)_list;