diff options
Diffstat (limited to 'tools/perf/util/string.c')
-rw-r--r-- | tools/perf/util/string.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/tools/perf/util/string.c b/tools/perf/util/string.c index aaa08ee8c717..d8bfd0c4d2cb 100644 --- a/tools/perf/util/string.c +++ b/tools/perf/util/string.c | |||
@@ -396,3 +396,49 @@ out_err_overflow: | |||
396 | free(expr); | 396 | free(expr); |
397 | return NULL; | 397 | return NULL; |
398 | } | 398 | } |
399 | |||
400 | /* Like strpbrk(), but not break if it is right after a backslash (escaped) */ | ||
401 | char *strpbrk_esc(char *str, const char *stopset) | ||
402 | { | ||
403 | char *ptr; | ||
404 | |||
405 | do { | ||
406 | ptr = strpbrk(str, stopset); | ||
407 | if (ptr == str || | ||
408 | (ptr == str + 1 && *(ptr - 1) != '\\')) | ||
409 | break; | ||
410 | str = ptr + 1; | ||
411 | } while (ptr && *(ptr - 1) == '\\' && *(ptr - 2) != '\\'); | ||
412 | |||
413 | return ptr; | ||
414 | } | ||
415 | |||
416 | /* Like strdup, but do not copy a single backslash */ | ||
417 | char *strdup_esc(const char *str) | ||
418 | { | ||
419 | char *s, *d, *p, *ret = strdup(str); | ||
420 | |||
421 | if (!ret) | ||
422 | return NULL; | ||
423 | |||
424 | d = strchr(ret, '\\'); | ||
425 | if (!d) | ||
426 | return ret; | ||
427 | |||
428 | s = d + 1; | ||
429 | do { | ||
430 | if (*s == '\0') { | ||
431 | *d = '\0'; | ||
432 | break; | ||
433 | } | ||
434 | p = strchr(s + 1, '\\'); | ||
435 | if (p) { | ||
436 | memmove(d, s, p - s); | ||
437 | d += p - s; | ||
438 | s = p + 1; | ||
439 | } else | ||
440 | memmove(d, s, strlen(s) + 1); | ||
441 | } while (p); | ||
442 | |||
443 | return ret; | ||
444 | } | ||