mirror of https://gitee.com/openkylin/linux.git
perf tools: Improve strfilter to append additional rules
Add strfilter__or/and to append additional rules to existing strfilter. Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> Cc: David Ahern <dsahern@gmail.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Link: http://lkml.kernel.org/r/20150424094744.23967.97614.stgit@localhost.localdomain Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
3099c02600
commit
4e60a2caef
|
@ -170,6 +170,46 @@ struct strfilter *strfilter__new(const char *rules, const char **err)
|
|||
return filter;
|
||||
}
|
||||
|
||||
static int strfilter__append(struct strfilter *filter, bool _or,
|
||||
const char *rules, const char **err)
|
||||
{
|
||||
struct strfilter_node *right, *root;
|
||||
const char *ep = NULL;
|
||||
|
||||
if (!filter || !rules)
|
||||
return -EINVAL;
|
||||
|
||||
right = strfilter_node__new(rules, &ep);
|
||||
if (!right || *ep != '\0') {
|
||||
if (err)
|
||||
*err = ep;
|
||||
goto error;
|
||||
}
|
||||
root = strfilter_node__alloc(_or ? OP_or : OP_and, filter->root, right);
|
||||
if (!root) {
|
||||
ep = NULL;
|
||||
goto error;
|
||||
}
|
||||
|
||||
filter->root = root;
|
||||
return 0;
|
||||
|
||||
error:
|
||||
strfilter_node__delete(right);
|
||||
return ep ? -EINVAL : -ENOMEM;
|
||||
}
|
||||
|
||||
int strfilter__or(struct strfilter *filter, const char *rules, const char **err)
|
||||
{
|
||||
return strfilter__append(filter, true, rules, err);
|
||||
}
|
||||
|
||||
int strfilter__and(struct strfilter *filter, const char *rules,
|
||||
const char **err)
|
||||
{
|
||||
return strfilter__append(filter, false, rules, err);
|
||||
}
|
||||
|
||||
static bool strfilter_node__compare(struct strfilter_node *node,
|
||||
const char *str)
|
||||
{
|
||||
|
|
|
@ -28,6 +28,32 @@ struct strfilter {
|
|||
*/
|
||||
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
|
||||
|
|
Loading…
Reference in New Issue