1 // SPDX-License-Identifier: GPL-2.0-only
3 * Based on intlist.c by:
4 * (c) 2009 Arnaldo Carvalho de Melo <acme@redhat.com>
9 #include <linux/compiler.h>
13 static struct rb_node
*intlist__node_new(struct rblist
*rblist __maybe_unused
,
16 unsigned long i
= (unsigned long)entry
;
17 struct rb_node
*rc
= NULL
;
18 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 unsigned long i
= (unsigned long)entry
;
45 struct int_node
*node
= container_of(rb_node
, struct int_node
, rb_node
);
55 int intlist__add(struct intlist
*ilist
, unsigned long i
)
57 return rblist__add_node(&ilist
->rblist
, (void *)i
);
60 void intlist__remove(struct intlist
*ilist
, struct int_node
*node
)
62 rblist__remove_node(&ilist
->rblist
, &node
->rb_node
);
65 static struct int_node
*__intlist__findnew(struct intlist
*ilist
,
66 unsigned long i
, bool create
)
68 struct int_node
*node
= NULL
;
69 struct rb_node
*rb_node
;
75 rb_node
= rblist__findnew(&ilist
->rblist
, (void *)i
);
77 rb_node
= rblist__find(&ilist
->rblist
, (void *)i
);
80 node
= container_of(rb_node
, struct int_node
, rb_node
);
85 struct int_node
*intlist__find(struct intlist
*ilist
, unsigned long i
)
87 return __intlist__findnew(ilist
, i
, false);
90 struct int_node
*intlist__findnew(struct intlist
*ilist
, unsigned long i
)
92 return __intlist__findnew(ilist
, i
, true);
95 static int intlist__parse_list(struct intlist
*ilist
, const char *s
)
101 unsigned long value
= strtol(s
, &sep
, 10);
103 if (*sep
!= ',' && *sep
!= '\0')
105 err
= intlist__add(ilist
, value
);
109 } while (*sep
!= '\0');
114 struct intlist
*intlist__new(const char *slist
)
116 struct intlist
*ilist
= malloc(sizeof(*ilist
));
119 rblist__init(&ilist
->rblist
);
120 ilist
->rblist
.node_cmp
= intlist__node_cmp
;
121 ilist
->rblist
.node_new
= intlist__node_new
;
122 ilist
->rblist
.node_delete
= intlist__node_delete
;
124 if (slist
&& intlist__parse_list(ilist
, slist
))
130 intlist__delete(ilist
);
134 void intlist__delete(struct intlist
*ilist
)
137 rblist__delete(&ilist
->rblist
);
140 struct int_node
*intlist__entry(const struct intlist
*ilist
, unsigned int idx
)
142 struct int_node
*node
= NULL
;
143 struct rb_node
*rb_node
;
145 rb_node
= rblist__entry(&ilist
->rblist
, idx
);
147 node
= container_of(rb_node
, struct int_node
, rb_node
);