From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932329AbdL1Pen (ORCPT ); Thu, 28 Dec 2017 10:34:43 -0500 Received: from terminus.zytor.com ([65.50.211.136]:42771 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753394AbdL1Pem (ORCPT ); Thu, 28 Dec 2017 10:34:42 -0500 Date: Thu, 28 Dec 2017 07:32:33 -0800 From: tip-bot for Masami Hiramatsu Message-ID: Cc: bhargavaramudu@gmail.com, pc@us.ibm.com, tmricht@linux.vnet.ibm.com, tglx@linutronix.de, mhiramat@kernel.org, acme@redhat.com, linux-kernel@vger.kernel.org, ravi.bangoria@linux.vnet.ibm.com, mingo@kernel.org, hpa@zytor.com Reply-To: tglx@linutronix.de, acme@redhat.com, mhiramat@kernel.org, bhargavaramudu@gmail.com, tmricht@linux.vnet.ibm.com, pc@us.ibm.com, linux-kernel@vger.kernel.org, hpa@zytor.com, mingo@kernel.org, ravi.bangoria@linux.vnet.ibm.com In-Reply-To: <151275052163.24652.18205979384585484358.stgit@devbox> References: <151275052163.24652.18205979384585484358.stgit@devbox> To: linux-tip-commits@vger.kernel.org Subject: [tip:perf/core] perf string: Add {strdup,strpbrk}_esc() Git-Commit-ID: 1e9f9e8af0de80e8f6a47d991df66090934be0c6 X-Mailer: tip-git-log-daemon Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Content-Disposition: inline Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Commit-ID: 1e9f9e8af0de80e8f6a47d991df66090934be0c6 Gitweb: https://git.kernel.org/tip/1e9f9e8af0de80e8f6a47d991df66090934be0c6 Author: Masami Hiramatsu AuthorDate: Sat, 9 Dec 2017 01:28:41 +0900 Committer: Arnaldo Carvalho de Melo CommitDate: Wed, 27 Dec 2017 12:15:55 -0300 perf string: Add {strdup,strpbrk}_esc() To support the special characters escaped by '\' in 'perf probe' event parser. Signed-off-by: Masami Hiramatsu Reviewed-by: Thomas Richter Acked-by: Ravi Bangoria Cc: Paul Clarke Cc: bhargavb 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 --- tools/perf/util/string.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ tools/perf/util/string2.h | 2 ++ 2 files changed, 48 insertions(+) diff --git a/tools/perf/util/string.c b/tools/perf/util/string.c index aaa08ee..d8bfd0c 100644 --- a/tools/perf/util/string.c +++ b/tools/perf/util/string.c @@ -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; +} diff --git a/tools/perf/util/string2.h b/tools/perf/util/string2.h index ee14ca5..4c68a09 100644 --- a/tools/perf/util/string2.h +++ b/tools/perf/util/string2.h @@ -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 */