John Kacur | 8b40f52 | 2009-09-24 18:02:18 +0200 | [diff] [blame] | 1 | #ifndef __PERF_STRLIST_H |
| 2 | #define __PERF_STRLIST_H |
Arnaldo Carvalho de Melo | 2590340 | 2009-06-30 19:01:20 -0300 | [diff] [blame] | 3 | |
Arnaldo Carvalho de Melo | 43cbcd8 | 2009-07-01 12:28:37 -0300 | [diff] [blame] | 4 | #include <linux/rbtree.h> |
Arnaldo Carvalho de Melo | 2590340 | 2009-06-30 19:01:20 -0300 | [diff] [blame] | 5 | #include <stdbool.h> |
| 6 | |
| 7 | struct str_node { |
| 8 | struct rb_node rb_node; |
| 9 | const char *s; |
| 10 | }; |
| 11 | |
| 12 | struct strlist { |
| 13 | struct rb_root entries; |
Arnaldo Carvalho de Melo | 27d0fd4 | 2009-07-11 12:18:34 -0300 | [diff] [blame] | 14 | unsigned int nr_entries; |
| 15 | bool dupstr; |
Arnaldo Carvalho de Melo | 2590340 | 2009-06-30 19:01:20 -0300 | [diff] [blame] | 16 | }; |
| 17 | |
| 18 | struct strlist *strlist__new(bool dupstr, const char *slist); |
| 19 | void strlist__delete(struct strlist *self); |
| 20 | |
| 21 | void strlist__remove(struct strlist *self, struct str_node *sn); |
| 22 | int strlist__load(struct strlist *self, const char *filename); |
| 23 | int strlist__add(struct strlist *self, const char *str); |
| 24 | |
Arnaldo Carvalho de Melo | 27d0fd4 | 2009-07-11 12:18:34 -0300 | [diff] [blame] | 25 | struct str_node *strlist__entry(const struct strlist *self, unsigned int idx); |
Masami Hiramatsu | 3e34059 | 2009-12-15 10:31:49 -0500 | [diff] [blame] | 26 | struct str_node *strlist__find(struct strlist *self, const char *entry); |
| 27 | |
| 28 | static inline bool strlist__has_entry(struct strlist *self, const char *entry) |
| 29 | { |
| 30 | return strlist__find(self, entry) != NULL; |
| 31 | } |
Arnaldo Carvalho de Melo | 2590340 | 2009-06-30 19:01:20 -0300 | [diff] [blame] | 32 | |
| 33 | static inline bool strlist__empty(const struct strlist *self) |
| 34 | { |
Arnaldo Carvalho de Melo | 27d0fd4 | 2009-07-11 12:18:34 -0300 | [diff] [blame] | 35 | return self->nr_entries == 0; |
| 36 | } |
| 37 | |
| 38 | static inline unsigned int strlist__nr_entries(const struct strlist *self) |
| 39 | { |
| 40 | return self->nr_entries; |
Arnaldo Carvalho de Melo | 2590340 | 2009-06-30 19:01:20 -0300 | [diff] [blame] | 41 | } |
| 42 | |
Masami Hiramatsu | abf5ef7 | 2009-12-15 10:31:56 -0500 | [diff] [blame] | 43 | /* For strlist iteration */ |
| 44 | static inline struct str_node *strlist__first(struct strlist *self) |
| 45 | { |
| 46 | struct rb_node *rn = rb_first(&self->entries); |
| 47 | return rn ? rb_entry(rn, struct str_node, rb_node) : NULL; |
| 48 | } |
| 49 | static inline struct str_node *strlist__next(struct str_node *sn) |
| 50 | { |
| 51 | struct rb_node *rn; |
| 52 | if (!sn) |
| 53 | return NULL; |
| 54 | rn = rb_next(&sn->rb_node); |
| 55 | return rn ? rb_entry(rn, struct str_node, rb_node) : NULL; |
| 56 | } |
| 57 | |
| 58 | /** |
| 59 | * strlist_for_each - iterate over a strlist |
| 60 | * @pos: the &struct str_node to use as a loop cursor. |
| 61 | * @self: the &struct strlist for loop. |
| 62 | */ |
| 63 | #define strlist__for_each(pos, self) \ |
| 64 | for (pos = strlist__first(self); pos; pos = strlist__next(pos)) |
| 65 | |
| 66 | /** |
| 67 | * strlist_for_each_safe - iterate over a strlist safe against removal of |
| 68 | * str_node |
| 69 | * @pos: the &struct str_node to use as a loop cursor. |
| 70 | * @n: another &struct str_node to use as temporary storage. |
| 71 | * @self: the &struct strlist for loop. |
| 72 | */ |
| 73 | #define strlist__for_each_safe(pos, n, self) \ |
| 74 | for (pos = strlist__first(self), n = strlist__next(pos); pos;\ |
| 75 | pos = n, n = strlist__next(n)) |
| 76 | |
Arnaldo Carvalho de Melo | 2590340 | 2009-06-30 19:01:20 -0300 | [diff] [blame] | 77 | int strlist__parse_list(struct strlist *self, const char *s); |
John Kacur | 8b40f52 | 2009-09-24 18:02:18 +0200 | [diff] [blame] | 78 | #endif /* __PERF_STRLIST_H */ |