added ptr_type
[swftools.git] / lib / q.c
diff --git a/lib/q.c b/lib/q.c
index 5a9cf7d..f7f7980 100644 (file)
--- a/lib/q.c
+++ b/lib/q.c
@@ -523,6 +523,23 @@ void stringarray_destroy(stringarray_t*sa)
 
 // ------------------------------- type_t -------------------------------
 
+char ptr_equals(const void*o1, const void*o2) 
+{
+    return o1==o2;
+}
+unsigned int ptr_hash(const void*o) 
+{
+    return string_hash3(o, sizeof(o));
+}
+void* ptr_dup(const void*o) 
+{
+    return (void*)o;
+}
+void ptr_free(void*o) 
+{
+    return;
+}
+
 char charptr_equals(const void*o1, const void*o2) 
 {
     if(!o1 || !o2)
@@ -547,6 +564,7 @@ void charptr_free(void*o)
         rfx_free(o);
     }
 }
+
 char stringstruct_equals(const void*o1, const void*o2) 
 {
     string_t*s1 = (string_t*)o1;
@@ -574,6 +592,12 @@ void stringstruct_free(void*o)
     rfx_free((void*)o);
 }
 
+type_t ptr_type = {
+    equals: ptr_equals,
+    hash: ptr_hash,
+    dup: ptr_dup,
+    free: ptr_free,
+};
 
 type_t charptr_type = {
     equals: charptr_equals,
@@ -619,6 +643,27 @@ void dict_init(dict_t*h, int size)
     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;t<o->hashsize;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);
@@ -665,7 +710,7 @@ void dict_dump(dict_t*h, FILE*fi, const char*prefix)
     for(t=0;t<h->hashsize;t++) {
         dictentry_t*e = h->slots[t];
         while(e) {
-            if(h->key_type==&charptr_type) {
+            if(h->key_type!=&charptr_type) {
                 fprintf(fi, "%s%08x=%08x\n", prefix, e->key, e->data);
             } else {
                 fprintf(fi, "%s%s=%08x\n", prefix, e->key, e->data);
@@ -746,7 +791,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 +844,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));