/
zOMGdev
/
cppcms
Обзор
Документация
Войти
/
zOMGdev
/
cppcms
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
booster/lib/locale/src/win32/converter.cpp
106 строк
3 KB
Artyom Beilis
Line up with Boost.Locale
27 фев 2011, 00:51
27 фев 2011, 00:51
dd27fe3
Код
Авторство
О чём код?
// // 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 BOOSTER_SOURCE #include <locale> #include <booster/backtrace.h> #include <booster/locale/generator.h> #include <booster/locale/conversion.h> #include <booster/locale/encoding.h> #include <vector> #include <string.h> #include "api.h" #include "all_generator.h" namespace booster { namespace locale { namespace impl_win { class utf16_converter : public converter<wchar_t> { public: utf16_converter(winlocale const &lc,size_t refs = 0) : converter<wchar_t>(refs), lc_(lc) { } virtual std::wstring convert(converter_base::conversion_type how,wchar_t const *begin,wchar_t const *end,int flags = 0) const { switch(how) { case converter_base::upper_case: return towupper_l(begin,end,lc_); case converter_base::lower_case: return towlower_l(begin,end,lc_); case converter_base::case_folding: return wcsfold(begin,end); case converter_base::normalization: return wcsnormalize(static_cast<norm_type>(flags),begin,end); default: return std::wstring(begin,end-begin); } } private: winlocale lc_; }; class utf8_converter : public converter<char> { public: utf8_converter(winlocale const &lc,size_t refs = 0) : converter<char>(refs), lc_(lc) { } virtual std::string convert(converter_base::conversion_type how,char const *begin,char const *end,int flags = 0) const { std::wstring tmp = conv::to_utf<wchar_t>(begin,end,"UTF-8"); wchar_t const *wb=tmp.c_str(); wchar_t const *we=wb+tmp.size(); std::wstring res; switch(how) { case upper_case: res = towupper_l(wb,we,lc_); break; case lower_case: res = towlower_l(wb,we,lc_); break; case case_folding: res = wcsfold(wb,we); break; case normalization: res = wcsnormalize(static_cast<norm_type>(flags),wb,we); break; default: res = tmp; // make gcc happy } return conv::from_utf(res,"UTF-8"); } private: winlocale lc_; }; std::locale create_convert( std::locale const &in, winlocale const &lc, character_facet_type type) { switch(type) { case char_facet: return std::locale(in,new utf8_converter(lc)); case wchar_t_facet: return std::locale(in,new utf16_converter(lc)); default: return in; } } } // namespace impl_win32 } // locale } // boost // vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4