generator: support parametrized structs
[free-sw/xcb/libxcb] / src / xcb_list.c
index 5b2edc0..129540b 100644 (file)
 
 /* A generic implementation of a list of void-pointers. */
 
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
 #include <stdlib.h>
 
 #include "xcb.h"
 
 typedef struct node {
     struct node *next;
+    unsigned int key;
     void *data;
 } node;
 
-struct _xcb_list {
+struct _xcb_map {
     node *head;
     node **tail;
 };
 
 /* Private interface */
 
-_xcb_list *_xcb_list_new()
+_xcb_map *_xcb_map_new(void)
 {
-    _xcb_list *list;
-    list = malloc(sizeof(_xcb_list));
+    _xcb_map *list;
+    list = malloc(sizeof(_xcb_map));
     if(!list)
         return 0;
     list->head = 0;
@@ -53,75 +58,39 @@ _xcb_list *_xcb_list_new()
     return list;
 }
 
-static void _xcb_list_clear(_xcb_list *list, XCBListFreeFunc do_free)
-{
-    void *tmp;
-    while((tmp = _xcb_list_remove_head(list)))
-        if(do_free)
-            do_free(tmp);
-}
-
-void _xcb_list_delete(_xcb_list *list, XCBListFreeFunc do_free)
+void _xcb_map_delete(_xcb_map *list, xcb_list_free_func_t do_free)
 {
     if(!list)
         return;
-    _xcb_list_clear(list, do_free);
+    while(list->head)
+    {
+        node *cur = list->head;
+        if(do_free)
+            do_free(cur->data);
+        list->head = cur->next;
+        free(cur);
+    }
     free(list);
 }
 
-int _xcb_list_insert(_xcb_list *list, void *data)
-{
-    node *cur;
-    cur = malloc(sizeof(node));
-    if(!cur)
-        return 0;
-    cur->data = data;
-
-    cur->next = list->head;
-    list->head = cur;
-    return 1;
-}
-
-int _xcb_list_append(_xcb_list *list, void *data)
+int _xcb_map_put(_xcb_map *list, unsigned int key, void *data)
 {
-    node *cur;
-    cur = malloc(sizeof(node));
+    node *cur = malloc(sizeof(node));
     if(!cur)
         return 0;
+    cur->key = key;
     cur->data = data;
     cur->next = 0;
-
     *list->tail = cur;
     list->tail = &cur->next;
     return 1;
 }
 
-void *_xcb_list_peek_head(_xcb_list *list)
-{
-    if(!list->head)
-        return 0;
-    return list->head->data;
-}
-
-void *_xcb_list_remove_head(_xcb_list *list)
-{
-    void *ret;
-    node *tmp = list->head;
-    if(!tmp)
-        return 0;
-    ret = tmp->data;
-    list->head = tmp->next;
-    if(!list->head)
-        list->tail = &list->head;
-    free(tmp);
-    return ret;
-}
-
-void *_xcb_list_remove(_xcb_list *list, int (*cmp)(const void *, const void *), const void *data)
+void *_xcb_map_remove(_xcb_map *list, unsigned int key)
 {
     node **cur;
     for(cur = &list->head; *cur; cur = &(*cur)->next)
-        if(cmp(data, (*cur)->data))
+        if((*cur)->key == key)
         {
             node *tmp = *cur;
             void *ret = (*cur)->data;
@@ -134,82 +103,3 @@ void *_xcb_list_remove(_xcb_list *list, int (*cmp)(const void *, const void *),
         }
     return 0;
 }
-
-void *_xcb_list_find(_xcb_list *list, int (*cmp)(const void *, const void *), const void *data)
-{
-    node *cur;
-    for(cur = list->head; cur; cur = cur->next)
-        if(cmp(data, cur->data))
-            return cur->data;
-    return 0;
-}
-
-_xcb_queue *_xcb_queue_new(void) __attribute__ ((alias ("_xcb_list_new")));
-void _xcb_queue_delete(_xcb_queue *q, XCBListFreeFunc do_free) __attribute__ ((alias ("_xcb_list_delete")));
-int _xcb_queue_enqueue(_xcb_queue *q, void *data) __attribute__ ((alias ("_xcb_list_append")));
-void *_xcb_queue_dequeue(_xcb_queue *q) __attribute__ ((alias ("_xcb_list_remove_head")));
-
-int _xcb_queue_is_empty(_xcb_queue *q)
-{
-    return q->head == 0;
-}
-
-typedef struct {
-    unsigned int key;
-    void *value;
-} map_pair;
-
-_xcb_map *_xcb_map_new(void) __attribute__ ((alias ("_xcb_list_new")));
-
-void _xcb_map_delete(_xcb_map *q, XCBListFreeFunc do_free)
-{
-    map_pair *tmp;
-    if(!q)
-        return;
-    while((tmp = _xcb_list_remove_head(q)))
-    {
-        if(do_free)
-            do_free(tmp->value);
-        free(tmp);
-    }
-    free(q);
-}
-
-int _xcb_map_put(_xcb_map *q, unsigned int key, void *data)
-{
-    map_pair *cur = malloc(sizeof(map_pair));
-    if(!cur)
-        return 0;
-    cur->key = key;
-    cur->value = data;
-    if(!_xcb_list_append(q, cur))
-    {
-        free(cur);
-        return 0;
-    }
-    return 1;
-}
-
-static int match_map_pair(const void *key, const void *pair)
-{
-    return ((map_pair *) pair)->key == *(unsigned int *) key;
-}
-
-void *_xcb_map_get(_xcb_map *q, unsigned int key)
-{
-    map_pair *cur = _xcb_list_find(q, match_map_pair, &key);
-    if(!cur)
-        return 0;
-    return cur->value;
-}
-
-void *_xcb_map_remove(_xcb_map *q, unsigned int key)
-{
-    map_pair *cur = _xcb_list_remove(q, match_map_pair, &key);
-    void *ret;
-    if(!cur)
-        return 0;
-    ret = cur->value;
-    free(cur);
-    return ret;
-}