verbatim: report and ignore an invalid keystroke for Unicode input

When Unicode Input has started (by typing 0 or 1 at the Verbatim Input
"prompt"), and something is typed that is not a hexadecimal digit, then
don't try to enter this character into the buffer but simply report it
as invalid and ignore it.  Because most likely the user mistyped and
actually meant to enter a valid hex digit.

This fixes https://savannah.gnu.org/bugs/?58927.

The bug was old -- it existed since at least version 2.0.6.
master
Benno Schulenberg 2020-08-10 09:24:22 +02:00
parent cf769bbd2f
commit be20383240
1 changed files with 9 additions and 2 deletions

View File

@ -1278,6 +1278,8 @@ int get_kbinput(WINDOW *win, bool showcursor)
} }
#ifdef ENABLE_UTF8 #ifdef ENABLE_UTF8
#define INVALID_DIGIT -77
/* If the given symbol is a valid hexadecimal digit, multiply it by factor /* If the given symbol is a valid hexadecimal digit, multiply it by factor
* and add the result to the given unicode, and return PROCEED to signify * and add the result to the given unicode, and return PROCEED to signify
* okay. When not a hexadecimal digit, return the symbol itself. */ * okay. When not a hexadecimal digit, return the symbol itself. */
@ -1288,7 +1290,7 @@ long add_unicode_digit(int symbol, long factor, long *unicode)
else if ('a' <= tolower(symbol) && tolower(symbol) <= 'f') else if ('a' <= tolower(symbol) && tolower(symbol) <= 'f')
*unicode += (tolower(symbol) - 'a' + 10) * factor; *unicode += (tolower(symbol) - 'a' + 10) * factor;
else else
return (long)symbol; return INVALID_DIGIT;
return PROCEED; return PROCEED;
} }
@ -1312,7 +1314,7 @@ long assemble_unicode(int symbol)
if (symbol == '0' || unicode == 0) if (symbol == '0' || unicode == 0)
retval = add_unicode_digit(symbol, 0x10000, &unicode); retval = add_unicode_digit(symbol, 0x10000, &unicode);
else else
retval = symbol; retval = INVALID_DIGIT;
break; break;
case 3: case 3:
/* Later digits may be any hexadecimal value. */ /* Later digits may be any hexadecimal value. */
@ -1395,6 +1397,11 @@ int *parse_verbatim_kbinput(WINDOW *win, size_t *count)
unicode = assemble_unicode(keycode); unicode = assemble_unicode(keycode);
} }
/* For an invalid digit, discard its possible continuation bytes. */
if (unicode == INVALID_DIGIT)
while (key_buffer_len > 0 && 0x7F < *key_buffer && *key_buffer < 0xC0)
get_input(NULL);
/* Convert the Unicode value to a multibyte sequence. */ /* Convert the Unicode value to a multibyte sequence. */
multibyte = make_mbchar(unicode, (int *)count); multibyte = make_mbchar(unicode, (int *)count);