1e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#ifndef __PERF_STRLIST_H
2e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define __PERF_STRLIST_H
3e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
4e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <linux/rbtree.h>
5e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <stdbool.h>
6e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
7e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "rblist.h"
8e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
9e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct str_node {
10e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct rb_node rb_node;
11e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	const char     *s;
12e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
13e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
14e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct strlist {
15e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct rblist rblist;
16e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bool	       dupstr;
17e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
18e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
19e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct strlist *strlist__new(bool dupstr, const char *slist);
20e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid strlist__delete(struct strlist *slist);
21e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
22e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid strlist__remove(struct strlist *slist, struct str_node *sn);
23e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint strlist__load(struct strlist *slist, const char *filename);
24e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint strlist__add(struct strlist *slist, const char *str);
25e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
26e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct str_node *strlist__entry(const struct strlist *slist, unsigned int idx);
27e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct str_node *strlist__find(struct strlist *slist, const char *entry);
28e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
29e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic inline bool strlist__has_entry(struct strlist *slist, const char *entry)
30e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
31e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return strlist__find(slist, entry) != NULL;
32e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
33e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
34e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic inline bool strlist__empty(const struct strlist *slist)
35e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
36e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return rblist__empty(&slist->rblist);
37e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
38e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
39e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic inline unsigned int strlist__nr_entries(const struct strlist *slist)
40e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
41e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return rblist__nr_entries(&slist->rblist);
42e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
43e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
44e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* For strlist iteration */
45e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic inline struct str_node *strlist__first(struct strlist *slist)
46e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
47e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct rb_node *rn = rb_first(&slist->rblist.entries);
48e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return rn ? rb_entry(rn, struct str_node, rb_node) : NULL;
49e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
50e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic inline struct str_node *strlist__next(struct str_node *sn)
51e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
52e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct rb_node *rn;
53e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (!sn)
54e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		return NULL;
55e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	rn = rb_next(&sn->rb_node);
56e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return rn ? rb_entry(rn, struct str_node, rb_node) : NULL;
57e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
58e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
59e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/**
60e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * strlist_for_each      - iterate over a strlist
61e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * @pos:	the &struct str_node to use as a loop cursor.
62e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * @slist:	the &struct strlist for loop.
63e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */
64e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define strlist__for_each(pos, slist)	\
65e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	for (pos = strlist__first(slist); pos; pos = strlist__next(pos))
66e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
67e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/**
68e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * strlist_for_each_safe - iterate over a strlist safe against removal of
69e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *                         str_node
70e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * @pos:	the &struct str_node to use as a loop cursor.
71e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * @n:		another &struct str_node to use as temporary storage.
72e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * @slist:	the &struct strlist for loop.
73e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */
74e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define strlist__for_each_safe(pos, n, slist)	\
75e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	for (pos = strlist__first(slist), n = strlist__next(pos); pos;\
76e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	     pos = n, n = strlist__next(n))
77e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
78e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint strlist__parse_list(struct strlist *slist, const char *s);
79e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#endif /* __PERF_STRLIST_H */
80