X-Git-Url: http://git.asbjorn.biz/?p=swftools.git;a=blobdiff_plain;f=lib%2Fq.c;h=942cfbb8ba4d4655e3b39964140b43d7edcb3691;hp=512e3d01a80f99322dc3d060d3078d49a369da8e;hb=153afec3db7438e41baaed4df4aa1bc79ee785a5;hpb=2e2252fba96c094b53475c87bc41f25fe6b946bb diff --git a/lib/q.c b/lib/q.c index 512e3d0..942cfbb 100644 --- a/lib/q.c +++ b/lib/q.c @@ -68,7 +68,9 @@ static int mem_put_(mem_t*m,const void*data, int length, int null) int n = m->pos; m->pos += length + (null?1:0); if(m->pos > m->len) { - m->len = (m->pos+63)&~63; + int v1 = (m->pos+63)&~63; + int v2 = m->len + m->len / 2; + m->len = v1>v2?v1:v2; m->buffer = m->buffer?(char*)rfx_realloc(m->buffer,m->len):(char*)rfx_alloc(m->len); } assert(n+length <= m->len); @@ -85,6 +87,15 @@ int mem_putstring(mem_t*m,string_t str) { return mem_put_(m, str.str, str.len, 1); } +int mem_get(mem_t*m, void*data, int length) +{ + if(m->read_pos + length > m->pos) { + length = m->pos - m->read_pos; + } + memcpy(data, m->buffer+m->read_pos, length); + m->read_pos += length; + return length; +} // ------------------------------- ringbuffer_t ------------------------------- @@ -267,6 +278,40 @@ void** heap_flatten(heap_t*h) return nodes; } +// ------------------------------- trie -------------------------------------- + +void trie_put(trie_t**t, unsigned const char*id) +{ + if(!*t) { + (*t) = rfx_calloc(sizeof(trie_t)); + (*t)->rest = (unsigned char*)strdup(id); + return; + } + if((*t)->rest && (*t)->rest[0]) { + // shift whatever's currently in here one node down + trie_put(&(*t)->row[(*t)->rest[0]], (*t)->rest+1); + (*t)->rest = 0; + } + if(id[0]) { + trie_put(&(*t)->row[id[0]], id+1); + } else { + (*t)->rest = ""; + } +} + +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++; + } + return 0; +} + // ------------------------------- crc32 -------------------------------------- static unsigned int*crc32 = 0; static void crc32_init(void) @@ -593,7 +638,7 @@ char ptr_equals(const void*o1, const void*o2) } unsigned int ptr_hash(const void*o) { - return string_hash3(o, sizeof(o)); + return string_hash3((const char*)&o, sizeof(o)); } void* ptr_dup(const void*o) { @@ -719,6 +764,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) { @@ -880,7 +933,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; @@ -1049,7 +1102,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; @@ -1057,7 +1109,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; @@ -1203,6 +1254,20 @@ void list_free_(void*_list) } *list = 0; } +void list_deep_free_(void*_list) +{ + commonlist_t**list = (commonlist_t**)_list; + commonlist_t*l = *list; + while(l) { + commonlist_t*next = l->next; + if(l->entry) { + free(l->entry);l->entry=0; + } + free(l); + l = next; + } + *list = 0; +} void*list_clone_(void*_list) { commonlist_t*l = *(commonlist_t**)_list;