diff options
| -rw-r--r-- | src/work.c | 33 | 
1 files changed, 13 insertions, 20 deletions
@@ -279,13 +279,6 @@ DEFINE_OPERATOR(X) -static inline bool -views_overlap(const u8view_t a, const u8view_t b) -{ -	const char8_t *p = a.p + a.len; -	return p >= b.p && p <= b.p + b.len; -} -  void  write_match_to_buffer(u8view_t sv, u8view_t *hl)  { @@ -377,23 +370,23 @@ write_match_to_buffer(u8view_t sv, u8view_t *hl)  	array_extend(&sorted, hl, array_len(hl));  	qsort(sorted, array_len(sorted), sizeof(*sorted), svposcmp); -	for (ptrdiff_t i = 0, len = array_len(sorted); i < len - 1;) { -		if (views_overlap(sorted[i], sorted[i + 1])) { -			sorted[i].len = sorted[i + 1].p + sorted[i + 1].len - sorted[i].p; -			memmove(hl + i + 1, hl + i + 2, sizeof(*hl) * (len - i - 1)); -			array_hdr(sorted)->len = --len; -		} else -			i++; -	} -  	for (ptrdiff_t i = 0, len = array_len(sorted); i < len; i++) { -		if (i < len - 1 && sorted[i].p == sorted[i + 1].p) +		ptrdiff_t Δ; +		u8view_t h = sorted[i]; + +		if ((Δ = h.p - sv.p) < 0) +			VSHFT(&h, -Δ); +		if ((Δ = (h.p + h.len) - (sv.p + sv.len)) > 0) +			h.len -= Δ; +		if (h.len <= 0)  			continue; -		array_extend(buf, sv.p, sorted[i].p - sv.p); + +		array_extend(buf, sv.p, h.p - sv.p);  		array_extend_sv(buf, COL_HL); -		array_extend_sv(buf, sorted[i]); +		array_extend_sv(buf, h);  		array_extend_sv(buf, COL_RS); -		ptrdiff_t Δ = sorted[i].p - sv.p + sorted[i].len; + +		Δ = h.p - sv.p + h.len;  		VSHFT(&sv, Δ);  	}  	array_extend_sv(buf, sv);  |