OSDN Git Service

perf string: Add {strdup,strpbrk}_esc()
authorMasami Hiramatsu <mhiramat@kernel.org>
Fri, 8 Dec 2017 16:28:41 +0000 (01:28 +0900)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 27 Dec 2017 15:15:55 +0000 (12:15 -0300)
To support the special characters escaped by '\' in 'perf probe' event parser.

Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
Reviewed-by: Thomas Richter <tmricht@linux.vnet.ibm.com>
Acked-by: Ravi Bangoria <ravi.bangoria@linux.vnet.ibm.com>
Cc: Paul Clarke <pc@us.ibm.com>
Cc: bhargavb <bhargavaramudu@gmail.com>
Cc: linux-rt-users@vger.kernel.org
Link: http://lkml.kernel.org/r/151275052163.24652.18205979384585484358.stgit@devbox
[ Split from a larger patch ]
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/string.c
tools/perf/util/string2.h

index aaa08ee..d8bfd0c 100644 (file)
@@ -396,3 +396,49 @@ out_err_overflow:
        free(expr);
        return NULL;
 }
+
+/* Like strpbrk(), but not break if it is right after a backslash (escaped) */
+char *strpbrk_esc(char *str, const char *stopset)
+{
+       char *ptr;
+
+       do {
+               ptr = strpbrk(str, stopset);
+               if (ptr == str ||
+                   (ptr == str + 1 && *(ptr - 1) != '\\'))
+                       break;
+               str = ptr + 1;
+       } while (ptr && *(ptr - 1) == '\\' && *(ptr - 2) != '\\');
+
+       return ptr;
+}
+
+/* Like strdup, but do not copy a single backslash */
+char *strdup_esc(const char *str)
+{
+       char *s, *d, *p, *ret = strdup(str);
+
+       if (!ret)
+               return NULL;
+
+       d = strchr(ret, '\\');
+       if (!d)
+               return ret;
+
+       s = d + 1;
+       do {
+               if (*s == '\0') {
+                       *d = '\0';
+                       break;
+               }
+               p = strchr(s + 1, '\\');
+               if (p) {
+                       memmove(d, s, p - s);
+                       d += p - s;
+                       s = p + 1;
+               } else
+                       memmove(d, s, strlen(s) + 1);
+       } while (p);
+
+       return ret;
+}
index ee14ca5..4c68a09 100644 (file)
@@ -39,5 +39,7 @@ static inline char *asprintf_expr_not_in_ints(const char *var, size_t nints, int
        return asprintf_expr_inout_ints(var, false, nints, ints);
 }
 
+char *strpbrk_esc(char *str, const char *stopset);
+char *strdup_esc(const char *str);
 
 #endif /* PERF_STRING_H */