diff options
-rw-r--r-- | src/xcb_list.c | 93 | ||||
-rw-r--r-- | src/xcbint.h | 10 |
2 files changed, 12 insertions, 91 deletions
diff --git a/src/xcb_list.c b/src/xcb_list.c index 718a380..9854ead 100644 --- a/src/xcb_list.c +++ b/src/xcb_list.c @@ -32,20 +32,21 @@ 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() { - _xcb_list *list; - list = malloc(sizeof(_xcb_list)); + _xcb_map *list; + list = malloc(sizeof(_xcb_map)); if(!list) return 0; list->head = 0; @@ -53,7 +54,7 @@ _xcb_list *_xcb_list_new() return list; } -void _xcb_list_delete(_xcb_list *list, XCBListFreeFunc do_free) +void _xcb_map_delete(_xcb_map *list, XCBListFreeFunc do_free) { if(!list) return; @@ -68,32 +69,24 @@ void _xcb_list_delete(_xcb_list *list, XCBListFreeFunc do_free) free(list); } -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(_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; @@ -106,67 +99,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; -} - -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) -{ - if(!q) - return; - while(q->head) - { - node *cur = q->head; - map_pair *pair = cur->data; - if(do_free) - do_free(pair->value); - q->head = cur->next; - free(pair); - free(cur); - } - 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_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; -} diff --git a/src/xcbint.h b/src/xcbint.h index 67ec017..0e24d72 100644 --- a/src/xcbint.h +++ b/src/xcbint.h @@ -41,17 +41,9 @@ enum workarounds { /* xcb_list.c */ -typedef struct _xcb_list _xcb_list; typedef void (*XCBListFreeFunc)(void *); -_xcb_list *_xcb_list_new(void); -void _xcb_list_delete(_xcb_list *list, XCBListFreeFunc do_free); -int _xcb_list_append(_xcb_list *list, void *data); -void *_xcb_list_peek_head(_xcb_list *list); -void *_xcb_list_remove(_xcb_list *list, int (*cmp)(const void *, const void *), const void *data); -void *_xcb_list_find(_xcb_list *list, int (*cmp)(const void *, const void *), const void *data); - -typedef _xcb_list _xcb_map; +typedef struct _xcb_map _xcb_map; _xcb_map *_xcb_map_new(void); void _xcb_map_delete(_xcb_map *q, XCBListFreeFunc do_free); |