X-Git-Url: http://git.asbjorn.biz/?p=swftools.git;a=blobdiff_plain;f=lib%2Fq.c;h=a16d1b380753ef197c64d5594179ca2dfd6319de;hp=63794e0069c944f9686cc669587dae54ba02e97d;hb=2c719855eac434f01d47ba0717d76de65939d74e;hpb=5ba24931ec3861ca5befcaae1502dd9105639b44 diff --git a/lib/q.c b/lib/q.c index 63794e0..a16d1b3 100644 --- a/lib/q.c +++ b/lib/q.c @@ -374,7 +374,7 @@ static char _trie_put(trielayer_t**t, unsigned const char*id, void*data) { if(!*t) { (*t) = rfx_calloc(sizeof(trielayer_t)); - (*t)->rest = (unsigned char*)strdup(id); + (*t)->rest = (unsigned char*)strdup((char*)id); (*t)->data = data; return 0; } @@ -389,7 +389,7 @@ static char _trie_put(trielayer_t**t, unsigned const char*id, void*data) char overwrite = 0; if((*t)->rest) overwrite = 1; - (*t)->rest = strdup(""); + (*t)->rest = (unsigned char*)strdup(""); (*t)->data = data; return overwrite; } @@ -397,7 +397,7 @@ static char _trie_put(trielayer_t**t, unsigned const char*id, void*data) static char _trie_remove(trielayer_t*t, unsigned const char*id) { while(t) { - if(t->rest && !strcmp(t->rest, id)) { + if(t->rest && !strcmp((char*)t->rest, (char*)id)) { free(t->rest); t->rest = 0; return 1; @@ -443,7 +443,7 @@ int trie_contains(trie_t*trie, unsigned const char*id) { trielayer_t*t = trie->start; while(t) { - if(t->rest && !strcmp(t->rest, id)) + if(t->rest && !strcmp((char*)t->rest, (char*)id)) return 1; if(!*id) return 0; @@ -455,7 +455,7 @@ void* trie_lookup(trie_t*trie, unsigned const char*id) { trielayer_t*t = trie->start; while(t) { - if(t->rest && !strcmp(t->rest, id)) + if(t->rest && !strcmp((char*)t->rest, (char*)id)) return t->data; if(!*id) return 0; @@ -508,7 +508,7 @@ void _trie_dump(trielayer_t*t, char*buffer, int pos) } if(t->rest) { buffer[pos]=0; - printf("%s%s %08x\n", buffer, t->rest, t->data); + printf("%s%s %08x\n", buffer, t->rest, (int)t->data); } } @@ -887,6 +887,23 @@ void ptr_free(void*o) return; } +char int_equals(const void*o1, const void*o2) +{ + return o1==o2; +} +unsigned int int_hash(const void*o) +{ + return string_hash3((const char*)&o, sizeof(o)); +} +void* int_dup(const void*o) +{ + return (void*)o; +} +void int_free(void*o) +{ + return; +} + char charptr_equals(const void*o1, const void*o2) { if(!o1 || !o2) @@ -952,6 +969,13 @@ void stringstruct_free(void*o) string_free(o); } +type_t int_type = { + equals: int_equals, + hash: int_hash, + dup: int_dup, + free: int_free, +}; + type_t ptr_type = { equals: ptr_equals, hash: ptr_hash, @@ -1083,9 +1107,9 @@ void dict_dump(dict_t*h, FILE*fi, const char*prefix) dictentry_t*e = h->slots[t]; while(e) { if(h->key_type!=&charptr_type) { - fprintf(fi, "%s%08x=%08x\n", prefix, e->key, e->data); + fprintf(fi, "%s%08x=%08x\n", prefix, (int)e->key, (int)e->data); } else { - fprintf(fi, "%s%s=%08x\n", prefix, e->key, e->data); + fprintf(fi, "%s%s=%08x\n", prefix, (char*)e->key, (int)e->data); } e = e->next; } @@ -1302,6 +1326,51 @@ void dict_destroy(dict_t*dict) rfx_free(dict); } +// ------------------------------- mtf_t -------------------------------------- +mtf_t* mtf_new(type_t*type) +{ + NEW(mtf_t, mtf); + mtf->type = type; + return mtf; +} +void mtf_increase(mtf_t*m, const void*key) +{ + mtf_item_t*item = m->first; + mtf_item_t*last = 0; + while(item) { + if(m->type->equals(item->key, key)) { + item->num++; + if(item->num>m->first->num) { + if(last) last->next = item->next; + else m->first = item->next; + item->next = m->first; + m->first = item; + } + return; + } + last = item; + item = item->next; + } + NEW(mtf_item_t,n); + if(last) last->next = n; + else m->first = n; + n->key = key; + n->num = 1; +} +void mtf_destroy(mtf_t*m) +{ + if(!m) return; + mtf_item_t*item = m->first; + m->first = 0; + while(item) { + mtf_item_t*next = item->next; + item->next = 0; + free(item); + item = next; + } + free(m); +} + // ------------------------------- map_t -------------------------------------- typedef struct _map_internal_t @@ -1337,7 +1406,7 @@ static void freestring(void*data) static void dumpmapentry(void*data, const void*key, void*value) { FILE*fi = (FILE*)data; - fprintf(fi, "%s=%s\n", key, (char*)value); + fprintf(fi, "%s=%s\n", (char*)key, (char*)value); } void map_dump(map_t*map, FILE*fi, const char*prefix) {