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)
GetValue(const string & str) const129ae91bddSCameron 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
GetUserFileName()299ae91bddSCameron Smith const char* phSolver::Input::GetUserFileName() {
309ae91bddSCameron Smith return userConfFileName.c_str();
319ae91bddSCameron Smith }
3259599516SKenneth E. Jansen
GetDefaultFileName()339ae91bddSCameron Smith const char* phSolver::Input::GetDefaultFileName() {
349ae91bddSCameron Smith return defaultConfFileName.c_str();
359ae91bddSCameron Smith }
369ae91bddSCameron Smith
Input(const string & fname,const string & default_fname)379ae91bddSCameron Smith phSolver::Input::Input(const string &fname, const string &default_fname)
389ae91bddSCameron 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
~Input()909ae91bddSCameron 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
InputMap() const989ae91bddSCameron 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
EchoInputMap(const ostream & ofile)1049ae91bddSCameron 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
get_input_lines(vector<string> * text,ifstream & infile)1149ae91bddSCameron 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 //
build_map(map<string,string> * inmap,vector<string> * intext)1279ae91bddSCameron 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
131*47f44297SCameron Smith for (unsigned i = 0 ; i < intext->size(); i++) {
13259599516SKenneth E. Jansen string textlineALL = (*intext)[i];
13359599516SKenneth E. Jansen string textline;
13459599516SKenneth E. Jansen
13559599516SKenneth E. Jansen // modification introduced so that comments starting midway in a file
13659599516SKenneth E. Jansen // can be handled.
137*47f44297SCameron Smith size_t pos = textlineALL.find_first_of( '#',0);
138*47f44297SCameron Smith if ( pos != string::npos) {
13959599516SKenneth E. Jansen textline = textlineALL.substr(0,pos);
14059599516SKenneth E. Jansen }else {
14159599516SKenneth E. Jansen textline = textlineALL;
14259599516SKenneth E. Jansen }
143*47f44297SCameron Smith pos = textline.find_first_of( ':', 0);
144*47f44297SCameron Smith if ( pos != string::npos) {
14559599516SKenneth E. Jansen
14659599516SKenneth E. Jansen // get the keyphrase
14759599516SKenneth E. Jansen string keywd = textline.substr(0,pos);
14859599516SKenneth E. Jansen trim_string(&keywd);
14959599516SKenneth E. Jansen
15059599516SKenneth E. Jansen // get the key-value
15159599516SKenneth E. Jansen string keyval = textline.substr( pos+1, textline.length() - pos);
15259599516SKenneth E. Jansen trim_string(&keyval);
15359599516SKenneth E. Jansen
15459599516SKenneth E. Jansen // put the pair into the map
15559599516SKenneth E. Jansen (*inmap)[keywd] = keyval;
15659599516SKenneth E. Jansen
15759599516SKenneth E. Jansen }
15859599516SKenneth E. Jansen }
15959599516SKenneth E. Jansen }
16059599516SKenneth E. Jansen
16159599516SKenneth E. Jansen // remove leading and trailing spaces (or tabs)
trim_string(string * str)1629ae91bddSCameron Smith void phSolver::Input::trim_string(string *str)
16359599516SKenneth E. Jansen {
16459599516SKenneth E. Jansen // check for empty string
16559599516SKenneth E. Jansen int length = str->length();
16659599516SKenneth E. Jansen if ( length == 0 )
16759599516SKenneth E. Jansen return;
16859599516SKenneth E. Jansen
16959599516SKenneth E. Jansen // erase leading spaces (or tabs)
17059599516SKenneth E. Jansen int pos0 = 0;
17159599516SKenneth E. Jansen while ( (*str)[pos0] == ' ' || (*str)[pos0] == '\t') {
17259599516SKenneth E. Jansen pos0++;
17359599516SKenneth E. Jansen }
17459599516SKenneth E. Jansen if ( pos0 > 0 ) {
17559599516SKenneth E. Jansen str->erase(0,pos0);
17659599516SKenneth E. Jansen }
17759599516SKenneth E. Jansen
17859599516SKenneth E. Jansen length = str->length();
17959599516SKenneth E. Jansen pos0 = length-1;
18059599516SKenneth E. Jansen // erase trailing spaces (or tabs)
18159599516SKenneth E. Jansen while ( (*str)[pos0] == ' ' || (*str)[pos0] == '\t') {
18259599516SKenneth E. Jansen pos0--;
18359599516SKenneth E. Jansen }
18459599516SKenneth E. Jansen if ( pos0 < length-1 ) {
18559599516SKenneth E. Jansen str->erase(pos0+1, length-pos0);
18659599516SKenneth E. Jansen }
18759599516SKenneth E. Jansen
18859599516SKenneth E. Jansen }
189