From: Ahmad Fatoum <a.fatoum@pengutronix.de> To: barebox@lists.infradead.org Cc: Ahmad Fatoum <a.fatoum@pengutronix.de> Subject: [PATCH 19/30] vsprintf: add optional support for %ls format modifier Date: Mon, 22 Nov 2021 09:47:21 +0100 [thread overview] Message-ID: <20211122084732.2597109-20-a.fatoum@pengutronix.de> (raw) In-Reply-To: <20211122084732.2597109-1-a.fatoum@pengutronix.de> Incoming EFI loader support will deal a lot with wide strings, so it makes sense to have printf directly support printing it. Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> --- common/efi/Kconfig | 1 + lib/Kconfig | 3 +++ lib/vsprintf.c | 67 +++++++++++++++++++++++++++++++++++++--------- 3 files changed, 59 insertions(+), 12 deletions(-) diff --git a/common/efi/Kconfig b/common/efi/Kconfig index 55939b43d684..b4d94f739ce4 100644 --- a/common/efi/Kconfig +++ b/common/efi/Kconfig @@ -8,6 +8,7 @@ config EFI_BOOTUP select EFI_GUID select EFI_DEVICEPATH select PRINTF_UUID + select PRINTF_WCHAR select BLOCK select PARTITION_DISK select HW_HAS_PCI diff --git a/lib/Kconfig b/lib/Kconfig index ea6de76a22f9..718033e56e64 100644 --- a/lib/Kconfig +++ b/lib/Kconfig @@ -163,6 +163,9 @@ config PROGRESS_NOTIFIER config PRINTF_UUID bool +config PRINTF_WCHAR + bool + config GENERIC_LIB_ASHLDI3 bool diff --git a/lib/vsprintf.c b/lib/vsprintf.c index 237aab0c02a1..85147e8d2e25 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c @@ -16,8 +16,10 @@ #include <linux/math64.h> #include <malloc.h> #include <kallsyms.h> +#include <wchar.h> #include <common.h> +#include <pbl.h> /* we use this so that we can do without the ctype library */ #define is_digit(c) ((c) >= '0' && (c) <= '9') @@ -147,6 +149,32 @@ static char *number(char *buf, const char *end, unsigned long long num, int base #define PAGE_SIZE 4096 #endif +static char *leading_spaces(char *buf, const char *end, + int len, int *field_width, int flags) +{ + if (!(flags & LEFT)) { + while (len < *field_width--) { + if (buf < end) + *buf = ' '; + ++buf; + } + } + + return buf; +} + +static char *trailing_spaces(char *buf, const char *end, + int len, int *field_width, int flags) +{ + while (len < *field_width--) { + if (buf < end) + *buf = ' '; + ++buf; + } + + return buf; +} + static char *string(char *buf, const char *end, const char *s, int field_width, int precision, int flags) { @@ -156,25 +184,35 @@ static char *string(char *buf, const char *end, const char *s, int field_width, s = "<NULL>"; len = strnlen(s, precision); + buf = leading_spaces(buf, end, len, &field_width, flags); - if (!(flags & LEFT)) { - while (len < field_width--) { - if (buf < end) - *buf = ' '; - ++buf; - } - } for (i = 0; i < len; ++i) { if (buf < end) *buf = *s; ++buf; ++s; } - while (len < field_width--) { + + return trailing_spaces(buf, end, len, &field_width, flags); +} + +static char *wstring(char *buf, const char *end, const wchar_t *s, int field_width, + int precision, int flags) +{ + int len, i; + + if ((unsigned long)s < PAGE_SIZE) + s = L"<NULL>"; + + len = wcsnlen(s, precision); + leading_spaces(buf, end, len, &field_width, flags); + + for (i = 0; i < len; ++i) { if (buf < end) - *buf = ' '; - ++buf; + wctomb(buf, *s); + ++buf; ++s; } - return buf; + + return trailing_spaces(buf, end, len, &field_width, flags); } static char *raw_pointer(char *buf, const char *end, const void *ptr, int field_width, @@ -528,7 +566,12 @@ int vsnprintf(char *buf, size_t size, const char *fmt, va_list args) continue; case 's': - str = string(str, end, va_arg(args, char *), field_width, precision, flags); + if (IS_ENABLED(CONFIG_PRINTF_WCHAR) && !IN_PBL && qualifier == 'l') + str = wstring(str, end, va_arg(args, wchar_t *), + field_width, precision, flags); + else + str = string(str, end, va_arg(args, char *), + field_width, precision, flags); continue; case 'p': -- 2.30.2 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
next prev parent reply other threads:[~2021-11-22 8:50 UTC|newest] Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-11-22 8:47 [PATCH 00/30] efi: refactor for upcoming loader support Ahmad Fatoum 2021-11-22 8:47 ` [PATCH 01/30] fs: remove useless AT_FDCWD references Ahmad Fatoum 2021-11-22 8:47 ` [PATCH 02/30] fs: remove unused struct node_d in struct dir Ahmad Fatoum 2021-11-22 8:47 ` [PATCH 03/30] block : efi: rename driver variable from efi_fs_driver to efi_bio_driver Ahmad Fatoum 2021-11-22 8:47 ` [PATCH 04/30] include: <linux/types.h>: wrap in #ifndef __ASSEMBLY__ Ahmad Fatoum 2021-11-22 8:47 ` [PATCH 05/30] hw_random: stm32: propagate error codes from rng read Ahmad Fatoum 2021-11-22 8:47 ` [PATCH 06/30] efi: align LOAD_FILE_PROTOCOL_GUID's name with other PROTOCOL_GUIDs Ahmad Fatoum 2021-11-22 8:47 ` [PATCH 07/30] asm-generic: move sync_caches_for_execution declaration to <asm/cache.h> Ahmad Fatoum 2021-11-22 8:47 ` [PATCH 08/30] common: move EFI code into new efi/ top level directory Ahmad Fatoum 2021-11-23 8:55 ` Jules Maselbas 2021-11-22 8:47 ` [PATCH 09/30] serial: efi-stdio: move efi-stdio.h header to central location Ahmad Fatoum 2021-11-22 8:47 ` [PATCH 10/30] efi: use SPDX-License-Identifier where appropriate Ahmad Fatoum 2021-11-23 8:52 ` Jules Maselbas 2021-11-22 8:47 ` [PATCH 11/30] drivers: efi: move Kconfig options to new menu Ahmad Fatoum 2021-11-22 8:47 ` [PATCH 12/30] efi: factor out errno translation Ahmad Fatoum 2021-11-22 8:47 ` [PATCH 13/30] efi: rename <efi/efi.h> to <efi/efi-payload.h> Ahmad Fatoum 2021-11-22 8:47 ` [PATCH 14/30] efi: centralize efivarfs_parse_filename Ahmad Fatoum 2021-11-22 8:47 ` [PATCH 15/30] kbuild: force 16-bit wchar_t treewide Ahmad Fatoum 2021-11-22 8:47 ` [PATCH 16/30] include: <linux/nls.h>: remove duplicate wchar_t typedef Ahmad Fatoum 2021-11-22 8:47 ` [PATCH 17/30] lib: wchar: add wctomb and mbtowc Ahmad Fatoum 2021-11-22 8:47 ` [PATCH 18/30] lib: implement wcsnlen Ahmad Fatoum 2021-11-22 8:47 ` Ahmad Fatoum [this message] 2021-11-22 8:47 ` [PATCH 20/30] libfile: null-terminate read_file of wchar_t buffer Ahmad Fatoum 2021-11-22 8:47 ` [PATCH 21/30] commands: echo: add wide file output via wecho alias Ahmad Fatoum 2021-11-22 8:47 ` [PATCH 22/30] efi: make efi_main __noreturn Ahmad Fatoum 2021-11-22 8:47 ` [PATCH 23/30] efi: define and use new EFI_ERROR_MASK macro Ahmad Fatoum 2021-11-22 8:47 ` [PATCH 24/30] common: move CONFIG_ELF into General Settings Ahmad Fatoum 2021-11-22 8:47 ` [PATCH 25/30] efi: don't zero executable buffer before freeing Ahmad Fatoum 2021-11-22 8:47 ` [PATCH 26/30] partitions: efi: move header to central location Ahmad Fatoum 2021-11-22 8:47 ` [PATCH 27/30] efi: print early efi_main string on CONFIG_DEBUG_LL=y Ahmad Fatoum 2021-11-22 8:47 ` [PATCH 28/30] ARM64: board-dt-2nd: remove no longer needed noinline function split Ahmad Fatoum 2021-11-22 8:47 ` [PATCH 29/30] bus: acpi: register bus even if without ACPI EFI table Ahmad Fatoum 2021-11-22 8:47 ` [PATCH 30/30] efi: guid: fix typos Ahmad Fatoum 2021-11-25 7:44 ` [PATCH 00/30] efi: refactor for upcoming loader support Sascha Hauer
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20211122084732.2597109-20-a.fatoum@pengutronix.de \ --to=a.fatoum@pengutronix.de \ --cc=barebox@lists.infradead.org \ --subject='Re: [PATCH 19/30] vsprintf: add optional support for %ls format modifier' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox