/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ #include #include #include #include #include #include #include #include "base/StringUtil.h" #include "base/FileParser.h" using namespace std; template class commandArg { public: commandArg() {} commandArg(string name, string descrip) { mName = name; mDesc = descrip; mHasDefault = false; mHasValue = false; } commandArg(string name,string descrip,argType T) { mName = name; mDesc = descrip; mValue = T; mHasDefault = true; mHasValue = true; } void SetValue(argType &T) { mValue = T; mHasValue=true; } void SetDefault(argType &T) { mValue = T; mHasDefault = true; } void SetDescription(string d) { mDesc = d; } bool HasDefault() { return mHasDefault; } bool HasValue() { return mHasValue; } argType GetValue() { return mValue; } string GetName() const { return mName; } string GetDescription() { return mDesc; } friend bool operator< (const commandArg &lhs, const commandArg &rhs) { if ( lhs.GetName() < rhs.GetName() ) return true; return false; } string GetType() { string type = typeid(*this).name(); if ( type.find("Ib") != string::npos ) return "bool"; else if ( type.find("Ii") != string::npos ) return "int"; else if ( type.find("Id") != string::npos ) return "double"; else if ( type.find("ISs") != string::npos ) return "string"; else if (type.find("IlE") != string::npos ) return "long"; else { std::cerr << "*** unknown type for [" << type << "]" << endl; return "unknown type"; } } private: string mName, mDesc; argType mValue; bool mHasDefault, mHasValue; }; class commandLineParser { public: commandLineParser(int argc, char** argv, const string & description = "") { mArgc = argc; mArgv = argv; mDesc = description; mNumDefaults = 0; mNumArgs = 0; } void SetDescription(const string & s) { mDesc = s; } private: int mArgc; char** mArgv; stringstream mHelp; string mDesc; int mNumDefaults,mNumArgs; multimap mNameVal; set mArgNames, mCArgNames; public: template void registerArg(commandArg &arg) { if ( mHelp.str().empty() ) mHelp << "\n"; mHelp << string(arg.GetName() + "<" + arg.GetType() + "> : " + arg.GetDescription() ); if ( arg.HasDefault() ) { mHelp << " (def="; ostringstream o; o << arg.GetValue() ; mHelp << o.str() << ")"; ++mNumDefaults; } mHelp << "\n" << ends; mArgNames.insert(arg.GetName()); ++mNumArgs; } template void registerCompoundArg(commandArg &arg) { if ( mHelp.str().empty() ) mHelp << "\n"; mHelp << string(arg.GetName() + "<" + arg.GetType() + "> : " + arg.GetDescription() ); if ( arg.HasDefault() ) { mHelp << " (def="; ostringstream o; o << arg.GetValue() ; mHelp << o.str() << ")"; ++mNumDefaults; } mHelp << "\n" << ends; mCArgNames.insert(arg.GetName()); ++mNumArgs; } bool parse() { if ( mArgc == 1 && mNumArgs != mNumDefaults) { showHelp(); exit(-1); } if ( requestHelp() ) { showHelp(); exit(-1); } if ( mArgNames.empty() ) { showHelp(); exit(-1); } int i(1); while ( i::iterator sIter = mArgNames.find(n); if ( sIter == mArgNames.end() ) { sIter = mCArgNames.find(n); if (sIter==mCArgNames.end()) { if (n == "-print-command-line") { cout << "----------------------- Welcome to Trinity -------------------------------" << endl; cout << "This module was invoked via:" << endl; for (int k=0; k1) is_float = sp.IsFloat(1); if (ContainsAt(n,targ,0) && is_float) { mNameVal.insert(make_pair(n,v)); i+=2; } else if ( ContainsAt(n,targ,0) && !ContainsAt(v,targ,0) ) { mNameVal.insert(make_pair(n,v)); i+=2; } else if ( ContainsAt(n,targ,0) && ContainsAt(v,targ,0) ) { v=""; mNameVal.insert(make_pair(n,v)); i+=1; } else { i+=1; } } else { for (int k=0; k string GetStringValueFor(commandArg &keyArg) { string key(keyArg.GetName()); map::iterator mIter = mNameVal.find(key); if ( mIter == mNameVal.end() ) { ostringstream o; o << keyArg.GetValue(); if ( keyArg.GetType() == "string" ) { if ( !keyArg.HasDefault() ) { cout << "need to specify " << key << endl; exit(-1); } return (o.str()); } return (string("")); } return (mIter->second); } template vector GetCompoundStringValuesFor(commandArg &keyArg) { vector dummy; string key(keyArg.GetName()); pair::iterator,multimap::iterator> mIter = mNameVal.equal_range(key); if ( mIter.first == mIter.second) { ostringstream o; o << keyArg.GetValue(); if ( keyArg.GetType() == "string" ) { if ( !keyArg.HasDefault() ) { cout << "need to specify " << key << endl; exit(-1); } dummy.push_back(o.str()); return (dummy); } return (dummy); } for (; mIter.first != mIter.second; ++mIter.first) dummy.push_back(mIter.first->second); return dummy; } double GetDoubleValueFor(commandArg &keyArg) { string key(keyArg.GetName()); string val = GetStringValueFor(keyArg); if ( val.empty() ) { if (!keyArg.HasDefault() ) { cout << "need to specify " << key << endl; exit(-1); } else return ( keyArg.GetValue() ); } else { // if ( !val.IsDouble() ) // { // cout << "invalid: " << key <<" "<< val << endl; // exit(-1); // } // else return (atof(val.c_str())); } } int GetIntValueFor(commandArg &keyArg) { string key(keyArg.GetName()); string val = GetStringValueFor(keyArg); if ( val.empty() ) { if (!keyArg.HasDefault() ) { cout << "need to specify " << key << endl; exit(-1); } else return ( keyArg.GetValue() ); } else { // if ( !val.IsInt() ) // { // cout << "invalid: " << key <<" "<< val << endl; // exit(-1); // } // else return (atoi(val.c_str())); } } int GetLongValueFor(commandArg &keyArg) { string key(keyArg.GetName()); string val = GetStringValueFor(keyArg); if ( val.empty() ) { if (!keyArg.HasDefault() ) { cout << "need to specify " << key << endl; exit(-1); } else return ( keyArg.GetValue() ); } else { // if ( !val.IsInt() ) // { // cout << "invalid: " << key <<" "<< val << endl; // exit(-1); // } // else return (atol(val.c_str())); } } bool GetBoolValueFor(commandArg &keyArg) { string key(keyArg.GetName()); map::iterator mIter = mNameVal.find(key); if ( mIter == mNameVal.end() ) { if ( keyArg.HasDefault() ) { return keyArg.GetValue(); } else { cout << "need to specify " << key << endl; exit(-1); } } else return true; } bool requestHelp() { for ( int i=1; i