From c4cc9795dcf7ecac318dd00f7704fb4e45fd8174 Mon Sep 17 00:00:00 2001 From: "Dirk-Jan C. Binnema" Date: Tue, 17 May 2022 22:31:03 +0300 Subject: [PATCH] utils: add locale_workaround Attempt to work around some locale handling throwing in some systems. "locale::facet::_S_create_c_locale name not valid" Ugly, but maybe it helps. --- lib/utils/mu-utils.cc | 19 +++++++++++++++++++ lib/utils/mu-utils.hh | 21 ++++++--------------- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/lib/utils/mu-utils.cc b/lib/utils/mu-utils.cc index 0cc34a50..28abc43e 100644 --- a/lib/utils/mu-utils.cc +++ b/lib/utils/mu-utils.cc @@ -19,6 +19,7 @@ #ifndef _XOPEN_SOURCE #define _XOPEN_SOURCE +#include #endif /*_XOPEN_SOURCE*/ #include @@ -606,3 +607,21 @@ Mu::TempDir::~TempDir() g_debug("removed '%s'", path_.c_str()); } + +bool +Mu::locale_workaround() +{ + // quite horrible... but some systems break otherwise with + // https://github.com/djcb/mu/issues/2252 + + for (auto&& loc : {"", "en_US.UTF-8", "C" }) { + try { + std::locale::global(std::locale(loc)); + return true; + } catch (const std::runtime_error& re) { + continue; + } + } + + return false; +} diff --git a/lib/utils/mu-utils.hh b/lib/utils/mu-utils.hh index 95d6d82f..8018a495 100644 --- a/lib/utils/mu-utils.hh +++ b/lib/utils/mu-utils.hh @@ -147,22 +147,13 @@ std::string date_to_time_t_string(int64_t t); std::string time_to_string(const std::string& frm, time_t t, bool utc = false) G_GNUC_CONST; -// /** -// * Create a std::string by consuming a gchar* array; this takes ownership -// * of str which should no longer be used. -// * -// * @param str a gchar* or NULL (latter taken as "") -// * -// * @return a std::string -// */ -// static inline std::string -// from_gchars(gchar*&& str) -// { -// std::string s{str ? str : ""}; -// g_free(str); +/** + * Hack to avoid locale crashes + * + * @return true if setting locale worked; false otherwise + */ +bool locale_workaround(); -// return s; -// } // https://stackoverflow.com/questions/19053351/how-do-i-use-a-custom-deleter-with-a-stdunique-ptr-member template