MsgFormat.cxx

Go to the documentation of this file.
00001 ////////////////////////////////////////////////////////////////////////
00002 // $Id: MsgFormat.cxx,v 1.1 2011/01/18 05:49:19 finch Exp $
00003 //
00004 // MsgFormat
00005 //
00006 // This implements the format classes as found in Stroustrup's book
00007 //
00008 // messier@huhepl.harvard.edu
00009 ////////////////////////////////////////////////////////////////////////
00010 #include <MsgFormat.h>
00011 #include <cstdlib>
00012 #include <iostream>
00013 #include <iomanip>
00014 #include <MsgBoundFormat.h>
00015 
00016 using namespace std;
00017 
00018 //......................................................................
00019 
00020 ostream& operator<<(ostream& os, const MsgBoundFormat& bf) 
00021 {
00022 //======================================================================
00023 // Purpose: Print a value with the given format
00024 //
00025 // Inputs: os - the stream to print to
00026 //         bf - the value and format to print
00027 //
00028 // Returns: the stream printed to
00029 //======================================================================
00030   int p = os.precision();
00031   MsgFormat::fmtflags f = 
00032     os.setf(bf.f.fmt,static_cast<MsgFormat::fmtflags>(0xFFFF));
00033   char c = os.fill();
00034 
00035   if (bf.f.flc != c) os.fill(bf.f.flc);
00036 
00037   if ((bf.f.fmt&ios::hex) || (bf.f.fmt&ios::oct)) {
00038     os.setf(bf.f.fmt, ios::basefield);
00039     os << setprecision(bf.f.prc) << setw(bf.f.wdt) << (int)bf.val;
00040   }
00041   else {
00042     os << setprecision(bf.f.prc) << setw(bf.f.wdt) << bf.val;
00043   }
00044 
00045   // Reset stream
00046   if (c != os.fill()) os.fill(c);  
00047   os.precision(p); 
00048   os.flags(f);
00049   return os;
00050 }
00051 
00052 //......................................................................
00053 
00054 MsgFormat::MsgFormat(const char* f) 
00055 {
00056 //======================================================================
00057 // Purpose: Create a message format using given formatting flags
00058 //
00059 // Inputs: f - format string a la printf (see man format)
00060 //======================================================================
00061   int i, j=0, k=0;
00062   char c, n[2][16];
00063   prc = 6;
00064   wdt = 0;
00065   fmt = static_cast<fmtflags>(0);
00066   flc = ' ';
00067   for (i=0; f[i] != '\0'; ++i) {
00068     switch(c = f[i]) {
00069     case '-': fmt |= ios::left; break;
00070     case '+': fmt |= ios::showpos; break;
00071     case ' ': break;
00072     case 'O': flc = '0'; fmt |= ios::left; break;
00073     case 'd': break;
00074     case 'u': break;
00075     case 'i': break;
00076     case 'o': fmt |= ios::oct; fmt |= ios::showbase; break;
00077     case 'x': fmt |= ios::hex; fmt |= ios::showbase; break;
00078     case 'X': fmt |= ios::hex; fmt |= ios::showbase; break;
00079     case 'f': fmt |= ios::fixed; break;
00080     case 'e': fmt |= ios::scientific; break;
00081     case 'E': fmt |= ios::scientific; break;
00082     case 'g': break;
00083     case 'G': break;
00084     default:
00085       if (c == '.') {
00086         n[j][k] = '\0';
00087         ++j;
00088         k = 0;
00089       }
00090       else {
00091         if (c >= '0' && c <= '9') n[j][k++] = c;
00092       }
00093       break;
00094     }
00095   }
00096   if (k!=0 || j!=0) {
00097     if (j==0) n[0][k] = '\0';
00098     wdt = atoi(n[0]);
00099   }
00100   if (j>0) {
00101     n[1][k] = '\0'; 
00102     prc = atoi(n[1]); 
00103   }
00104 }

Generated on 11 Aug 2013 for SKDatabase by  doxygen 1.6.1