fixed bug in jpeg2000 decoding
[swftools.git] / lib / q.c
diff --git a/lib/q.c b/lib/q.c
index 63794e0..9f7ce2c 100644 (file)
--- 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);
     }
 }
 
@@ -688,6 +688,18 @@ unsigned int crc32_add_string(unsigned int checksum, const char*s)
     }
     return checksum;
 }
+unsigned int crc32_add_bytes(unsigned int checksum, const void*_s, int len)
+{
+    unsigned char*s = (unsigned char*)_s;
+    crc32_init();
+    if(!s || !len)
+        return checksum;
+    do {
+        checksum = checksum>>8 ^ crc32[(*s^checksum)&0xff];
+        s++;
+    } while(--len);
+    return checksum;
+}
 
 unsigned int string_hash(const string_t*str)
 {
@@ -887,6 +899,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 +981,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 +1119,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 +1338,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 +1418,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)
 {