diff --git a/src/highlighters.cc b/src/highlighters.cc index 52db836d..bcab234e 100644 --- a/src/highlighters.cc +++ b/src/highlighters.cc @@ -884,7 +884,7 @@ void expand_unprintable(const Context& context, HighlightFlags flags, DisplayBuf { auto coord = it.coord(); Codepoint cp = utf8::read_codepoint(it, end); - if (cp != '\n' and not iswprint(cp)) + if (cp != '\n' and not std::isprint((wchar_t)cp, std::locale{})) { if (coord != atom_it->begin()) atom_it = ++line.split(atom_it, coord); diff --git a/src/ranked_match.cc b/src/ranked_match.cc index 89eb2c85..6aa89e52 100644 --- a/src/ranked_match.cc +++ b/src/ranked_match.cc @@ -34,6 +34,7 @@ using Utf8It = utf8::iterator; static int count_word_boundaries_match(StringView candidate, StringView query) { + std::locale locale; int count = 0; Utf8It query_it{query.begin(), query}; Codepoint prev = 0; @@ -41,8 +42,10 @@ static int count_word_boundaries_match(StringView candidate, StringView query) { const Codepoint c = *it; const bool is_word_boundary = prev == 0 or - (!iswalnum(prev) and iswalnum(c)) or - (islower(prev) and isupper(c)); + (!std::isalnum((wchar_t)prev, locale) and + std::isalnum((wchar_t)c, locale)) or + (std::islower((wchar_t)prev, locale) and + std::isupper((wchar_t)c, locale)); prev = c; if (not is_word_boundary) diff --git a/src/unicode.hh b/src/unicode.hh index 9b65e265..83c63fa1 100644 --- a/src/unicode.hh +++ b/src/unicode.hh @@ -2,6 +2,7 @@ #define unicode_hh_INCLUDED #include +#include namespace Kakoune { @@ -28,7 +29,7 @@ enum WordType { Word, WORD }; template inline bool is_word(Codepoint c) { - return c == '_' or iswalnum(c); + return c == '_' or std::isalnum((wchar_t)c, std::locale{}); } template<> @@ -67,8 +68,8 @@ inline CharCategories categorize(Codepoint c) return CharCategories::Punctuation; } -inline Codepoint to_lower(Codepoint cp) { return towlower((wchar_t)cp); } -inline Codepoint to_upper(Codepoint cp) { return towupper((wchar_t)cp); } +inline Codepoint to_lower(Codepoint cp) { return std::tolower((wchar_t)cp, std::locale{}); } +inline Codepoint to_upper(Codepoint cp) { return std::toupper((wchar_t)cp, std::locale{}); } inline char to_lower(char c) { return c >= 'A' and c <= 'Z' ? c - 'A' + 'a' : c; } inline char to_upper(char c) { return c >= 'a' and c <= 'z' ? c - 'a' + 'A' : c; }