--- /dev/null
+/* $Id$
+
+This file is part of libmspstrings
+Copyright © 2006-2008 Mikko Rasa
+Distributed under the LGPL
+*/
+
+#include <msp/core/except.h>
+#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