From 52b52dd277c756ce46bc22eb08981ef9b4449453 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 12 Sep 2018 20:37:12 +0200 Subject: [PATCH 1/1] util/LocaleString: add IsIncompleteCharMB() --- src/util/LocaleString.cxx | 8 ++++++++ src/util/LocaleString.hxx | 7 +++++++ src/wreadln.cxx | 18 +----------------- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/util/LocaleString.cxx b/src/util/LocaleString.cxx index 733b1598..438bc022 100644 --- a/src/util/LocaleString.cxx +++ b/src/util/LocaleString.cxx @@ -33,6 +33,14 @@ #include +bool +IsIncompleteCharMB(const char *s, size_t n) +{ + auto mb = std::mbstate_t(); + const std::size_t length = std::mbrlen(s, n, &mb); + return length == std::size_t(-2); +} + std::size_t CharSizeMB(const char *s, size_t n) { diff --git a/src/util/LocaleString.hxx b/src/util/LocaleString.hxx index 7f1c0100..92f3a016 100644 --- a/src/util/LocaleString.hxx +++ b/src/util/LocaleString.hxx @@ -34,6 +34,13 @@ #include +/** + * Is the given character incomplete? + */ +gcc_pure +bool +IsIncompleteCharMB(const char *s, size_t n); + /** * Wrapper for std::mbrlen() which attempts to recover with a best * effort from invalid or incomplete sequences. diff --git a/src/wreadln.cxx b/src/wreadln.cxx index 0bafd366..8855ed6c 100644 --- a/src/wreadln.cxx +++ b/src/wreadln.cxx @@ -31,7 +31,6 @@ #include #include #include -#include #if (defined(HAVE_CURSES_ENHANCED) || defined(ENABLE_MULTIBYTE)) && !defined(_WIN32) #include @@ -207,21 +206,6 @@ static inline void drawline(const struct wreadln *wr) doupdate(); } -#if (defined(HAVE_CURSES_ENHANCED) || defined(ENABLE_MULTIBYTE)) && !defined(_WIN32) -static bool -multibyte_is_complete(const char *p, size_t length) -{ - char *q = g_locale_to_utf8(p, length, - nullptr, nullptr, nullptr); - if (q != nullptr) { - g_free(q); - return true; - } else { - return false; - } -} -#endif - static void wreadln_insert_byte(struct wreadln *wr, int key) { @@ -237,7 +221,7 @@ wreadln_insert_byte(struct wreadln *wr, int key) /* wide version: try to complete the multibyte sequence */ while (length < sizeof(buffer)) { - if (multibyte_is_complete(buffer, length)) + if (!IsIncompleteCharMB(buffer, length)) /* sequence is complete */ break; -- 2.20.1