20#pragma GCC diagnostic push
21#pragma GCC diagnostic ignored "-Wexit-time-destructors"
27 using langid = LANGID;
29 using langid = uint16_t;
32 constexpr langid langid_unknown = 127;
42 langid langid_from_rfc1766(_In_z_
const char *rfc1766)
44 return LANGIDFROMLCID(LocaleNameToLCID(str2wstr(rfc1766, langid::utf8).c_str(), 0));
54 langid langid_from_rfc1766(_In_z_
const wchar_t *rfc1766)
56 return LANGIDFROMLCID(LocaleNameToLCID(rfc1766, 0));
66 inline langid langid_from_rfc1766(_In_z_
const char *rfc1766)
70 bool operator()(_In_z_
const char *str1, _In_z_
const char *str2)
const
76 auto a = stdex::tolower(str1[i]);
77 auto b = stdex::tolower(str2[i]);
78 auto a_end = !a || stdex::ispunct(a);
79 auto b_end = !b || stdex::ispunct(b);
80 if (a_end && b_end)
return false;
81 if (b_end || a > b)
return false;
82 if (a_end || a < b)
return true;
86 struct language_mapping
89 std::map<const char *, langid, stricmp_less> sublanguages;
91 static const std::map<const char *, language_mapping, stricmp_less> languages = {
261 if (
auto el = languages.find(rfc1766); el != languages.end()) {
262 if (!el->second.sublanguages.empty()) {
263 if (
auto n = stdex::strlen(el->first); ispunct(rfc1766[n])) {
265 if (
auto el_sub = el->second.sublanguages.find(&rfc1766[n]); el_sub != el->second.sublanguages.end())
266 return el_sub->second;
269 return el->second.id;
271 return langid_unknown;
277#pragma GCC diagnostic pop