159599516SKenneth E. Jansen #include <stdio.h> 259599516SKenneth E. Jansen #include <fstream> 359599516SKenneth E. Jansen #include "Input.h" 459599516SKenneth E. Jansen #include "ValType.h" 559599516SKenneth E. Jansen #include <stdexcept> 61bfea438SCameron Smith #include <sstream> 759599516SKenneth E. Jansen //MR CHANGE 859599516SKenneth E. Jansen #include <cstdlib> 959599516SKenneth E. Jansen //MR CHANGE END 1059599516SKenneth E. Jansen 1159599516SKenneth E. Jansen // return a given key value (if it's in the map) 12*9ae91bddSCameron Smith ValType phSolver::Input::GetValue(const string &str) const 1359599516SKenneth E. Jansen { 1459599516SKenneth E. Jansen if (input_map->find(str) != input_map->end()) { 1559599516SKenneth E. Jansen if ( (*input_map)[str] == "NODEFAULT" ) { 161bfea438SCameron Smith stringstream ost; 1759599516SKenneth E. Jansen ost << "required input variable not set: " << str << ends; 1859599516SKenneth E. Jansen throw invalid_argument( ost.str() ); 1959599516SKenneth E. Jansen } 2059599516SKenneth E. Jansen } else { 211bfea438SCameron Smith stringstream ost; 2259599516SKenneth E. Jansen ost << "required input variable not set: " << str << ends; 2359599516SKenneth E. Jansen throw invalid_argument( ost.str() ); 2459599516SKenneth E. Jansen } 2559599516SKenneth E. Jansen 2659599516SKenneth E. Jansen return ValType( (*input_map)[str] ); 2759599516SKenneth E. Jansen } 2859599516SKenneth E. Jansen 29*9ae91bddSCameron Smith const char* phSolver::Input::GetUserFileName() { 30*9ae91bddSCameron Smith return userConfFileName.c_str(); 31*9ae91bddSCameron Smith } 3259599516SKenneth E. Jansen 33*9ae91bddSCameron Smith const char* phSolver::Input::GetDefaultFileName() { 34*9ae91bddSCameron Smith return defaultConfFileName.c_str(); 35*9ae91bddSCameron Smith } 36*9ae91bddSCameron Smith 37*9ae91bddSCameron Smith phSolver::Input::Input(const string &fname, const string &default_fname) 38*9ae91bddSCameron Smith : userConfFileName(fname), defaultConfFileName(default_fname) 3959599516SKenneth E. Jansen { 4059599516SKenneth E. Jansen // open the input file 4159599516SKenneth E. Jansen ifstream infile( fname.c_str(), ios::in); 4259599516SKenneth E. Jansen 4359599516SKenneth E. Jansen if(!infile || infile.eof()){ 4459599516SKenneth E. Jansen cerr<<" Input file does not exist or is empty or perhaps you forgot mpirun? "<<endl; 4559599516SKenneth E. Jansen exit(-2); 4659599516SKenneth E. Jansen } 4759599516SKenneth E. Jansen 4859599516SKenneth E. Jansen // allocate memory 4959599516SKenneth E. Jansen input_text = new vector<string>; 5059599516SKenneth E. Jansen input_map = new map<string,string>; 5159599516SKenneth E. Jansen 5259599516SKenneth E. Jansen // get the lines of text from the input file 5359599516SKenneth E. Jansen get_input_lines(input_text, infile); 5459599516SKenneth E. Jansen build_map(input_map, input_text); 5559599516SKenneth E. Jansen 5659599516SKenneth E. Jansen // build and merge with default map ( if desired ) 5759599516SKenneth E. Jansen if (!default_fname.empty()) { 5859599516SKenneth E. Jansen ifstream infile2( default_fname.c_str(), ios::in); 5959599516SKenneth E. Jansen 6059599516SKenneth E. Jansen map<string,string> *default_map = new map<string,string>; 6159599516SKenneth E. Jansen vector<string> *default_text = new vector<string>; 6259599516SKenneth E. Jansen 6359599516SKenneth E. Jansen get_input_lines(default_text, infile2); 6459599516SKenneth E. Jansen build_map(default_map, default_text); 6559599516SKenneth E. Jansen 6659599516SKenneth E. Jansen // merge the two maps 6759599516SKenneth E. Jansen map<string,string>::const_iterator iter = default_map->begin(); 6859599516SKenneth E. Jansen for ( ; iter != default_map->end(); ++iter ) { 6959599516SKenneth E. Jansen string defkey = iter->first; 7059599516SKenneth E. Jansen string defval = iter->second; 7159599516SKenneth E. Jansen if ( input_map->find(defkey) == input_map->end() ) { 7259599516SKenneth E. Jansen (*input_map)[defkey] = defval; 7359599516SKenneth E. Jansen } 7459599516SKenneth E. Jansen } 7559599516SKenneth E. Jansen infile2.close(); 7659599516SKenneth E. Jansen 7759599516SKenneth E. Jansen delete default_map; 7859599516SKenneth E. Jansen delete default_text; 7959599516SKenneth E. Jansen 8059599516SKenneth E. Jansen } else { 8159599516SKenneth E. Jansen cerr << "Input warning: no input.config file found." << endl; 8259599516SKenneth E. Jansen cerr << "Get one from source directory." << endl; 8359599516SKenneth E. Jansen exit(-2); 8459599516SKenneth E. Jansen } 8559599516SKenneth E. Jansen 8659599516SKenneth E. Jansen infile.close(); 8759599516SKenneth E. Jansen 8859599516SKenneth E. Jansen } 8959599516SKenneth E. Jansen 90*9ae91bddSCameron Smith phSolver::Input::~Input() 9159599516SKenneth E. Jansen { 9259599516SKenneth E. Jansen delete input_text; 9359599516SKenneth E. Jansen delete input_map; 9459599516SKenneth E. Jansen } 9559599516SKenneth E. Jansen 9659599516SKenneth E. Jansen 9759599516SKenneth E. Jansen // return the input map 98*9ae91bddSCameron Smith map<string,string> phSolver::Input::InputMap() const 9959599516SKenneth E. Jansen { 10059599516SKenneth E. Jansen return *input_map; 10159599516SKenneth E. Jansen } 10259599516SKenneth E. Jansen 10359599516SKenneth E. Jansen // echo the entire map 104*9ae91bddSCameron Smith void phSolver::Input::EchoInputMap(const ostream &ofile) 10559599516SKenneth E. Jansen { 10659599516SKenneth E. Jansen map<string,string>::const_iterator iter = input_map->begin(); 10759599516SKenneth E. Jansen for ( ; iter != input_map->end(); ++iter ) { 10859599516SKenneth E. Jansen cout << "Keyphrase: " << iter->first << endl 10959599516SKenneth E. Jansen << "Keyvalue: " << iter->second << endl << endl; 11059599516SKenneth E. Jansen } 11159599516SKenneth E. Jansen } 11259599516SKenneth E. Jansen 11359599516SKenneth E. Jansen // read the input text from the given stream 114*9ae91bddSCameron Smith void phSolver::Input::get_input_lines(vector<string> *text, ifstream &infile) 11559599516SKenneth E. Jansen { 11659599516SKenneth E. Jansen string textline; 11759599516SKenneth E. Jansen while ( getline( infile, textline, '\n' ) ) { 11859599516SKenneth E. Jansen // ignore everything on a comment line 11959599516SKenneth E. Jansen if ( textline[0] != '#' ) { 12059599516SKenneth E. Jansen text->push_back( textline ); 12159599516SKenneth E. Jansen } 12259599516SKenneth E. Jansen } 12359599516SKenneth E. Jansen } 12459599516SKenneth E. Jansen 12559599516SKenneth E. Jansen 12659599516SKenneth E. Jansen // 127*9ae91bddSCameron Smith void phSolver::Input::build_map(map<string,string> *inmap, 12859599516SKenneth E. Jansen vector<string> *intext) 12959599516SKenneth E. Jansen { 13059599516SKenneth E. Jansen // iterate through input_text of text and separate at :'s 13159599516SKenneth E. Jansen for (int i = 0 ; i < intext->size(); i++) { 13259599516SKenneth E. Jansen string textlineALL = (*intext)[i]; 13359599516SKenneth E. Jansen string textline; 13459599516SKenneth E. Jansen int pos = 0; 13559599516SKenneth E. Jansen 13659599516SKenneth E. Jansen // modification introduced so that comments starting midway in a file 13759599516SKenneth E. Jansen // can be handled. 13859599516SKenneth E. Jansen 13959599516SKenneth E. Jansen if ( (pos = textlineALL.find_first_of( '#',pos)) != string::npos) { 14059599516SKenneth E. Jansen textline = textlineALL.substr(0,pos); 14159599516SKenneth E. Jansen }else { 14259599516SKenneth E. Jansen textline = textlineALL; 14359599516SKenneth E. Jansen } 14459599516SKenneth E. Jansen pos = 0; 14559599516SKenneth E. Jansen if ( (pos = textline.find_first_of( ':',pos)) != string::npos) { 14659599516SKenneth E. Jansen 14759599516SKenneth E. Jansen // get the keyphrase 14859599516SKenneth E. Jansen string keywd = textline.substr(0,pos); 14959599516SKenneth E. Jansen trim_string(&keywd); 15059599516SKenneth E. Jansen 15159599516SKenneth E. Jansen // get the key-value 15259599516SKenneth E. Jansen string keyval = textline.substr( pos+1, textline.length() - pos); 15359599516SKenneth E. Jansen trim_string(&keyval); 15459599516SKenneth E. Jansen 15559599516SKenneth E. Jansen // put the pair into the map 15659599516SKenneth E. Jansen (*inmap)[keywd] = keyval; 15759599516SKenneth E. Jansen 15859599516SKenneth E. Jansen } 15959599516SKenneth E. Jansen } 16059599516SKenneth E. Jansen } 16159599516SKenneth E. Jansen 16259599516SKenneth E. Jansen // remove leading and trailing spaces (or tabs) 163*9ae91bddSCameron Smith void phSolver::Input::trim_string(string *str) 16459599516SKenneth E. Jansen { 16559599516SKenneth E. Jansen // check for empty string 16659599516SKenneth E. Jansen int length = str->length(); 16759599516SKenneth E. Jansen if ( length == 0 ) 16859599516SKenneth E. Jansen return; 16959599516SKenneth E. Jansen 17059599516SKenneth E. Jansen // erase leading spaces (or tabs) 17159599516SKenneth E. Jansen int pos0 = 0; 17259599516SKenneth E. Jansen while ( (*str)[pos0] == ' ' || (*str)[pos0] == '\t') { 17359599516SKenneth E. Jansen pos0++; 17459599516SKenneth E. Jansen } 17559599516SKenneth E. Jansen if ( pos0 > 0 ) { 17659599516SKenneth E. Jansen str->erase(0,pos0); 17759599516SKenneth E. Jansen } 17859599516SKenneth E. Jansen 17959599516SKenneth E. Jansen length = str->length(); 18059599516SKenneth E. Jansen pos0 = length-1; 18159599516SKenneth E. Jansen // erase trailing spaces (or tabs) 18259599516SKenneth E. Jansen while ( (*str)[pos0] == ' ' || (*str)[pos0] == '\t') { 18359599516SKenneth E. Jansen pos0--; 18459599516SKenneth E. Jansen } 18559599516SKenneth E. Jansen if ( pos0 < length-1 ) { 18659599516SKenneth E. Jansen str->erase(pos0+1, length-pos0); 18759599516SKenneth E. Jansen } 18859599516SKenneth E. Jansen 18959599516SKenneth E. Jansen } 190