xref: /phasta/phSolver/common/Cinput.cc (revision 8746ab438bbda91291f8cdd62b94f8385f2d26f1)
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