diff options
author | Michael Brown <mcb30@ipxe.org> | 2022-02-28 13:39:10 +0000 |
---|---|---|
committer | Michael Brown <mcb30@ipxe.org> | 2022-03-15 17:09:58 +0000 |
commit | 2ff3385e0078edda43e13ebfc9978fbcc5db311a (patch) | |
tree | d24c3bbefa3d1aaa487473bd9060e039d88c54f8 | |
parent | 7e9631b60fdcb02f05a80983ca68c10f26e4ab33 (diff) | |
download | ipxe-2ff3385e0078edda43e13ebfc9978fbcc5db311a.tar.gz |
[efi] Support Unicode character output via text console
Signed-off-by: Michael Brown <mcb30@ipxe.org>
-rw-r--r-- | src/interface/efi/efi_console.c | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/src/interface/efi/efi_console.c b/src/interface/efi/efi_console.c index fc1500afb..04bbd9e0c 100644 --- a/src/interface/efi/efi_console.c +++ b/src/interface/efi/efi_console.c @@ -26,6 +26,7 @@ FILE_LICENCE ( GPL2_OR_LATER ); #include <ipxe/efi/efi.h> #include <ipxe/efi/Protocol/ConsoleControl/ConsoleControl.h> #include <ipxe/ansiesc.h> +#include <ipxe/utf8.h> #include <ipxe/console.h> #include <ipxe/keymap.h> #include <ipxe/init.h> @@ -201,6 +202,9 @@ static struct ansiesc_context efi_ansiesc_ctx = { .handlers = efi_ansiesc_handlers, }; +/** EFI console UTF-8 accumulator */ +static struct utf8_accumulator efi_utf8_acc; + /** * Print a character to EFI console * @@ -208,13 +212,25 @@ static struct ansiesc_context efi_ansiesc_ctx = { */ static void efi_putchar ( int character ) { EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *conout = efi_systab->ConOut; - wchar_t wstr[] = { character, 0 }; + wchar_t wstr[2]; /* Intercept ANSI escape sequences */ character = ansiesc_process ( &efi_ansiesc_ctx, character ); if ( character < 0 ) return; + /* Accumulate Unicode characters */ + character = utf8_accumulate ( &efi_utf8_acc, character ); + if ( character == 0 ) + return; + + /* Treat unrepresentable (non-UCS2) characters as invalid */ + if ( character & ~( ( wchar_t ) -1UL ) ) + character = UTF8_INVALID; + + /* Output character */ + wstr[0] = character; + wstr[1] = L'\0'; conout->OutputString ( conout, wstr ); } |