diff options
| author | mrb0nk500 <b0nk@b0nk.xyz> | 2022-08-29 18:58:10 -0300 | 
|---|---|---|
| committer | mrb0nk500 <b0nk@b0nk.xyz> | 2022-08-29 18:58:10 -0300 | 
| commit | c5b21debfa6c2014f4b4e5a4a09f19c1a7f31b03 (patch) | |
| tree | 0eb9661a9c77238dbe3040e8a3313da32f1bc13e | |
| parent | 83c37a9e9de61247f6e5deb618e090cf6b9df952 (diff) | |
| -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;  	}  | 
