Ticket #7788: locale_data.patch

File locale_data.patch, 5.6 KB (added by anonymous, 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 {  
    1515namespace util {
    1616    void locale_data::parse(std::string const &locale_name)
    1717    {
    18         language = "C";
     18        language.clear();
    1919        country.clear();
     20        encoding.clear();
    2021        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            }
    8741        }
    88         encoding = tmp;
     42       
     43        if(!language.length())
     44            language = "C";
     45       
     46        if(!encoding.length())
     47            encoding = "us-ascii";
    8948       
    9049        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         }
    10750    }
    10851
    10952} // 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()  
    5454        TEST(std::use_facet<boost::locale::info>(l).language()=="en");
    5555        TEST(std::use_facet<boost::locale::info>(l).country()=="US");
    5656        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");
    5858
    5959        l=g("en_US.UTF-8");
    6060        TEST(std::use_facet<boost::locale::info>(l).language()=="en");
    int main()  
    6565        TEST(std::use_facet<boost::locale::info>(l).language()=="en");
    6666        TEST(std::use_facet<boost::locale::info>(l).country()=="US");
    6767        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");
    6969
    7070        l=g("en_US.ISO8859-1");
    7171        TEST(std::use_facet<boost::locale::info>(l).language()=="en");
    7272        TEST(std::use_facet<boost::locale::info>(l).country()=="US");
    7373        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");
    7575
    7676        std::locale l_wt(std::locale::classic(),new test_facet);
    7777