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