blob: 839ee5222606780532bc8540e792512760b0a747 [file] [log] [blame]
//
// Copyright (c) 2009-2011 Artyom Beilis (Tonkikh)
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
//
#define BOOST_LOCALE_SOURCE
#include <boost/locale/format.hpp>
#include <boost/locale/generator.hpp>
#include <boost/locale/info.hpp>
#include <limits>
#include <stdlib.h>
#include <iostream>
namespace boost {
namespace locale {
namespace details {
struct format_parser::data {
unsigned position;
std::streamsize precision;
std::ios_base::fmtflags flags;
ios_info info;
std::locale saved_locale;
bool restore_locale;
void *cookie;
void (*imbuer)(void *,std::locale const &);
};
format_parser::format_parser(std::ios_base &ios,void *cookie,void (*imbuer)(void *,std::locale const &)) :
ios_(ios),
d(new data)
{
d->position=std::numeric_limits<unsigned>::max();
d->precision=ios.precision();
d->flags = ios.flags();
d->info=ios_info::get(ios);
d->saved_locale = ios.getloc();
d->restore_locale=false;
d->cookie = cookie;
d->imbuer = imbuer;
}
void format_parser::imbue(std::locale const &l)
{
d->imbuer(d->cookie,l);
}
format_parser::~format_parser()
{
}
void format_parser::restore()
{
ios_info::get(ios_) = d->info;
ios_.width(0);
ios_.flags(d->flags);
if(d->restore_locale)
imbue(d->saved_locale);
}
unsigned format_parser::get_position()
{
return d->position;
}
void format_parser::set_one_flag(std::string const &key,std::string const &value)
{
if(key.empty())
return;
unsigned i;
for(i=0;i<key.size();i++) {
if(key[i] < '0' || '9'< key[i])
break;
}
if(i==key.size()) {
d->position=atoi(key.c_str()) - 1;
return;
}
if(key=="num" || key=="number") {
as::number(ios_);
if(value=="hex")
ios_.setf(std::ios_base::hex,std::ios_base::basefield);
else if(value=="oct")
ios_.setf(std::ios_base::oct,std::ios_base::basefield);
else if(value=="sci" || value=="scientific")
ios_.setf(std::ios_base::scientific,std::ios_base::floatfield);
else if(value=="fix" || value=="fixed")
ios_.setf(std::ios_base::fixed,std::ios_base::floatfield);
}
else if(key=="cur" || key=="currency") {
as::currency(ios_);
if(value=="iso")
as::currency_iso(ios_);
else if(value=="nat" || value=="national")
as::currency_national(ios_);
}
else if(key=="per" || key=="percent") {
as::percent(ios_);
}
else if(key=="date") {
as::date(ios_);
if(value=="s" || value=="short")
as::date_short(ios_);
else if(value=="m" || value=="medium")
as::date_medium(ios_);
else if(value=="l" || value=="long")
as::date_long(ios_);
else if(value=="f" || value=="full")
as::date_full(ios_);
}
else if(key=="time") {
as::time(ios_);
if(value=="s" || value=="short")
as::time_short(ios_);
else if(value=="m" || value=="medium")
as::time_medium(ios_);
else if(value=="l" || value=="long")
as::time_long(ios_);
else if(value=="f" || value=="full")
as::time_full(ios_);
}
else if(key=="dt" || key=="datetime") {
as::datetime(ios_);
if(value=="s" || value=="short") {
as::date_short(ios_);
as::time_short(ios_);
}
else if(value=="m" || value=="medium") {
as::date_medium(ios_);
as::time_medium(ios_);
}
else if(value=="l" || value=="long") {
as::date_long(ios_);
as::time_long(ios_);
}
else if(value=="f" || value=="full") {
as::date_full(ios_);
as::time_full(ios_);
}
}
else if(key=="spell" || key=="spellout") {
as::spellout(ios_);
}
else if(key=="ord" || key=="ordinal") {
as::ordinal(ios_);
}
else if(key=="left" || key=="<")
ios_.setf(std::ios_base::left,std::ios_base::adjustfield);
else if(key=="right" || key==">")
ios_.setf(std::ios_base::right,std::ios_base::adjustfield);
else if(key=="gmt")
as::gmt(ios_);
else if(key=="local")
as::local_time(ios_);
else if(key=="timezone" || key=="tz")
ios_info::get(ios_).time_zone(value);
else if(key=="w" || key=="width")
ios_.width(atoi(value.c_str()));
else if(key=="p" || key=="precision")
ios_.precision(atoi(value.c_str()));
else if(key=="locale") {
if(!d->restore_locale) {
d->saved_locale=ios_.getloc();
d->restore_locale=true;
}
std::string encoding=std::use_facet<info>(d->saved_locale).encoding();
generator gen;
gen.categories(formatting_facet);
std::locale new_loc;
if(value.find('.')==std::string::npos)
new_loc = gen(value + "." + encoding);
else
new_loc = gen(value);
imbue(new_loc);
}
}
}
}
}
// vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4