PT-Cooling-Log 1.0
PTCoolingLogViewer
|
00001 #include "Switch.hh" 00002 #include "ArgParser.hh" 00003 #include "Usage.hh" 00004 00005 #include <list> 00006 #include <iomanip> 00007 #include <iostream> 00008 00009 using namespace std; 00010 00011 Switch::Switch() : map< string, ArgParser* > () { 00012 Switch& sw = *this; 00013 sw[ "help" ] = new Usage( this ); 00014 sw[ "Help" ] = sw[ "help" ]; 00015 sw[ "HELP" ] = sw[ "help" ]; 00016 sw[ "?" ] = sw[ "help" ]; 00017 00018 } 00019 00020 Switch::~Switch(){ 00021 // delete all parser object 00022 list< ArgParser* > buff; 00023 for( Switch::iterator itr = this->begin(); itr != this->end(); itr++ ){ 00024 if( itr->second != NULL ) buff.push_back( itr->second ); 00025 } 00026 buff.sort(); 00027 buff.unique(); 00028 for( list< ArgParser* >::iterator itr = buff.begin(); 00029 itr != buff.end(); itr++ ) 00030 delete (*itr); 00031 00032 } 00033 00034 vector< string > Switch::divide( const std::string& argv ){ 00035 static string lOpt( "--" ); 00036 vector< string > data( 0 ); 00037 if( argv.substr( 0, lOpt.size() ) != lOpt ) return data; 00038 int sep = argv.find( "=" ); 00039 data.resize( 2, "" ); 00040 if( sep == string::npos ){ 00041 data[ 0 ] = argv.substr( 2 ); 00042 } else { 00043 data[ 0 ] = argv.substr( 2, sep - 2 ); 00044 data[ 1 ] = argv.substr( sep + 1 ); 00045 } 00046 return data; 00047 } 00048 00049 bool Switch::parse( const vector< string >& argList ){ 00050 for( int i = 0; i < argList.size(); i++ ){ 00051 vector< string > d = this->divide( argList[ i ] ); 00052 if( d.size() == 0 ) continue; 00053 Switch::iterator itr = this->find( d[ 0 ] ); 00054 if( itr == this->end() ) { 00055 00056 continue; 00057 } 00058 if( ! ( *( itr->second ) )( d[ 1 ] ) ) return false; 00059 } 00060 return true; 00061 } 00062