small fix for previous commit
[swftools.git] / lib / q.c
diff --git a/lib/q.c b/lib/q.c
index 1d27b42..d70822d 100644 (file)
--- a/lib/q.c
+++ b/lib/q.c
@@ -1159,6 +1159,34 @@ char dict_del(dict_t*h, const void*key)
     return 0;
 }
 
+char dict_del2(dict_t*h, const void*key, void*data)
+{
+    if(!h->num)
+        return 0;
+    unsigned int hash = h->key_type->hash(key) % h->hashsize;
+    dictentry_t*head = h->slots[hash];
+    dictentry_t*e = head, *prev=0;
+    while(e) {
+        if(h->key_type->equals(e->key, key) && e->data == data) {
+            dictentry_t*next = e->next;
+            h->key_type->free(e->key);
+            memset(e, 0, sizeof(dictentry_t));
+            rfx_free(e);
+            if(e == head) {
+                h->slots[hash] = next;
+            } else {
+                assert(prev);
+                prev->next = next;
+            }
+            h->num--;
+            return 1;
+        }
+        prev = e;
+        e = e->next;
+    }
+    return 0;
+}
+
 dictentry_t* dict_get_slot(dict_t*h, const void*key)
 {
     if(!h->num)
@@ -1315,14 +1343,14 @@ 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);
+       fprintf(stderr, "error: reference to element %d in array[%d]\n", nr, array->num);
        return 0;
     }
     return array->d[nr].name;
 }
 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);
+       fprintf(stderr, "error: reference to element %d in array[%d]\n", nr, array->num);
        return 0;
     }
     return array->d[nr].data;