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.
This commit is contained in:
Dirk-Jan C. Binnema 2022-05-17 22:31:03 +03:00
parent 7f8260d5ed
commit c4cc9795dc
2 changed files with 25 additions and 15 deletions

View File

@ -19,6 +19,7 @@
#ifndef _XOPEN_SOURCE
#define _XOPEN_SOURCE
#include <stdexcept>
#endif /*_XOPEN_SOURCE*/
#include <array>
@ -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;
}

View File

@ -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 <auto fn>