Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4e60a2ca authored by Masami Hiramatsu's avatar Masami Hiramatsu Committed by Arnaldo Carvalho de Melo
Browse files

perf tools: Improve strfilter to append additional rules



Add strfilter__or/and to append additional rules to existing strfilter.

Signed-off-by: default avatarMasami 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: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 3099c026
Loading
Loading
Loading
Loading
+40 −0
Original line number Diff line number Diff line
@@ -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)
{
+26 −0
Original line number Diff line number Diff line
@@ -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