From f9224e5a0493a5f41882988cf467c80a531e331f Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Mon, 21 Apr 2008 17:30:34 +0000 Subject: 24859: combining chars: overwriting and vi replace and append --- Src/Zle/zle_misc.c | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) (limited to 'Src/Zle/zle_misc.c') diff --git a/Src/Zle/zle_misc.c b/Src/Zle/zle_misc.c index 27253a333..e00f22b04 100644 --- a/Src/Zle/zle_misc.c +++ b/Src/Zle/zle_misc.c @@ -47,14 +47,27 @@ doinsert(ZLE_STRING_T zstr, int len) iremovesuffix(c1, 0); invalidatelist(); - if(insmode) + if (insmode) spaceinline(m * len); - else if(zlecs + m * len > zlell) - spaceinline(zlecs + m * len - zlell); - while(m--) - for(s = zstr, count = len; count; s++, count--) + else { + int pos = zlecs, count = m * len, i = count, diff; + /* + * Ensure we replace a complete combining character + * for each character we overwrite. + */ + while (pos < zlell && i--) { + INCPOS(pos); + } + diff = pos - zlecs - count; + if (diff < 0) { + spaceinline(-diff); + } else if (diff > 0) + foredel(diff, CUT_RAW); + } + while (m--) + for (s = zstr, count = len; count; s++, count--) zleline[zlecs++] = *s; - if(neg) + if (neg) zlecs += zmult * len; /* if we ended up on a combining character, skip over it */ CCRIGHT(); -- cgit 1.4.1