Commit-ID:  93ec4ce789995c5c58dff82193b3ec77caa8aecb
Gitweb:     http://git.kernel.org/tip/93ec4ce789995c5c58dff82193b3ec77caa8aecb
Author:     Arnaldo Carvalho de Melo <[email protected]>
AuthorDate: Thu, 2 Jul 2015 17:48:23 -0300
Committer:  Arnaldo Carvalho de Melo <[email protected]>
CommitDate: Mon, 6 Jul 2015 10:21:46 -0300

perf tools: Asprintf like functions to format integer filter expression

  char *asprintf_expr_in_ints(const char *var, size_t nints, int *ints);
  char *asprintf_expr_not_in_ints(const char *var, size_t nints, int *ints);

Example of output formatted with those functions:

  # ./tp_filter 6 12 2015
  asprintf_expr_in_ints:     id == 6 || id == 12 || id == 2015
  asprintf_expr_not_in_ints: id != 6 && id != 12 && id != 2015
  #

It'll be used with, for instance, perf_evsel__set_filter_in_ints(), that
will be used in turn to ask the kernel to filter out all raw_syscalls:*
except for the ones specified by the user via:

 $ perf trace -e some,list,of,syscalls

Cc: Adrian Hunter <[email protected]>
Cc: Borislav Petkov <[email protected]>
Cc: David Ahern <[email protected]>
Cc: Don Zickus <[email protected]>
Cc: Frederic Weisbecker <[email protected]>
Cc: Jiri Olsa <[email protected]>
Cc: Namhyung Kim <[email protected]>
Cc: Stephane Eranian <[email protected]>
Link: http://lkml.kernel.org/n/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
---
 tools/perf/util/string.c | 39 +++++++++++++++++++++++++++++++++++++++
 tools/perf/util/util.h   | 12 ++++++++++++
 2 files changed, 51 insertions(+)

diff --git a/tools/perf/util/string.c b/tools/perf/util/string.c
index 6afd610..fc8781d 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;
+}
diff --git a/tools/perf/util/util.h b/tools/perf/util/util.h
index 8bce58b..20d625a 100644
--- a/tools/perf/util/util.h
+++ b/tools/perf/util/util.h
@@ -339,4 +339,16 @@ int gzip_decompress_to_file(const char *input, int 
output_fd);
 int lzma_decompress_to_file(const char *input, int output_fd);
 #endif
 
+char *asprintf_expr_inout_ints(const char *var, bool in, size_t nints, int 
*ints);
+
+static inline char *asprintf_expr_in_ints(const char *var, size_t nints, int 
*ints)
+{
+       return asprintf_expr_inout_ints(var, true, nints, ints);
+}
+
+static inline char *asprintf_expr_not_in_ints(const char *var, size_t nints, 
int *ints)
+{
+       return asprintf_expr_inout_ints(var, false, nints, ints);
+}
+
 #endif /* GIT_COMPAT_UTIL_H */
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to