CppCMS
|
00001 // 00002 // Copyright (c) 2009-2011 Artyom Beilis (Tonkikh) 00003 // 00004 // Distributed under the Boost Software License, Version 1.0. (See 00005 // accompanying file LICENSE_1_0.txt or copy at 00006 // http://www.boost.org/LICENSE_1_0.txt) 00007 // 00008 #ifndef BOOSTER_LOCALE_UTIL_HPP 00009 #define BOOSTER_LOCALE_UTIL_HPP 00010 #include <locale> 00011 #include <typeinfo> 00012 #include <booster/cstdint.h> 00013 #include <booster/locale/utf.h> 00014 #include <booster/locale/generator.h> 00015 #include <booster/assert.h> 00016 00017 #include <vector> 00018 namespace booster { 00019 namespace locale { 00024 namespace util { 00025 00039 BOOSTER_API 00040 std::string get_system_locale(bool use_utf8_on_windows = false); 00041 00059 BOOSTER_API 00060 std::locale create_info(std::locale const &in,std::string const &name); 00061 00062 00077 class base_converter { 00078 public: 00079 00085 static const uint32_t illegal=utf::illegal; 00086 00091 static const uint32_t incomplete=utf::incomplete; 00092 00093 virtual ~base_converter() 00094 { 00095 } 00100 virtual int max_len() const 00101 { 00102 return 1; 00103 } 00113 virtual bool is_thread_safe() const 00114 { 00115 return false; 00116 } 00120 virtual base_converter *clone() const 00121 { 00122 BOOSTER_ASSERT(typeid(*this)==typeid(base_converter)); 00123 return new base_converter(); 00124 } 00125 00141 virtual uint32_t to_unicode(char const *&begin,char const *end) 00142 { 00143 if(begin == end) 00144 return incomplete; 00145 unsigned char cp = *begin; 00146 if(cp <= 0x7F) { 00147 begin++; 00148 return cp; 00149 } 00150 return illegal; 00151 } 00163 00164 virtual uint32_t from_unicode(uint32_t u,char *begin,char const *end) 00165 { 00166 if(begin==end) 00167 return incomplete; 00168 if(u >= 0x80) 00169 return illegal; 00170 *begin = static_cast<char>(u); 00171 return 1; 00172 } 00173 }; 00174 00179 BOOSTER_API std::auto_ptr<base_converter> create_utf8_converter(); 00187 BOOSTER_API std::auto_ptr<base_converter> create_simple_converter(std::string const &encoding); 00188 00189 00201 BOOSTER_API 00202 std::locale create_codecvt(std::locale const &in,std::auto_ptr<base_converter> cvt,character_facet_type type); 00203 00204 } // util 00205 } // locale 00206 } // boost 00207 00208 #endif 00209 // vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4