TDbiCfg Class Reference

Some utility functions for working with configurations. More...

#include <TDbiCfg.hxx>

List of all members.

Static Public Member Functions

static void TDbiRegistryToString (std::string &s, const TDbiRegistry &r)
static void StringToTDbiRegistry (TDbiRegistry &r, const char *s)

Private Member Functions

 TDbiCfg ()

Detailed Description

Some utility functions for working with configurations.

messier@huhepl.harvard.edu

Definition at line 23 of file TDbiCfg.hxx.


Constructor & Destructor Documentation

TDbiCfg::TDbiCfg (  )  [private]

Member Function Documentation

void TDbiCfg::StringToTDbiRegistry ( TDbiRegistry r,
const char *  s 
) [static]

Definition at line 55 of file TDbiCfg.cxx.

References UtilString::atob(), UtilString::IsBool(), UtilString::IsFloat(), UtilString::IsInt(), and TDbiRegistry::Set().

Referenced by TDbiCfgConfigurable::Set().

00056 {
00057 //======================================================================
00058 // Convert the string s to a TDbiRegistry. Format of s is:
00059 //
00060 // toggle=on pdq=true a=1 b=2.0 name=Mark longstring='some long text' 
00061 //
00062 //======================================================================
00063   // Parse string out into keys and values
00064   int len = strlen(s);
00065   char *scopy = new char[len+1];
00066   strcpy(scopy,s);
00067   
00068   // Skip ahead until we find an equal sign
00069   char* cKey   = 0;
00070   char* cEqual = 0;
00071   char* cValue = 0;
00072   char* cEnd   = 0;
00073   for (int i=0; i<len; ++i) {
00074     // Pick off the equal sign...
00075     if (scopy[i] == '=') {
00076       cEqual = scopy+i;
00077       *cEqual = '\0';
00078       
00079       // Step back to find the start of the key
00080       for (cKey=cEqual-1; *cKey==' ' && cKey>scopy; --cKey) *cKey = '\0';
00081       for (; *cKey!=' ' && *cKey!=',' && *cKey!='\0' && cKey>scopy; --cKey);
00082       for (; *cKey==' ' || *cKey=='\0'; ++cKey);
00083 
00084       // Step forward to get the start of the value
00085       for (cValue=cEqual+1; *cValue==' '&&*cValue!='\0'; ++cValue) {
00086         *cValue = '\0';
00087       }
00088       while (*cValue==' ') ++cValue;
00089       
00090       // Handle special case of long strings in single or double quotes
00091       bool isString = false;
00092       if (*cValue=='\'' || *cValue=='\"') {
00093         isString = true;
00094         char stringDelim = *cValue;
00095         ++cValue;
00096         for (cEnd = cValue; *cEnd!='\0' && *cEnd!=stringDelim; ++cEnd);
00097       }
00098       else {
00099         for (cEnd = cValue; *cEnd!='\0'&& *cEnd!=' '&& *cEnd!=','; ++cEnd);
00100       }
00101       *cEnd = '\0';
00102 
00103       // Convert value to correct data type
00104       if ( isString ) {
00105         r.Set(cKey,cValue);
00106       }
00107       else if (UtilString::IsInt(cValue)) {
00108         int i = atoi(cValue);
00109         r.Set(cKey,i);
00110       }
00111       else if (UtilString::IsFloat(cValue)) {
00112         double d = atof(cValue);
00113         r.Set(cKey,d);
00114       }
00115       else if (UtilString::IsBool(cValue)) {
00116         bool b = UtilString::atob(cValue);
00117         r.Set(cKey,b);
00118       }
00119       else {
00120         // Single character stored at char
00121         if (strlen(cValue)==1) { 
00122           char c = *cValue; 
00123           r.Set(cKey,c); 
00124         }
00125         else {
00126           // Longer string stored as string
00127           r.Set(cKey,cValue);
00128         }
00129       }
00130     }
00131     cEqual = cEnd+1;
00132   }
00133 
00134   delete [] scopy;
00135 }

Here is the call graph for this function:

Here is the caller graph for this function:

void TDbiCfg::TDbiRegistryToString ( std::string &  s,
const TDbiRegistry r 
) [static]

Definition at line 19 of file TDbiCfg.cxx.

References TDbiRegistry::Get(), and TDbiRegistry::Key().

00020 {
00021 //======================================================================
00022 // Convert the TDbiRegistry r to a string dump
00023 //======================================================================
00024   TDbiRegistry::TDbiRegistryKey rk = r.Key();
00025   const char* s;
00026 
00027   std::ostringstream ss;
00028   while ( (s=rk()) ) {
00029     // Try to extract the value for this key
00030     char        c   = 0;
00031     const char* cs  = 0;
00032     int         i   = 0;
00033     double      d   = 0;
00034     TDbiRegistry    reg;
00035     bool isChar     = r.Get(s,c);
00036     bool isCharStar = r.Get(s,cs);
00037     bool isInt      = r.Get(s,i);
00038     bool isDouble   = r.Get(s,d);
00039     bool isTDbiRegistry = r.Get(s,reg);
00040 
00041     ss << s << "=";
00042     if      (isChar)     { ss << c;  }
00043     else if (isCharStar) { ss << "'"<<cs<<"'"; }
00044     else if (isInt)      { ss << i;  }
00045     else if (isDouble)   { ss << d; if (rint(d)==d) ss << ".0"; }
00046     else if (isTDbiRegistry) { ss << reg; } // Don't think this works...
00047     else assert("Unknown type or bad key in registry"==0);
00048     ss << " ";
00049   }
00050   x = ss.str();
00051 }

Here is the call graph for this function:


The documentation for this class was generated from the following files:

Generated on 11 Aug 2013 for SKDatabase by  doxygen 1.6.1