These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / tools / perf / util / string.c
index 6afd610..fc8781d 100644 (file)
@@ -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;
+}