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