summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--misc.c37
1 files 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;
}