in the utf-8 mode, invalid multibytes are now handled more strongly:

• if it's in x_literal() (“quote” / ^V) mode, it's accepted like now
• if it's a mb sequence start, it's rejected with a beep
• if it's a mb continuation, the whole sequence is silently rejected

this makes command line editing when accidentally hitting, e.g. with
my mircvs://contrib/samples/dot.Xmodmap, Mode_switch-x much more ro-
bust.
This commit is contained in:
tg 2007-03-10 00:36:44 +00:00
parent d306d5a9e4
commit db81d72dea

8
edit.c
View File

@ -5,7 +5,7 @@
#include "sh.h" #include "sh.h"
__RCSID("$MirOS: src/bin/mksh/edit.c,v 1.85 2007/03/10 00:23:31 tg Exp $"); __RCSID("$MirOS: src/bin/mksh/edit.c,v 1.86 2007/03/10 00:36:44 tg Exp $");
/* tty driver characters we are interested in */ /* tty driver characters we are interested in */
typedef struct { typedef struct {
@ -1503,6 +1503,7 @@ x_insert(int c)
* Should allow tab and control chars. * Should allow tab and control chars.
*/ */
if (c == 0) { if (c == 0) {
invmbs:
left = 0; left = 0;
x_e_putc2(7); x_e_putc2(7);
return KSTD; return KSTD;
@ -1519,10 +1520,12 @@ x_insert(int c)
return (KSTD); return (KSTD);
} }
if (left) { if (left) {
if (x_curprefix == -1) {
/* flush invalid multibyte */ /* flush invalid multibyte */
str[pos] = '\0'; str[pos] = '\0';
while (save_arg--) while (save_arg--)
x_ins(str); x_ins(str);
}
left = 0; left = 0;
} }
if ((c >= 0xC2) && (c < 0xE0)) if ((c >= 0xC2) && (c < 0xE0))
@ -1534,7 +1537,8 @@ x_insert(int c)
pos = 1; pos = 1;
str[0] = c; str[0] = c;
return (KSTD); return (KSTD);
} } else if (c > 0x7F)
goto invmbs;
} }
left = 0; left = 0;
str[0] = c; str[0] = c;