diff options
author | Peter Stephenson <pws@users.sourceforge.net> | 2005-10-28 12:52:22 +0000 |
---|---|---|
committer | Peter Stephenson <pws@users.sourceforge.net> | 2005-10-28 12:52:22 +0000 |
commit | 5f11a38bea0b4d843c72dbdb9fab23280a0aa228 (patch) | |
tree | 2f776f138694bc0acf540de23b4db37b03fc4f16 /Src/Zle/zle_refresh.c | |
parent | d7a37f48fd12d95134ae9db262f36452471c495e (diff) | |
download | zsh-5f11a38bea0b4d843c72dbdb9fab23280a0aa228.tar.gz zsh-5f11a38bea0b4d843c72dbdb9fab23280a0aa228.tar.xz zsh-5f11a38bea0b4d843c72dbdb9fab23280a0aa228.zip |
21942: another extra-wide character fix
Diffstat (limited to 'Src/Zle/zle_refresh.c')
-rw-r--r-- | Src/Zle/zle_refresh.c | 34 |
1 files changed, 29 insertions, 5 deletions
diff --git a/Src/Zle/zle_refresh.c b/Src/Zle/zle_refresh.c index 8efde9048..18e120c89 100644 --- a/Src/Zle/zle_refresh.c +++ b/Src/Zle/zle_refresh.c @@ -1069,9 +1069,22 @@ refreshline(int ln) /* 3: main display loop - write out the buffer using whatever tricks we can */ for (;;) { - if (*nl && *ol && nl[1] == ol[1]) /* skip only if second chars match */ + if (*nl && *ol && nl[1] == ol[1]) { + /* skip only if second chars match */ +#ifdef ZLE_UNICODE_SUPPORT + int ccs_was = ccs; +#endif /* skip past all matching characters */ for (; *nl && (*nl == *ol); nl++, ol++, ccs++) ; +#ifdef ZLE_UNICODE_SUPPORT + /* Make sure ol and nl are pointing to real characters */ + while ((*nl == WEOF || *ol == WEOF) && ccs > ccs_was) { + nl--; + ol--; + ccs--; + } +#endif + } if (!*nl) { if (ccs == winw && hasam && char_ins > 0 && ins_last @@ -1125,7 +1138,8 @@ refreshline(int ln) /* inserting & deleting chars: we can if there's no right-prompt */ if ((ln || !put_rpmpt || !oput_rpmpt) - && (nl[1] && ol[1] && nl[1] != ol[1])) { + && (nl[1] && ol[1] && nl[1] != ol[1]) + && *ol != WEOF && *nl != WEOF) { /* deleting characters - see if we can find a match series that makes it cheaper to delete intermediate characters @@ -1177,9 +1191,19 @@ refreshline(int ln) } /* we can't do any fancy tricks, so just dump the single character and keep on trying */ - zputc(*nl); - nl++, ol++; - ccs++, vcs++; +#ifdef ZLE_UNICODE_SUPPORT + do { +#endif + zputc(*nl); + nl++, ol++; + ccs++, vcs++; +#ifdef ZLE_UNICODE_SUPPORT + /* + * Make sure we always overwrite the complete width of + * a character that was there before. + */ + } while (*ol == WEOF && *nl); +#endif } } |