1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-10-04 20:40:57 +02:00

21942: another extra-wide character fix

This commit is contained in:
Peter Stephenson 2005-10-28 12:52:22 +00:00
parent d7a37f48fd
commit 5f11a38bea
2 changed files with 34 additions and 5 deletions

View file

@ -1,3 +1,8 @@
2005-10-28 Peter Stephenson <pws@csr.com>
* 21942: Src/Zle/zle_fresh.c: another bug found when deleting
an extra-wide character.
2005-10-26 Peter Stephenson <pws@csr.com>
* 21939: Src/Zle/zle_thingy.c: new UNMETACHECK() was too ruthless.

View file

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