From 9eab8b69dd242c9a40afa09371bcd7ebe9ab62b0 Mon Sep 17 00:00:00 2001 From: staviq Date: Thu, 19 Oct 2023 21:29:35 +0200 Subject: [PATCH 1/8] fix getwchar failing when LC_ALL undefined --- common/console.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/common/console.cpp b/common/console.cpp index f65cbc6ed..5c9302170 100644 --- a/common/console.cpp +++ b/common/console.cpp @@ -111,7 +111,16 @@ namespace console { } } - setlocale(LC_ALL, ""); + auto locale = setlocale(LC_ALL, ""); + auto lang = getenv("LANG"); + + if (locale == nullptr) { + if (lang != nullptr) { + setlocale(LC_ALL, lang); + } else{ + setlocale(LC_ALL, "C.UTF-8"); + } + } #endif } From 5616b439df2ff4ddf5f9d81447523c4ead51a317 Mon Sep 17 00:00:00 2001 From: staviq Date: Thu, 19 Oct 2023 21:49:09 +0200 Subject: [PATCH 2/8] fmt --- common/console.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/console.cpp b/common/console.cpp index 5c9302170..21c62924c 100644 --- a/common/console.cpp +++ b/common/console.cpp @@ -113,7 +113,7 @@ namespace console { auto locale = setlocale(LC_ALL, ""); auto lang = getenv("LANG"); - + if (locale == nullptr) { if (lang != nullptr) { setlocale(LC_ALL, lang); From 1e328f43f76bb68e8b16381d725c02cbdf7c7c89 Mon Sep 17 00:00:00 2001 From: staviq Date: Fri, 20 Oct 2023 04:03:22 +0200 Subject: [PATCH 3/8] fix non-utf locale --- common/console.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/common/console.cpp b/common/console.cpp index 21c62924c..6046b1bfa 100644 --- a/common/console.cpp +++ b/common/console.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #endif #define ANSI_COLOR_RED "\x1b[31m" @@ -115,7 +116,7 @@ namespace console { auto lang = getenv("LANG"); if (locale == nullptr) { - if (lang != nullptr) { + if (lang != nullptr && strcmp(lang, "C") && strcasestr(lang, "utf-8")) { setlocale(LC_ALL, lang); } else{ setlocale(LC_ALL, "C.UTF-8"); From 1ad52242273e4cc7161a2211ff9fca0e80655290 Mon Sep 17 00:00:00 2001 From: staviq Date: Fri, 20 Oct 2023 04:16:49 +0200 Subject: [PATCH 4/8] fix non-utf locale 2 --- common/console.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/common/console.cpp b/common/console.cpp index 6046b1bfa..f3b6ec54b 100644 --- a/common/console.cpp +++ b/common/console.cpp @@ -113,10 +113,10 @@ namespace console { } auto locale = setlocale(LC_ALL, ""); - auto lang = getenv("LANG"); - if (locale == nullptr) { - if (lang != nullptr && strcmp(lang, "C") && strcasestr(lang, "utf-8")) { + if (locale == nullptr || !strcmp(locale, "C") || strcasestr(locale, "utf-8") == nullptr) { + auto lang = getenv("LANG"); + if (lang != nullptr && strcmp(lang, "C") && strcasestr(lang, "utf-8") != nullptr) { setlocale(LC_ALL, lang); } else{ setlocale(LC_ALL, "C.UTF-8"); From a72c053f0cbb626d6a171c708033b87fb0e94363 Mon Sep 17 00:00:00 2001 From: staviq Date: Fri, 20 Oct 2023 03:04:23 +0000 Subject: [PATCH 5/8] Update common/console.cpp Co-authored-by: cebtenzzre --- common/console.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/console.cpp b/common/console.cpp index f3b6ec54b..932131f4f 100644 --- a/common/console.cpp +++ b/common/console.cpp @@ -118,7 +118,7 @@ namespace console { auto lang = getenv("LANG"); if (lang != nullptr && strcmp(lang, "C") && strcasestr(lang, "utf-8") != nullptr) { setlocale(LC_ALL, lang); - } else{ + } else { setlocale(LC_ALL, "C.UTF-8"); } } From 8396208c0025f847a8b9e8ea417a5ea029df7b8d Mon Sep 17 00:00:00 2001 From: staviq Date: Fri, 20 Oct 2023 05:15:40 +0200 Subject: [PATCH 6/8] remove redundant C locale check --- common/console.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common/console.cpp b/common/console.cpp index 932131f4f..c4dd27c37 100644 --- a/common/console.cpp +++ b/common/console.cpp @@ -114,9 +114,9 @@ namespace console { auto locale = setlocale(LC_ALL, ""); - if (locale == nullptr || !strcmp(locale, "C") || strcasestr(locale, "utf-8") == nullptr) { + if (locale == nullptr || strcasestr(locale, "utf-8") == nullptr) { auto lang = getenv("LANG"); - if (lang != nullptr && strcmp(lang, "C") && strcasestr(lang, "utf-8") != nullptr) { + if (lang != nullptr && strcasestr(lang, "utf-8") != nullptr) { setlocale(LC_ALL, lang); } else { setlocale(LC_ALL, "C.UTF-8"); From 226ed5f291ed621c9a2be6c769162fd3a21bbddc Mon Sep 17 00:00:00 2001 From: staviq Date: Fri, 20 Oct 2023 21:19:44 +0200 Subject: [PATCH 7/8] fix empty str vs nullptr for setlocale and getenv --- common/console.cpp | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/common/console.cpp b/common/console.cpp index c4dd27c37..ec192ae63 100644 --- a/common/console.cpp +++ b/common/console.cpp @@ -53,6 +53,19 @@ namespace console { static termios initial_state; #endif + static bool locale_isvalid( const char * l ) + { + return !(l == nullptr || l[0] == '\0' || (strcasestr(l, "utf-8") == nullptr && strcasestr(l, "utf8") == nullptr)); + } + + static bool locale_setverify( int c, const char * l ) + { + setlocale(c, l); + auto locale = setlocale(c, nullptr); + + return !strcmp( l, locale ); + } + // // Init and cleanup // @@ -112,16 +125,18 @@ namespace console { } } - auto locale = setlocale(LC_ALL, ""); + setlocale(LC_ALL, ""); + auto locale = setlocale(LC_ALL, nullptr); - if (locale == nullptr || strcasestr(locale, "utf-8") == nullptr) { + if (!locale_isvalid(locale)) { auto lang = getenv("LANG"); - if (lang != nullptr && strcasestr(lang, "utf-8") != nullptr) { - setlocale(LC_ALL, lang); - } else { - setlocale(LC_ALL, "C.UTF-8"); + if (!locale_isvalid(lang) || !locale_setverify(LC_ALL, lang)) { + locale_setverify(LC_ALL, "C.UTF-8") || locale_setverify(LC_ALL, "C.utf8") || setlocale(LC_ALL, ""); } } + + auto usedlocale = setlocale(LC_ALL, nullptr); + fprintf(stderr,"Console: using '%s' locale.\n", usedlocale); #endif } From 6d126d0accfe1fe1020b9029016818451db49853 Mon Sep 17 00:00:00 2001 From: staviq Date: Fri, 20 Oct 2023 21:26:07 +0200 Subject: [PATCH 8/8] fix win --- common/console.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/common/console.cpp b/common/console.cpp index ec192ae63..a2f201ee3 100644 --- a/common/console.cpp +++ b/common/console.cpp @@ -53,6 +53,7 @@ namespace console { static termios initial_state; #endif +#if !defined(_WIN32) static bool locale_isvalid( const char * l ) { return !(l == nullptr || l[0] == '\0' || (strcasestr(l, "utf-8") == nullptr && strcasestr(l, "utf8") == nullptr)); @@ -65,6 +66,7 @@ namespace console { return !strcmp( l, locale ); } +#endif // // Init and cleanup