From 6d4d6c3e2a096f9e475ac090a8bfd257535f8132 Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Wed, 29 Jun 2022 05:01:14 +0200 Subject: [PATCH] LibC: Implement `wcswidth` --- Userland/Libraries/LibC/wchar.cpp | 17 +++++++++++++++++ Userland/Libraries/LibC/wchar.h | 1 + 2 files changed, 18 insertions(+) diff --git a/Userland/Libraries/LibC/wchar.cpp b/Userland/Libraries/LibC/wchar.cpp index c712199629dca1..e389a2f19c7cb4 100644 --- a/Userland/Libraries/LibC/wchar.cpp +++ b/Userland/Libraries/LibC/wchar.cpp @@ -531,6 +531,23 @@ int wcwidth(wchar_t wc) return 1; } +// https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcswidth.html +int wcswidth(wchar_t const* pwcs, size_t n) +{ + int len = 0; + + for (size_t i = 0; i < n && pwcs[i]; i++) { + int char_len = wcwidth(pwcs[i]); + + if (char_len == -1) + return -1; + + len += char_len; + } + + return len; +} + // https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcsnrtombs.html size_t wcsnrtombs(char* dest, wchar_t const** src, size_t nwc, size_t len, mbstate_t* ps) { diff --git a/Userland/Libraries/LibC/wchar.h b/Userland/Libraries/LibC/wchar.h index 7f38900b95dafe..909b3b8aa278b2 100644 --- a/Userland/Libraries/LibC/wchar.h +++ b/Userland/Libraries/LibC/wchar.h @@ -63,6 +63,7 @@ float wcstof(wchar_t const*, wchar_t**); double wcstod(wchar_t const*, wchar_t**); long double wcstold(wchar_t const*, wchar_t**); int wcwidth(wchar_t); +int wcswidth(wchar_t const*, size_t); size_t wcsrtombs(char*, wchar_t const**, size_t, mbstate_t*); size_t mbsrtowcs(wchar_t*, char const**, size_t, mbstate_t*); int wmemcmp(wchar_t const*, wchar_t const*, size_t);