1*59599516SKenneth E. Jansen #include <stdio.h> 2*59599516SKenneth E. Jansen #include <fstream> 3*59599516SKenneth E. Jansen #include "Input.h" 4*59599516SKenneth E. Jansen #include "ValType.h" 5*59599516SKenneth E. Jansen #include <stdexcept> 6*59599516SKenneth E. Jansen #include <strstream> 7*59599516SKenneth E. Jansen //MR CHANGE 8*59599516SKenneth E. Jansen #include <cstdlib> 9*59599516SKenneth E. Jansen //MR CHANGE END 10*59599516SKenneth E. Jansen 11*59599516SKenneth E. Jansen // return a given key value (if it's in the map) 12*59599516SKenneth E. Jansen ValType Input::GetValue(const string &str) const 13*59599516SKenneth E. Jansen { 14*59599516SKenneth E. Jansen if (input_map->find(str) != input_map->end()) { 15*59599516SKenneth E. Jansen if ( (*input_map)[str] == "NODEFAULT" ) { 16*59599516SKenneth E. Jansen ostrstream ost; 17*59599516SKenneth E. Jansen ost << "required input variable not set: " << str << ends; 18*59599516SKenneth E. Jansen throw invalid_argument( ost.str() ); 19*59599516SKenneth E. Jansen } 20*59599516SKenneth E. Jansen } else { 21*59599516SKenneth E. Jansen ostrstream ost; 22*59599516SKenneth E. Jansen ost << "required input variable not set: " << str << ends; 23*59599516SKenneth E. Jansen throw invalid_argument( ost.str() ); 24*59599516SKenneth E. Jansen } 25*59599516SKenneth E. Jansen 26*59599516SKenneth E. Jansen return ValType( (*input_map)[str] ); 27*59599516SKenneth E. Jansen } 28*59599516SKenneth E. Jansen 29*59599516SKenneth E. Jansen 30*59599516SKenneth E. Jansen Input::Input(const string &fname, const string &default_fname) 31*59599516SKenneth E. Jansen { 32*59599516SKenneth E. Jansen // open the input file 33*59599516SKenneth E. Jansen ifstream infile( fname.c_str(), ios::in); 34*59599516SKenneth E. Jansen 35*59599516SKenneth E. Jansen if(!infile || infile.eof()){ 36*59599516SKenneth E. Jansen cerr<<" Input file does not exist or is empty or perhaps you forgot mpirun? "<<endl; 37*59599516SKenneth E. Jansen exit(-2); 38*59599516SKenneth E. Jansen } 39*59599516SKenneth E. Jansen 40*59599516SKenneth E. Jansen // allocate memory 41*59599516SKenneth E. Jansen input_text = new vector<string>; 42*59599516SKenneth E. Jansen input_map = new map<string,string>; 43*59599516SKenneth E. Jansen 44*59599516SKenneth E. Jansen // get the lines of text from the input file 45*59599516SKenneth E. Jansen get_input_lines(input_text, infile); 46*59599516SKenneth E. Jansen build_map(input_map, input_text); 47*59599516SKenneth E. Jansen 48*59599516SKenneth E. Jansen // build and merge with default map ( if desired ) 49*59599516SKenneth E. Jansen if (!default_fname.empty()) { 50*59599516SKenneth E. Jansen ifstream infile2( default_fname.c_str(), ios::in); 51*59599516SKenneth E. Jansen 52*59599516SKenneth E. Jansen map<string,string> *default_map = new map<string,string>; 53*59599516SKenneth E. Jansen vector<string> *default_text = new vector<string>; 54*59599516SKenneth E. Jansen 55*59599516SKenneth E. Jansen get_input_lines(default_text, infile2); 56*59599516SKenneth E. Jansen build_map(default_map, default_text); 57*59599516SKenneth E. Jansen 58*59599516SKenneth E. Jansen // merge the two maps 59*59599516SKenneth E. Jansen map<string,string>::const_iterator iter = default_map->begin(); 60*59599516SKenneth E. Jansen for ( ; iter != default_map->end(); ++iter ) { 61*59599516SKenneth E. Jansen string defkey = iter->first; 62*59599516SKenneth E. Jansen string defval = iter->second; 63*59599516SKenneth E. Jansen if ( input_map->find(defkey) == input_map->end() ) { 64*59599516SKenneth E. Jansen (*input_map)[defkey] = defval; 65*59599516SKenneth E. Jansen } 66*59599516SKenneth E. Jansen } 67*59599516SKenneth E. Jansen infile2.close(); 68*59599516SKenneth E. Jansen 69*59599516SKenneth E. Jansen delete default_map; 70*59599516SKenneth E. Jansen delete default_text; 71*59599516SKenneth E. Jansen 72*59599516SKenneth E. Jansen } else { 73*59599516SKenneth E. Jansen cerr << "Input warning: no input.config file found." << endl; 74*59599516SKenneth E. Jansen cerr << "Get one from source directory." << endl; 75*59599516SKenneth E. Jansen exit(-2); 76*59599516SKenneth E. Jansen } 77*59599516SKenneth E. Jansen 78*59599516SKenneth E. Jansen infile.close(); 79*59599516SKenneth E. Jansen 80*59599516SKenneth E. Jansen } 81*59599516SKenneth E. Jansen 82*59599516SKenneth E. Jansen Input::~Input() 83*59599516SKenneth E. Jansen { 84*59599516SKenneth E. Jansen delete input_text; 85*59599516SKenneth E. Jansen delete input_map; 86*59599516SKenneth E. Jansen } 87*59599516SKenneth E. Jansen 88*59599516SKenneth E. Jansen 89*59599516SKenneth E. Jansen // return the input map 90*59599516SKenneth E. Jansen map<string,string> Input::InputMap() const 91*59599516SKenneth E. Jansen { 92*59599516SKenneth E. Jansen return *input_map; 93*59599516SKenneth E. Jansen } 94*59599516SKenneth E. Jansen 95*59599516SKenneth E. Jansen // echo the entire map 96*59599516SKenneth E. Jansen void Input::EchoInputMap(const ostream &ofile) 97*59599516SKenneth E. Jansen { 98*59599516SKenneth E. Jansen map<string,string>::const_iterator iter = input_map->begin(); 99*59599516SKenneth E. Jansen for ( ; iter != input_map->end(); ++iter ) { 100*59599516SKenneth E. Jansen cout << "Keyphrase: " << iter->first << endl 101*59599516SKenneth E. Jansen << "Keyvalue: " << iter->second << endl << endl; 102*59599516SKenneth E. Jansen } 103*59599516SKenneth E. Jansen } 104*59599516SKenneth E. Jansen 105*59599516SKenneth E. Jansen // read the input text from the given stream 106*59599516SKenneth E. Jansen void Input::get_input_lines(vector<string> *text, ifstream &infile) 107*59599516SKenneth E. Jansen { 108*59599516SKenneth E. Jansen string textline; 109*59599516SKenneth E. Jansen while ( getline( infile, textline, '\n' ) ) { 110*59599516SKenneth E. Jansen // ignore everything on a comment line 111*59599516SKenneth E. Jansen if ( textline[0] != '#' ) { 112*59599516SKenneth E. Jansen text->push_back( textline ); 113*59599516SKenneth E. Jansen } 114*59599516SKenneth E. Jansen } 115*59599516SKenneth E. Jansen } 116*59599516SKenneth E. Jansen 117*59599516SKenneth E. Jansen 118*59599516SKenneth E. Jansen // 119*59599516SKenneth E. Jansen void Input::build_map(map<string,string> *inmap, 120*59599516SKenneth E. Jansen vector<string> *intext) 121*59599516SKenneth E. Jansen { 122*59599516SKenneth E. Jansen // iterate through input_text of text and separate at :'s 123*59599516SKenneth E. Jansen for (int i = 0 ; i < intext->size(); i++) { 124*59599516SKenneth E. Jansen string textlineALL = (*intext)[i]; 125*59599516SKenneth E. Jansen string textline; 126*59599516SKenneth E. Jansen int pos = 0; 127*59599516SKenneth E. Jansen 128*59599516SKenneth E. Jansen // modification introduced so that comments starting midway in a file 129*59599516SKenneth E. Jansen // can be handled. 130*59599516SKenneth E. Jansen 131*59599516SKenneth E. Jansen if ( (pos = textlineALL.find_first_of( '#',pos)) != string::npos) { 132*59599516SKenneth E. Jansen textline = textlineALL.substr(0,pos); 133*59599516SKenneth E. Jansen }else { 134*59599516SKenneth E. Jansen textline = textlineALL; 135*59599516SKenneth E. Jansen } 136*59599516SKenneth E. Jansen pos = 0; 137*59599516SKenneth E. Jansen if ( (pos = textline.find_first_of( ':',pos)) != string::npos) { 138*59599516SKenneth E. Jansen 139*59599516SKenneth E. Jansen // get the keyphrase 140*59599516SKenneth E. Jansen string keywd = textline.substr(0,pos); 141*59599516SKenneth E. Jansen trim_string(&keywd); 142*59599516SKenneth E. Jansen 143*59599516SKenneth E. Jansen // get the key-value 144*59599516SKenneth E. Jansen string keyval = textline.substr( pos+1, textline.length() - pos); 145*59599516SKenneth E. Jansen trim_string(&keyval); 146*59599516SKenneth E. Jansen 147*59599516SKenneth E. Jansen // put the pair into the map 148*59599516SKenneth E. Jansen (*inmap)[keywd] = keyval; 149*59599516SKenneth E. Jansen 150*59599516SKenneth E. Jansen } 151*59599516SKenneth E. Jansen } 152*59599516SKenneth E. Jansen } 153*59599516SKenneth E. Jansen 154*59599516SKenneth E. Jansen // remove leading and trailing spaces (or tabs) 155*59599516SKenneth E. Jansen void Input::trim_string(string *str) 156*59599516SKenneth E. Jansen { 157*59599516SKenneth E. Jansen // check for empty string 158*59599516SKenneth E. Jansen int length = str->length(); 159*59599516SKenneth E. Jansen if ( length == 0 ) 160*59599516SKenneth E. Jansen return; 161*59599516SKenneth E. Jansen 162*59599516SKenneth E. Jansen // erase leading spaces (or tabs) 163*59599516SKenneth E. Jansen int pos0 = 0; 164*59599516SKenneth E. Jansen while ( (*str)[pos0] == ' ' || (*str)[pos0] == '\t') { 165*59599516SKenneth E. Jansen pos0++; 166*59599516SKenneth E. Jansen } 167*59599516SKenneth E. Jansen if ( pos0 > 0 ) { 168*59599516SKenneth E. Jansen str->erase(0,pos0); 169*59599516SKenneth E. Jansen } 170*59599516SKenneth E. Jansen 171*59599516SKenneth E. Jansen length = str->length(); 172*59599516SKenneth E. Jansen pos0 = length-1; 173*59599516SKenneth E. Jansen // erase trailing spaces (or tabs) 174*59599516SKenneth E. Jansen while ( (*str)[pos0] == ' ' || (*str)[pos0] == '\t') { 175*59599516SKenneth E. Jansen pos0--; 176*59599516SKenneth E. Jansen } 177*59599516SKenneth E. Jansen if ( pos0 < length-1 ) { 178*59599516SKenneth E. Jansen str->erase(pos0+1, length-pos0); 179*59599516SKenneth E. Jansen } 180*59599516SKenneth E. Jansen 181*59599516SKenneth E. Jansen } 182