1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef __PERF_STRFILTER_H
3 #define __PERF_STRFILTER_H
4 /* General purpose glob matching filter */
5 
6 #include <linux/list.h>
7 #include <stdbool.h>
8 
9 /* A node of string filter */
10 struct strfilter_node {
11 	struct strfilter_node *l;	/* Tree left branch (for &,|) */
12 	struct strfilter_node *r;	/* Tree right branch (for !,&,|) */
13 	const char *p;		/* Operator or rule */
14 };
15 
16 /* String filter */
17 struct strfilter {
18 	struct strfilter_node *root;
19 };
20 
21 /**
22  * strfilter__new - Create a new string filter
23  * @rules: Filter rule, which is a combination of glob expressions.
24  * @err: Pointer which points an error detected on @rules
25  *
26  * Parse @rules and return new strfilter. Return NULL if an error detected.
27  * In that case, *@err will indicate where it is detected, and *@err is NULL
28  * if a memory allocation is failed.
29  */
30 struct strfilter *strfilter__new(const char *rules, const char **err);
31 
32 /**
33  * strfilter__or - Append an additional rule by logical-or
34  * @filter: Original string filter
35  * @rules: Filter rule to be appended at left of the root of
36  *         @filter by using logical-or.
37  * @err: Pointer which points an error detected on @rules
38  *
39  * Parse @rules and join it to the @filter by using logical-or.
40  * Return 0 if success, or return the error code.
41  */
42 int strfilter__or(struct strfilter *filter,
43 		  const char *rules, const char **err);
44 
45 /**
46  * strfilter__add - Append an additional rule by logical-and
47  * @filter: Original string filter
48  * @rules: Filter rule to be appended at left of the root of
49  *         @filter by using logical-and.
50  * @err: Pointer which points an error detected on @rules
51  *
52  * Parse @rules and join it to the @filter by using logical-and.
53  * Return 0 if success, or return the error code.
54  */
55 int strfilter__and(struct strfilter *filter,
56 		   const char *rules, const char **err);
57 
58 /**
59  * strfilter__compare - compare given string and a string filter
60  * @filter: String filter
61  * @str: target string
62  *
63  * Compare @str and @filter. Return true if the str match the rule
64  */
65 bool strfilter__compare(struct strfilter *filter, const char *str);
66 
67 /**
68  * strfilter__delete - delete a string filter
69  * @filter: String filter to delete
70  *
71  * Delete @filter.
72  */
73 void strfilter__delete(struct strfilter *filter);
74 
75 /**
76  * strfilter__string - Reconstruct a rule string from filter
77  * @filter: String filter to reconstruct
78  *
79  * Reconstruct a rule string from @filter. This will be good for
80  * debug messages. Note that returning string must be freed afterward.
81  */
82 char *strfilter__string(struct strfilter *filter);
83 
84 #endif
85