Ticket #7788: locale_data.patch
File locale_data.patch, 5.6 KB (added by , 10 years ago) |
---|
-
libs/locale/src/util/locale_data.cpp
commit 09ea966593100e1d4731766f50fcc9629e74f1e7 Author: Jookia <166291@gmail.com> Date: Wed Dec 12 02:57:47 2012 +1100 Simplied locale_data::parse. diff --git a/libs/locale/src/util/locale_data.cpp b/libs/locale/src/util/locale_data.cpp index b4598a0..1012a7b 100644
a b namespace locale { 15 15 namespace util { 16 16 void locale_data::parse(std::string const &locale_name) 17 17 { 18 language = "C";18 language.clear(); 19 19 country.clear(); 20 encoding.clear(); 20 21 variant.clear(); 21 encoding = "us-ascii"; 22 utf8=false; 23 parse_from_lang(locale_name); 24 } 25 26 void locale_data::parse_from_lang(std::string const &locale_name) 27 { 28 size_t end = locale_name.find_first_of("-_@."); 29 std::string tmp = locale_name.substr(0,end); 30 if(tmp.empty()) 31 return; 32 for(unsigned i=0;i<tmp.size();i++) { 33 if('A' <= tmp[i] && tmp[i]<='Z') 34 tmp[i]=tmp[i]-'A'+'a'; 35 else if(tmp[i] < 'a' && 'z' < tmp[i]) 36 return; 37 } 38 language = tmp; 39 if(end >= locale_name.size()) 40 return; 41 42 if(locale_name[end] == '-' || locale_name[end]=='_') { 43 parse_from_country(locale_name.substr(end+1)); 44 } 45 else if(locale_name[end] == '.') { 46 parse_from_encoding(locale_name.substr(end+1)); 47 } 48 else if(locale_name[end] == '@') { 49 parse_from_variant(locale_name.substr(end+1)); 50 } 51 } 52 53 void locale_data::parse_from_country(std::string const &locale_name) 54 { 55 size_t end = locale_name.find_first_of("@."); 56 std::string tmp = locale_name.substr(0,end); 57 if(tmp.empty()) 58 return; 59 for(unsigned i=0;i<tmp.size();i++) { 60 if('a' <= tmp[i] && tmp[i]<='a') 61 tmp[i]=tmp[i]-'a'+'A'; 62 else if(tmp[i] < 'A' && 'Z' < tmp[i]) 63 return; 64 } 65 66 country = tmp; 67 68 if(end >= locale_name.size()) 69 return; 70 else if(locale_name[end] == '.') { 71 parse_from_encoding(locale_name.substr(end+1)); 72 } 73 else if(locale_name[end] == '@') { 74 parse_from_variant(locale_name.substr(end+1)); 75 } 76 } 77 78 void locale_data::parse_from_encoding(std::string const &locale_name) 79 { 80 size_t end = locale_name.find_first_of("@"); 81 std::string tmp = locale_name.substr(0,end); 82 if(tmp.empty()) 83 return; 84 for(unsigned i=0;i<tmp.size();i++) { 85 if('A' <= tmp[i] && tmp[i]<='Z') 86 tmp[i]=tmp[i]-'A'+'a'; 22 23 std::string* section = &language; 24 for(std::string::const_iterator c = locale_name.begin(); c != locale_name.end(); ++c) 25 { 26 switch(*c) 27 { 28 case '_': 29 section = &country; 30 break; 31 case '.': 32 section = &encoding; 33 break; 34 case '@': 35 section = &variant; 36 break; 37 default: 38 *section += *c; 39 break; 40 } 87 41 } 88 encoding = tmp; 42 43 if(!language.length()) 44 language = "C"; 45 46 if(!encoding.length()) 47 encoding = "us-ascii"; 89 48 90 49 utf8 = conv::impl::normalize_encoding(encoding.c_str()) == "utf8"; 91 92 if(end >= locale_name.size())93 return;94 95 if(locale_name[end] == '@') {96 parse_from_variant(locale_name.substr(end+1));97 }98 }99 100 void locale_data::parse_from_variant(std::string const &locale_name)101 {102 variant = locale_name;103 for(unsigned i=0;i<variant.size();i++) {104 if('A' <= variant[i] && variant[i]<='Z')105 variant[i]=variant[i]-'A'+'a';106 }107 50 } 108 51 109 52 } // util -
libs/locale/test/test_generator.cpp
diff --git a/libs/locale/test/test_generator.cpp b/libs/locale/test/test_generator.cpp index dde1610..b3be4d5 100644
a b int main() 54 54 TEST(std::use_facet<boost::locale::info>(l).language()=="en"); 55 55 TEST(std::use_facet<boost::locale::info>(l).country()=="US"); 56 56 TEST(!std::use_facet<boost::locale::info>(l).utf8()); 57 TEST(std::use_facet<boost::locale::info>(l).encoding()==" iso8859-1");57 TEST(std::use_facet<boost::locale::info>(l).encoding()=="ISO8859-1"); 58 58 59 59 l=g("en_US.UTF-8"); 60 60 TEST(std::use_facet<boost::locale::info>(l).language()=="en"); … … int main() 65 65 TEST(std::use_facet<boost::locale::info>(l).language()=="en"); 66 66 TEST(std::use_facet<boost::locale::info>(l).country()=="US"); 67 67 TEST(!std::use_facet<boost::locale::info>(l).utf8()); 68 TEST(std::use_facet<boost::locale::info>(l).encoding()==" iso8859-1");68 TEST(std::use_facet<boost::locale::info>(l).encoding()=="ISO8859-1"); 69 69 70 70 l=g("en_US.ISO8859-1"); 71 71 TEST(std::use_facet<boost::locale::info>(l).language()=="en"); 72 72 TEST(std::use_facet<boost::locale::info>(l).country()=="US"); 73 73 TEST(!std::use_facet<boost::locale::info>(l).utf8()); 74 TEST(std::use_facet<boost::locale::info>(l).encoding()==" iso8859-1");74 TEST(std::use_facet<boost::locale::info>(l).encoding()=="ISO8859-1"); 75 75 76 76 std::locale l_wt(std::locale::classic(),new test_facet); 77 77