X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Fstrings%2Ffmt.cpp;fp=source%2Fstrings%2Ffmt.cpp;h=e06f71ab456f40d55825345ea413bc6981d10dd6;hp=0000000000000000000000000000000000000000;hb=b42ed73a1b241c0e93ee03c43c4584b41c549bac;hpb=5b1368cb791cab043f0435628cacbaff36e39b7b diff --git a/source/strings/fmt.cpp b/source/strings/fmt.cpp new file mode 100644 index 0000000..e06f71a --- /dev/null +++ b/source/strings/fmt.cpp @@ -0,0 +1,127 @@ +/* $Id$ + +This file is part of libmspstrings +Copyright © 2006-2008 Mikko Rasa +Distributed under the LGPL +*/ + +#include +#include "fmt.h" + +using namespace std; + +namespace Msp { + +void Fmt::parse(const char *f) +{ + if(*f=='%') ++f; + + for(; *f; ++f) + { + if(*f=='#') + { + sbase = true; + spoint = true; + } + else if(*f=='0') + fillc = '0'; + else if(*f=='-') + align = LEFT; + else if(*f=='+') + spos = true; + else + break; + } + + wd = 0; + for(; *f; ++f) + { + if(*f>='0' && *f<='9') + wd = wd*10+(*f-'0'); + else + break; + } + + if(*f=='.') + { + ++f; + prec = 0; + for(; *f; ++f) + { + if(*f>='0' && *f<='9') + prec = prec*10+(*f-'0'); + else + break; + } + } + + type = NUM; + if(*f=='d' || *f=='u') + base = DEC; + else if(*f=='x' || *f=='X') + base = HEX; + else if(*f=='o') + base = OCT; + else if(*f=='b') + base = BIN; + else if(*f=='e' || *f=='E') + fmode = SCI; + else if(*f=='f' || *f=='F') + fmode = FIXED; + else if(*f=='g' || *f=='G') + fmode = AUTOFLT; + else if(*f=='p' || *f=='P') + { + base = HEX; + sbase = true; + } + else if(*f=='c') + type = CHAR; + else if(*f=='s') + type = STR; + else if(*f=='i') + base = AUTOBASE; + else + throw InvalidParameterValue("Invalid conversion specifier"); + + if(*f=='E' || *f=='F' || *f=='G' || *f=='X' || *f=='P') + ucase = true; + + ++f; + + if(*f) + throw InvalidParameterValue("Extra characters in conversion specification"); +} + +Fmt &Fmt::reset() +{ + wd = 0; + prec = 6; + spos = false; + fillc = ' '; + base = DEC; + sbase = false; + fmode = AUTOFLT; + spoint = false; + align = RIGHT; + ucase = false; + type = STR; + + return *this; +} + +void Fmt::apply(ostream &out) const +{ + out.flags(((base==HEX) ? ios_base::hex : (base==OCT) ? ios_base::oct : ios_base::dec) + | ((fmode==SCI) ? ios_base::scientific : (fmode==FIXED) ? ios_base::fixed : ios_base::fmtflags(0)) + | (fillc=='0' ? ios_base::internal : (align==LEFT) ? ios_base::left : ios_base::right) + | (sbase ? ios_base::showbase : ios_base::fmtflags(0)) + | (spoint ? ios_base::showpoint : ios_base::fmtflags(0)) + | (spos ? ios_base::showpos : ios_base::fmtflags(0)) + | (ucase ? ios_base::uppercase : ios_base::fmtflags(0))); + out.fill(fillc); + out.width(wd); + out.precision(prec); +} + +} // namespace Msp