diff options
Diffstat (limited to 'tools/perf/util/string.c')
| -rw-r--r-- | tools/perf/util/string.c | 39 | 
1 files changed, 39 insertions, 0 deletions
diff --git a/tools/perf/util/string.c b/tools/perf/util/string.c index 6afd6106ceb5..fc8781de62db 100644 --- a/tools/perf/util/string.c +++ b/tools/perf/util/string.c @@ -357,3 +357,42 @@ void *memdup(const void *src, size_t len)  	return p;  } + +char *asprintf_expr_inout_ints(const char *var, bool in, size_t nints, int *ints) +{ +	/* +	 * FIXME: replace this with an expression using log10() when we +	 * find a suitable implementation, maybe the one in the dvb drivers... +	 * +	 * "%s == %d || " = log10(MAXINT) * 2 + 8 chars for the operators +	 */ +	size_t size = nints * 28 + 1; /* \0 */ +	size_t i, printed = 0; +	char *expr = malloc(size); + +	if (expr) { +		const char *or_and = "||", *eq_neq = "=="; +		char *e = expr; + +		if (!in) { +			or_and = "&&"; +			eq_neq = "!="; +		} + +		for (i = 0; i < nints; ++i) { +			if (printed == size) +				goto out_err_overflow; + +			if (i > 0) +				printed += snprintf(e + printed, size - printed, " %s ", or_and); +			printed += scnprintf(e + printed, size - printed, +					     "%s %s %d", var, eq_neq, ints[i]); +		} +	} + +	return expr; + +out_err_overflow: +	free(expr); +	return NULL; +}  | 
