diff options
author | bugaevskiy <bugaevskiy@yandex-team.com> | 2022-08-27 20:34:27 +0300 |
---|---|---|
committer | bugaevskiy <bugaevskiy@yandex-team.com> | 2022-08-27 20:34:27 +0300 |
commit | dcd162d17ea67f882241f0b66c320823b419a241 (patch) | |
tree | f4a5c8682bf58d99ee36c866f4055445a40dfe55 /contrib/restricted/boost/locale/src/std/std_backend.cpp | |
parent | d73f961c8cd08879c326e00192e378a6ffa72321 (diff) | |
download | ydb-dcd162d17ea67f882241f0b66c320823b419a241.tar.gz |
Reimport boost/locale as a separate project
Diffstat (limited to 'contrib/restricted/boost/locale/src/std/std_backend.cpp')
-rw-r--r-- | contrib/restricted/boost/locale/src/std/std_backend.cpp | 234 |
1 files changed, 234 insertions, 0 deletions
diff --git a/contrib/restricted/boost/locale/src/std/std_backend.cpp b/contrib/restricted/boost/locale/src/std/std_backend.cpp new file mode 100644 index 00000000000..f9afcb417e9 --- /dev/null +++ b/contrib/restricted/boost/locale/src/std/std_backend.cpp @@ -0,0 +1,234 @@ +// +// Copyright (c) 2009-2011 Artyom Beilis (Tonkikh) +// +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +#define BOOST_LOCALE_SOURCE +#include <boost/locale/localization_backend.hpp> +#include <boost/locale/gnu_gettext.hpp> +#include "all_generator.hpp" +#include "../util/locale_data.hpp" +#include "../util/gregorian.hpp" +#include <boost/locale/util.hpp> +#include <algorithm> +#include <iterator> + +#if defined(BOOST_WINDOWS) +# ifndef NOMINMAX +# define NOMINMAX +# endif +# include <windows.h> +# include "../encoding/conv.hpp" +# include "../win32/lcid.hpp" +#endif + +#include "std_backend.hpp" + +namespace boost { +namespace locale { +namespace impl_std { + + class std_localization_backend : public localization_backend { + public: + std_localization_backend() : + invalid_(true), + use_ansi_encoding_(false) + { + } + std_localization_backend(std_localization_backend const &other) : + localization_backend(), + paths_(other.paths_), + domains_(other.domains_), + locale_id_(other.locale_id_), + invalid_(true), + use_ansi_encoding_(other.use_ansi_encoding_) + { + } + virtual std_localization_backend *clone() const + { + return new std_localization_backend(*this); + } + + void set_option(std::string const &name,std::string const &value) + { + invalid_ = true; + if(name=="locale") + locale_id_ = value; + else if(name=="message_path") + paths_.push_back(value); + else if(name=="message_application") + domains_.push_back(value); + else if(name=="use_ansi_encoding") + use_ansi_encoding_ = value == "true"; + + } + void clear_options() + { + invalid_ = true; + use_ansi_encoding_ = false; + locale_id_.clear(); + paths_.clear(); + domains_.clear(); + } + + void prepare_data() + { + if(!invalid_) + return; + invalid_ = false; + std::string lid=locale_id_; + if(lid.empty()) { + bool use_utf8 = ! use_ansi_encoding_; + lid = util::get_system_locale(use_utf8); + } + in_use_id_ = lid; + data_.parse(lid); + name_ = "C"; + utf_mode_ = utf8_none; + + #if defined(BOOST_WINDOWS) + std::pair<std::string,int> wl_inf = to_windows_name(lid); + std::string win_name = wl_inf.first; + int win_codepage = wl_inf.second; + #endif + + if(!data_.utf8) { + if(loadable(lid)) { + name_ = lid; + utf_mode_ = utf8_none; + } + #if defined(BOOST_WINDOWS) + else if(loadable(win_name) + && win_codepage == conv::impl::encoding_to_windows_codepage(data_.encoding.c_str())) + { + name_ = win_name; + utf_mode_ = utf8_none; + } + #endif + } + else { + if(loadable(lid)) { + name_ = lid; + utf_mode_ = utf8_native_with_wide; + } + #if defined(BOOST_WINDOWS) + else if(loadable(win_name)) { + name_ = win_name; + utf_mode_ = utf8_from_wide; + } + #endif + } + } + + #if defined(BOOST_WINDOWS) + std::pair<std::string,int> to_windows_name(std::string const &l) + { + std::pair<std::string,int> res("C",0); + unsigned lcid = impl_win::locale_to_lcid(l); + char win_lang[256] = {0}; + char win_country[256] = {0}; + char win_codepage[10] = {0}; + if(GetLocaleInfoA(lcid,LOCALE_SENGLANGUAGE,win_lang,sizeof(win_lang))==0) + return res; + std::string lc_name = win_lang; + if(GetLocaleInfoA(lcid,LOCALE_SENGCOUNTRY,win_country,sizeof(win_country))!=0) { + lc_name += "_"; + lc_name += win_country; + } + + res.first = lc_name; + + if(GetLocaleInfoA(lcid,LOCALE_IDEFAULTANSICODEPAGE,win_codepage,sizeof(win_codepage))!=0) + res.second = atoi(win_codepage); + return res; + } + #endif + + bool loadable(std::string name) + { + try { + std::locale l(name.c_str()); + return true; + } + catch(std::exception const &/*e*/) { + return false; + } + } + + virtual std::locale install(std::locale const &base, + locale_category_type category, + character_facet_type type = nochar_facet) + { + prepare_data(); + + switch(category) { + case convert_facet: + return create_convert(base,name_,type,utf_mode_); + case collation_facet: + return create_collate(base,name_,type,utf_mode_); + case formatting_facet: + return create_formatting(base,name_,type,utf_mode_); + case parsing_facet: + return create_parsing(base,name_,type,utf_mode_); + case codepage_facet: + return create_codecvt(base,name_,type,utf_mode_); + case calendar_facet: + return util::install_gregorian_calendar(base,data_.country); + case message_facet: + { + gnu_gettext::messages_info minf; + minf.language = data_.language; + minf.country = data_.country; + minf.variant = data_.variant; + minf.encoding = data_.encoding; + std::copy(domains_.begin(),domains_.end(),std::back_inserter<gnu_gettext::messages_info::domains_type>(minf.domains)); + minf.paths = paths_; + switch(type) { + case char_facet: + return std::locale(base,gnu_gettext::create_messages_facet<char>(minf)); + case wchar_t_facet: + return std::locale(base,gnu_gettext::create_messages_facet<wchar_t>(minf)); + #ifdef BOOST_LOCALE_ENABLE_CHAR16_T + case char16_t_facet: + return std::locale(base,gnu_gettext::create_messages_facet<char16_t>(minf)); + #endif + #ifdef BOOST_LOCALE_ENABLE_CHAR32_T + case char32_t_facet: + return std::locale(base,gnu_gettext::create_messages_facet<char32_t>(minf)); + #endif + default: + return base; + } + } + case information_facet: + return util::create_info(base,in_use_id_); + default: + return base; + } + } + + private: + + std::vector<std::string> paths_; + std::vector<std::string> domains_; + std::string locale_id_; + + util::locale_data data_; + std::string name_; + std::string in_use_id_; + utf8_support utf_mode_; + bool invalid_; + bool use_ansi_encoding_; + }; + + localization_backend *create_localization_backend() + { + return new std_localization_backend(); + } + +} // impl icu +} // locale +} // boost +// vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 |