X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fq.c;h=5a9cf7d8b20dbba427d5d287c88985471cc7451e;hb=f0d1089c6506371456902bfef02776e3da65c204;hp=a38a35e0db2c208e49f2dd16770a5445d5af6b71;hpb=d0814136e2d0a4261931c644e6282c480a11d62f;p=swftools.git diff --git a/lib/q.c b/lib/q.c index a38a35e..5a9cf7d 100644 --- a/lib/q.c +++ b/lib/q.c @@ -331,6 +331,8 @@ unsigned int crc32_add_byte(unsigned int checksum, unsigned char b) } unsigned int crc32_add_string(unsigned int checksum, const char*s) { + if(!s) + return checksum; while(*s) { checksum = crc32_add_byte(checksum, *s); s++; @@ -523,19 +525,27 @@ void stringarray_destroy(stringarray_t*sa) char charptr_equals(const void*o1, const void*o2) { + if(!o1 || !o2) + return o1==o2; return !strcmp(o1,o2); } unsigned int charptr_hash(const void*o) { + if(!o) + return 0; return string_hash2(o); } void* charptr_dup(const void*o) { + if(!o) + return 0; return strdup(o); } void charptr_free(void*o) { - rfx_free(o); + if(o) { + rfx_free(o); + } } char stringstruct_equals(const void*o1, const void*o2) { @@ -590,20 +600,20 @@ 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; @@ -817,7 +827,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) { @@ -965,7 +975,7 @@ typedef struct _commonlist { listinfo_t info[0]; } commonlist_t; -int list_length(void*_list) +int list_length_(void*_list) { commonlist_t*l = (commonlist_t*)_list; if(!l) @@ -977,7 +987,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 { @@ -989,6 +999,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;