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:
Masami Hiramatsu 2015-04-24 18:47:44 +09:00 committed by Arnaldo Carvalho de Melo
parent 3099c02600
commit 4e60a2caef
2 changed files with 66 additions and 0 deletions

View File

@ -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)
{

View File

@ -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