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;  	}  | 
