| 
									
										
										
										
											2009-09-24 18:02:18 +02:00
										 |  |  | #ifndef __PERF_STRLIST_H
 | 
					
						
							|  |  |  | #define __PERF_STRLIST_H
 | 
					
						
							| 
									
										
										
										
											2009-06-30 19:01:20 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-01 12:28:37 -03:00
										 |  |  | #include <linux/rbtree.h>
 | 
					
						
							| 
									
										
										
										
											2009-06-30 19:01:20 -03:00
										 |  |  | #include <stdbool.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-30 22:31:33 -06:00
										 |  |  | #include "rblist.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-30 19:01:20 -03:00
										 |  |  | struct str_node { | 
					
						
							|  |  |  | 	struct rb_node rb_node; | 
					
						
							|  |  |  | 	const char     *s; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct strlist { | 
					
						
							| 
									
										
										
										
											2012-07-30 22:31:33 -06:00
										 |  |  | 	struct rblist rblist; | 
					
						
							| 
									
										
										
										
											2009-07-11 12:18:34 -03:00
										 |  |  | 	bool	       dupstr; | 
					
						
							| 
									
										
										
										
											2009-06-30 19:01:20 -03:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct strlist *strlist__new(bool dupstr, const char *slist); | 
					
						
							| 
									
										
										
										
											2013-01-24 21:59:59 -03:00
										 |  |  | void strlist__delete(struct strlist *slist); | 
					
						
							| 
									
										
										
										
											2009-06-30 19:01:20 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-24 21:59:59 -03:00
										 |  |  | void strlist__remove(struct strlist *slist, struct str_node *sn); | 
					
						
							|  |  |  | int strlist__load(struct strlist *slist, const char *filename); | 
					
						
							|  |  |  | int strlist__add(struct strlist *slist, const char *str); | 
					
						
							| 
									
										
										
										
											2009-06-30 19:01:20 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-24 21:59:59 -03:00
										 |  |  | struct str_node *strlist__entry(const struct strlist *slist, unsigned int idx); | 
					
						
							|  |  |  | struct str_node *strlist__find(struct strlist *slist, const char *entry); | 
					
						
							| 
									
										
										
										
											2009-12-15 10:31:49 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-24 21:59:59 -03:00
										 |  |  | static inline bool strlist__has_entry(struct strlist *slist, const char *entry) | 
					
						
							| 
									
										
										
										
											2009-12-15 10:31:49 -05:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-01-24 21:59:59 -03:00
										 |  |  | 	return strlist__find(slist, entry) != NULL; | 
					
						
							| 
									
										
										
										
											2009-12-15 10:31:49 -05:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2009-06-30 19:01:20 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-24 21:59:59 -03:00
										 |  |  | static inline bool strlist__empty(const struct strlist *slist) | 
					
						
							| 
									
										
										
										
											2009-06-30 19:01:20 -03:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-01-24 21:59:59 -03:00
										 |  |  | 	return rblist__empty(&slist->rblist); | 
					
						
							| 
									
										
										
										
											2009-07-11 12:18:34 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-24 21:59:59 -03:00
										 |  |  | static inline unsigned int strlist__nr_entries(const struct strlist *slist) | 
					
						
							| 
									
										
										
										
											2009-07-11 12:18:34 -03:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-01-24 21:59:59 -03:00
										 |  |  | 	return rblist__nr_entries(&slist->rblist); | 
					
						
							| 
									
										
										
										
											2009-06-30 19:01:20 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-15 10:31:56 -05:00
										 |  |  | /* For strlist iteration */ | 
					
						
							| 
									
										
										
										
											2013-01-24 21:59:59 -03:00
										 |  |  | static inline struct str_node *strlist__first(struct strlist *slist) | 
					
						
							| 
									
										
										
										
											2009-12-15 10:31:56 -05:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-01-24 21:59:59 -03:00
										 |  |  | 	struct rb_node *rn = rb_first(&slist->rblist.entries); | 
					
						
							| 
									
										
										
										
											2009-12-15 10:31:56 -05:00
										 |  |  | 	return rn ? rb_entry(rn, struct str_node, rb_node) : NULL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | static inline struct str_node *strlist__next(struct str_node *sn) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	struct rb_node *rn; | 
					
						
							|  |  |  | 	if (!sn) | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	rn = rb_next(&sn->rb_node); | 
					
						
							|  |  |  | 	return rn ? rb_entry(rn, struct str_node, rb_node) : NULL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * strlist_for_each      - iterate over a strlist | 
					
						
							|  |  |  |  * @pos:	the &struct str_node to use as a loop cursor. | 
					
						
							| 
									
										
										
										
											2013-01-24 21:59:59 -03:00
										 |  |  |  * @slist:	the &struct strlist for loop. | 
					
						
							| 
									
										
										
										
											2009-12-15 10:31:56 -05:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2013-01-24 21:59:59 -03:00
										 |  |  | #define strlist__for_each(pos, slist)	\
 | 
					
						
							|  |  |  | 	for (pos = strlist__first(slist); pos; pos = strlist__next(pos)) | 
					
						
							| 
									
										
										
										
											2009-12-15 10:31:56 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * strlist_for_each_safe - iterate over a strlist safe against removal of | 
					
						
							|  |  |  |  *                         str_node | 
					
						
							|  |  |  |  * @pos:	the &struct str_node to use as a loop cursor. | 
					
						
							|  |  |  |  * @n:		another &struct str_node to use as temporary storage. | 
					
						
							| 
									
										
										
										
											2013-01-24 21:59:59 -03:00
										 |  |  |  * @slist:	the &struct strlist for loop. | 
					
						
							| 
									
										
										
										
											2009-12-15 10:31:56 -05:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2013-01-24 21:59:59 -03:00
										 |  |  | #define strlist__for_each_safe(pos, n, slist)	\
 | 
					
						
							|  |  |  | 	for (pos = strlist__first(slist), n = strlist__next(pos); pos;\ | 
					
						
							| 
									
										
										
										
											2009-12-15 10:31:56 -05:00
										 |  |  | 	     pos = n, n = strlist__next(n)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-24 21:59:59 -03:00
										 |  |  | int strlist__parse_list(struct strlist *slist, const char *s); | 
					
						
							| 
									
										
										
										
											2009-09-24 18:02:18 +02:00
										 |  |  | #endif /* __PERF_STRLIST_H */
 |