]> git.tdb.fi Git - libs/core.git/blobdiff - source/strings/fmt.cpp
Move files around to prepare for assimilation into core
[libs/core.git] / source / strings / fmt.cpp
diff --git a/source/strings/fmt.cpp b/source/strings/fmt.cpp
new file mode 100644 (file)
index 0000000..e06f71a
--- /dev/null
@@ -0,0 +1,127 @@
+/* $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