Mangled prompt in xterm under XFree86 4.x
Pavel Roskin
proski at gnu.org
Thu Aug 16 03:57:26 UTC 2001
Hello, Dmitry!
> In xterm under XFree86 4.x the prompt is "prefixed" with a "^O", so that
> instead of e.g. "goofy:~ " one sees "^Ogoofy:~" (shell is zsh with
> PS1='%m:%~%# ').
Finally I have fixed this problem. Actually, there were two problems:
strip_ctrl_codes() wasn't using is_printable(). There are still many
places where is_printable() should be used, but let's fix your problem
first.
strip_ctrl_codes() didn't work are advertized. Stripping of the sequences
beginning with '\e[' was buggy. Unfortunately, this function was the
finest example of "primadonna style coding", so I just rewrote it using
pointers instead of indices - it was easier than to understand the
existing code :-/
The patch:
------------------------------------
--- ChangeLog
+++ ChangeLog
@@ -2,2 +2,5 @@
+ * util.c (strip_ctrl_codes): Rewrite using pointers. Fix
+ stripping sequences beginning with "\e[". Check is_printable().
+
* man2hlp.c: Remove HTML support. Remove old link support.
--- util.c
+++ util.c
@@ -841,28 +841,28 @@ char *skip_numbers (char *s)
* terminfo databases, except the Hewlett-Packard 70092 and some Wyse
* terminals. If I hear from a single person who uses such a terminal
* with MC, I'll be glad to add support for it. (Dugan)
+ * Non-printable characters are also removed.
*/
char *strip_ctrl_codes (char *s)
{
- int i; /* Current length of the string's correct (stripped) prefix */
- int j; /* Number of control characters we have skipped so far */
+ char *w; /* Current position where the stripped data is written */
+ char *r; /* Current position where the original data is read */
if (!s)
return 0;
-
- for (i = 0, j = 0; s [i+j]; ++i)
- if (s [i+j] != ESC_CHAR){
- if (j)
- s [i] = s [i+j];
+
+ for (w = s, r = s; *r; ++r)
+ if (*r != ESC_CHAR){
+ if (is_printable(*r))
+ *w++ = *r;
} else {
- ++j;
- if (s [i+j++] == '[')
- while (strchr ("0123456789;?", s [i+j++]))
+ if (*(++r) == '[') {
+ while (strchr ("0123456789;?", *(++r)))
/* Skip the control sequence's arguments */ ;
- --i;
+ }
}
- s[i] = 0;
+ *w = 0;
return s;
}
------------------------------------
The fixed snapshot is at http://www.red-bean.com/~proski/mc/
Thank you for reporting the problem!
--
Regards,
Pavel Roskin
More information about the mc-devel
mailing list