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