00001
00002
00003
00004
00005
00006
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 }
00205 }
00206 }
00207
00208 #endif
00209