2 * Based on intlist.c by:
3 * (c) 2009 Arnaldo Carvalho de Melo <acme@redhat.com>
5 * Licensed under the GPLv2.
10 #include <linux/compiler.h>
14 static struct rb_node
*intlist__node_new(struct rblist
*rblist __maybe_unused
,
17 int i
= (int)((long)entry
);
18 struct rb_node
*rc
= NULL
;
19 struct int_node
*node
= malloc(sizeof(*node
));
29 static void int_node__delete(struct int_node
*ilist
)
34 static void intlist__node_delete(struct rblist
*rblist __maybe_unused
,
35 struct rb_node
*rb_node
)
37 struct int_node
*node
= container_of(rb_node
, struct int_node
, rb_node
);
39 int_node__delete(node
);
42 static int intlist__node_cmp(struct rb_node
*rb_node
, const void *entry
)
44 int i
= (int)((long)entry
);
45 struct int_node
*node
= container_of(rb_node
, struct int_node
, rb_node
);
50 int intlist__add(struct intlist
*ilist
, int i
)
52 return rblist__add_node(&ilist
->rblist
, (void *)((long)i
));
55 void intlist__remove(struct intlist
*ilist
, struct int_node
*node
)
57 rblist__remove_node(&ilist
->rblist
, &node
->rb_node
);
60 struct int_node
*intlist__find(struct intlist
*ilist
, int i
)
62 struct int_node
*node
;
63 struct rb_node
*rb_node
;
69 rb_node
= rblist__find(&ilist
->rblist
, (void *)((long)i
));
71 node
= container_of(rb_node
, struct int_node
, rb_node
);
76 static int intlist__parse_list(struct intlist
*ilist
, const char *s
)
82 long value
= strtol(s
, &sep
, 10);
84 if (*sep
!= ',' && *sep
!= '\0')
86 err
= intlist__add(ilist
, value
);
90 } while (*sep
!= '\0');
95 struct intlist
*intlist__new(const char *slist
)
97 struct intlist
*ilist
= malloc(sizeof(*ilist
));
100 rblist__init(&ilist
->rblist
);
101 ilist
->rblist
.node_cmp
= intlist__node_cmp
;
102 ilist
->rblist
.node_new
= intlist__node_new
;
103 ilist
->rblist
.node_delete
= intlist__node_delete
;
105 if (slist
&& intlist__parse_list(ilist
, slist
))
111 intlist__delete(ilist
);
115 void intlist__delete(struct intlist
*ilist
)
118 rblist__delete(&ilist
->rblist
);
121 struct int_node
*intlist__entry(const struct intlist
*ilist
, unsigned int idx
)
123 struct int_node
*node
= NULL
;
124 struct rb_node
*rb_node
;
126 rb_node
= rblist__entry(&ilist
->rblist
, idx
);
128 node
= container_of(rb_node
, struct int_node
, rb_node
);