1 /* 2 * Based on intlist.c by: 3 * (c) 2009 Arnaldo Carvalho de Melo <acme@redhat.com> 4 * 5 * Licensed under the GPLv2. 6 */ 7 8 #include <errno.h> 9 #include <stdlib.h> 10 #include <linux/compiler.h> 11 12 #include "intlist.h" 13 14 static struct rb_node *intlist__node_new(struct rblist *rblist __maybe_unused, 15 const void *entry) 16 { 17 int i = (int)((long)entry); 18 struct rb_node *rc = NULL; 19 struct int_node *node = malloc(sizeof(*node)); 20 21 if (node != NULL) { 22 node->i = i; 23 rc = &node->rb_node; 24 } 25 26 return rc; 27 } 28 29 static void int_node__delete(struct int_node *ilist) 30 { 31 free(ilist); 32 } 33 34 static void intlist__node_delete(struct rblist *rblist __maybe_unused, 35 struct rb_node *rb_node) 36 { 37 struct int_node *node = container_of(rb_node, struct int_node, rb_node); 38 39 int_node__delete(node); 40 } 41 42 static int intlist__node_cmp(struct rb_node *rb_node, const void *entry) 43 { 44 int i = (int)((long)entry); 45 struct int_node *node = container_of(rb_node, struct int_node, rb_node); 46 47 return node->i - i; 48 } 49 50 int intlist__add(struct intlist *ilist, int i) 51 { 52 return rblist__add_node(&ilist->rblist, (void *)((long)i)); 53 } 54 55 void intlist__remove(struct intlist *ilist, struct int_node *node) 56 { 57 rblist__remove_node(&ilist->rblist, &node->rb_node); 58 } 59 60 struct int_node *intlist__find(struct intlist *ilist, int i) 61 { 62 struct int_node *node = NULL; 63 struct rb_node *rb_node = rblist__find(&ilist->rblist, (void *)((long)i)); 64 65 if (rb_node) 66 node = container_of(rb_node, struct int_node, rb_node); 67 68 return node; 69 } 70 71 struct intlist *intlist__new(void) 72 { 73 struct intlist *ilist = malloc(sizeof(*ilist)); 74 75 if (ilist != NULL) { 76 rblist__init(&ilist->rblist); 77 ilist->rblist.node_cmp = intlist__node_cmp; 78 ilist->rblist.node_new = intlist__node_new; 79 ilist->rblist.node_delete = intlist__node_delete; 80 } 81 82 return ilist; 83 } 84 85 void intlist__delete(struct intlist *ilist) 86 { 87 if (ilist != NULL) 88 rblist__delete(&ilist->rblist); 89 } 90 91 struct int_node *intlist__entry(const struct intlist *ilist, unsigned int idx) 92 { 93 struct int_node *node = NULL; 94 struct rb_node *rb_node; 95 96 rb_node = rblist__entry(&ilist->rblist, idx); 97 if (rb_node) 98 node = container_of(rb_node, struct int_node, rb_node); 99 100 return node; 101 } 102