summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2005-10-28 12:52:22 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2005-10-28 12:52:22 +0000
commit5f11a38bea0b4d843c72dbdb9fab23280a0aa228 (patch)
tree2f776f138694bc0acf540de23b4db37b03fc4f16
parentd7a37f48fd12d95134ae9db262f36452471c495e (diff)
downloadzsh-5f11a38bea0b4d843c72dbdb9fab23280a0aa228.tar.gz
zsh-5f11a38bea0b4d843c72dbdb9fab23280a0aa228.zip
21942: another extra-wide character fix
-rw-r--r--ChangeLog5
-rw-r--r--Src/Zle/zle_refresh.c34
2 files changed, 34 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index df800c019..9ff1abd20 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
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
}
}