| /* SPDX-License-Identifier: GPL-2.0 */ | 
 | #ifndef __PERF_STRFILTER_H | 
 | #define __PERF_STRFILTER_H | 
 | /* General purpose glob matching filter */ | 
 |  | 
 | #include <linux/list.h> | 
 | #include <stdbool.h> | 
 |  | 
 | /* A node of string filter */ | 
 | struct strfilter_node { | 
 | 	struct strfilter_node *l;	/* Tree left branch (for &,|) */ | 
 | 	struct strfilter_node *r;	/* Tree right branch (for !,&,|) */ | 
 | 	const char *p;		/* Operator or rule */ | 
 | }; | 
 |  | 
 | /* String filter */ | 
 | struct strfilter { | 
 | 	struct strfilter_node *root; | 
 | }; | 
 |  | 
 | /** | 
 |  * strfilter__new - Create a new string filter | 
 |  * @rules: Filter rule, which is a combination of glob expressions. | 
 |  * @err: Pointer which points an error detected on @rules | 
 |  * | 
 |  * Parse @rules and return new strfilter. Return NULL if an error detected. | 
 |  * In that case, *@err will indicate where it is detected, and *@err is NULL | 
 |  * if a memory allocation is failed. | 
 |  */ | 
 | struct strfilter *strfilter__new(const char *rules, const char **err); | 
 |  | 
 | /** | 
 |  * strfilter__or - Append an additional rule by logical-or | 
 |  * @filter: Original string filter | 
 |  * @rules: Filter rule to be appended at left of the root of | 
 |  *         @filter by using logical-or. | 
 |  * @err: Pointer which points an error detected on @rules | 
 |  * | 
 |  * Parse @rules and join it to the @filter by using logical-or. | 
 |  * Return 0 if success, or return the error code. | 
 |  */ | 
 | int strfilter__or(struct strfilter *filter, | 
 | 		  const char *rules, const char **err); | 
 |  | 
 | /** | 
 |  * strfilter__add - Append an additional rule by logical-and | 
 |  * @filter: Original string filter | 
 |  * @rules: Filter rule to be appended at left of the root of | 
 |  *         @filter by using logical-and. | 
 |  * @err: Pointer which points an error detected on @rules | 
 |  * | 
 |  * Parse @rules and join it to the @filter by using logical-and. | 
 |  * Return 0 if success, or return the error code. | 
 |  */ | 
 | int strfilter__and(struct strfilter *filter, | 
 | 		   const char *rules, const char **err); | 
 |  | 
 | /** | 
 |  * strfilter__compare - compare given string and a string filter | 
 |  * @filter: String filter | 
 |  * @str: target string | 
 |  * | 
 |  * Compare @str and @filter. Return true if the str match the rule | 
 |  */ | 
 | bool strfilter__compare(struct strfilter *filter, const char *str); | 
 |  | 
 | /** | 
 |  * strfilter__delete - delete a string filter | 
 |  * @filter: String filter to delete | 
 |  * | 
 |  * Delete @filter. | 
 |  */ | 
 | void strfilter__delete(struct strfilter *filter); | 
 |  | 
 | /** | 
 |  * strfilter__string - Reconstruct a rule string from filter | 
 |  * @filter: String filter to reconstruct | 
 |  * | 
 |  * Reconstruct a rule string from @filter. This will be good for | 
 |  * debug messages. Note that returning string must be freed afterward. | 
 |  */ | 
 | char *strfilter__string(struct strfilter *filter); | 
 |  | 
 | #endif |