]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/locale/src/shared/format.cpp
2 // Copyright (c) 2009-2011 Artyom Beilis (Tonkikh)
4 // Distributed under the Boost Software License, Version 1.0. (See
5 // accompanying file LICENSE_1_0.txt or copy at
6 // http://www.boost.org/LICENSE_1_0.txt)
8 #define BOOST_LOCALE_SOURCE
9 #include <boost/locale/format.hpp>
10 #include <boost/locale/generator.hpp>
11 #include <boost/locale/info.hpp>
20 struct format_parser::data
{
22 std::streamsize precision
;
23 std::ios_base::fmtflags flags
;
25 std::locale saved_locale
;
28 void (*imbuer
)(void *,std::locale
const &);
31 format_parser::format_parser(std::ios_base
&ios
,void *cookie
,void (*imbuer
)(void *,std::locale
const &)) :
35 d
->position
=std::numeric_limits
<unsigned>::max();
36 d
->precision
=ios
.precision();
37 d
->flags
= ios
.flags();
38 d
->info
=ios_info::get(ios
);
39 d
->saved_locale
= ios
.getloc();
40 d
->restore_locale
=false;
45 void format_parser::imbue(std::locale
const &l
)
47 d
->imbuer(d
->cookie
,l
);
50 format_parser::~format_parser()
54 void format_parser::restore()
56 ios_info::get(ios_
) = d
->info
;
60 imbue(d
->saved_locale
);
63 unsigned format_parser::get_position()
68 void format_parser::set_one_flag(std::string
const &key
,std::string
const &value
)
73 for(i
=0;i
<key
.size();i
++) {
74 if(key
[i
] < '0' || '9'< key
[i
])
78 d
->position
=atoi(key
.c_str()) - 1;
82 if(key
=="num" || key
=="number") {
86 ios_
.setf(std::ios_base::hex
,std::ios_base::basefield
);
88 ios_
.setf(std::ios_base::oct
,std::ios_base::basefield
);
89 else if(value
=="sci" || value
=="scientific")
90 ios_
.setf(std::ios_base::scientific
,std::ios_base::floatfield
);
91 else if(value
=="fix" || value
=="fixed")
92 ios_
.setf(std::ios_base::fixed
,std::ios_base::floatfield
);
94 else if(key
=="cur" || key
=="currency") {
97 as::currency_iso(ios_
);
98 else if(value
=="nat" || value
=="national")
99 as::currency_national(ios_
);
101 else if(key
=="per" || key
=="percent") {
104 else if(key
=="date") {
106 if(value
=="s" || value
=="short")
107 as::date_short(ios_
);
108 else if(value
=="m" || value
=="medium")
109 as::date_medium(ios_
);
110 else if(value
=="l" || value
=="long")
112 else if(value
=="f" || value
=="full")
115 else if(key
=="time") {
117 if(value
=="s" || value
=="short")
118 as::time_short(ios_
);
119 else if(value
=="m" || value
=="medium")
120 as::time_medium(ios_
);
121 else if(value
=="l" || value
=="long")
123 else if(value
=="f" || value
=="full")
126 else if(key
=="dt" || key
=="datetime") {
128 if(value
=="s" || value
=="short") {
129 as::date_short(ios_
);
130 as::time_short(ios_
);
132 else if(value
=="m" || value
=="medium") {
133 as::date_medium(ios_
);
134 as::time_medium(ios_
);
136 else if(value
=="l" || value
=="long") {
140 else if(value
=="f" || value
=="full") {
145 else if(key
=="spell" || key
=="spellout") {
148 else if(key
=="ord" || key
=="ordinal") {
151 else if(key
=="left" || key
=="<")
152 ios_
.setf(std::ios_base::left
,std::ios_base::adjustfield
);
153 else if(key
=="right" || key
==">")
154 ios_
.setf(std::ios_base::right
,std::ios_base::adjustfield
);
157 else if(key
=="local")
158 as::local_time(ios_
);
159 else if(key
=="timezone" || key
=="tz")
160 ios_info::get(ios_
).time_zone(value
);
161 else if(key
=="w" || key
=="width")
162 ios_
.width(atoi(value
.c_str()));
163 else if(key
=="p" || key
=="precision")
164 ios_
.precision(atoi(value
.c_str()));
165 else if(key
=="locale") {
166 if(!d
->restore_locale
) {
167 d
->saved_locale
=ios_
.getloc();
168 d
->restore_locale
=true;
171 std::string encoding
=std::use_facet
<info
>(d
->saved_locale
).encoding();
173 gen
.categories(formatting_facet
);
176 if(value
.find('.')==std::string::npos
)
177 new_loc
= gen(value
+ "." + encoding
);
179 new_loc
= gen(value
);
188 // vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4