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