X-Git-Url: http://git.demorecorder.com/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fxcb_list.c;h=129540bc4c38452831eea519a875074ad9a031ab;hb=a187ae85729ec56e46ed0a0453458db18ab731eb;hp=5b2edc046ad1bd5c557c49e43766139a050ab167;hpb=47ceed78612d48dcda62cc2686fc527d61abe38b;p=free-sw%2Fxcb%2Flibxcb diff --git a/src/xcb_list.c b/src/xcb_list.c index 5b2edc0..129540b 100644 --- a/src/xcb_list.c +++ b/src/xcb_list.c @@ -25,6 +25,10 @@ /* A generic implementation of a list of void-pointers. */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + #include #include "xcb.h" @@ -32,20 +36,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(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; -}