From c5b21debfa6c2014f4b4e5a4a09f19c1a7f31b03 Mon Sep 17 00:00:00 2001 From: mrb0nk500 Date: Mon, 29 Aug 2022 18:58:10 -0300 Subject: misc: Properly account for escaped delimiters in `find_delm()` --- misc.c | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/misc.c b/misc.c index 7c02291..771ca56 100644 --- a/misc.c +++ b/misc.c @@ -72,18 +72,39 @@ char *get_line(char **str) { } } +static int escape_span(char *str, char *cursor, const char *delm) { + if (!is_empty(str) && !is_empty(cursor)) { + char *s; + if (*str == '\\') { + const int span = strspn(str, "\\"); + if (&str[span] == cursor) { + return span; + } + } + + for (s = cursor-1; s > str && *s == '\\'; --s); + return (cursor-s)-1; + } else { + return -1; + } +} + char *find_delm(char *str, const char *delm, int skip_delm) { if (!is_empty(str)) { - char *s; - for (s = &str[strcspn(str, delm)]; *s != '\0'; s += strcspn(s, delm)) { - if (*s == '\\') { - s += strspn(++s, delm); - continue; - } else { - break; + while (*str != '\0') { + char *s = str; + str += strcspn(str, delm); + + if (str[-1] == '\\') { + const int span = escape_span(s, str, delm); + if (span > 0 && span % 2) { + str += strspn(++str, delm); + continue; + } } + break; } - return (skip_delm) ? &s[strspn(s, delm)] : s; + return (skip_delm) ? &str[strspn(str, delm)] : str; } else { return NULL; } -- cgit v1.2.3-13-gbd6f