diff options
-rw-r--r-- | misc.c | 37 |
1 files changed, 29 insertions, 8 deletions
@@ -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; } |