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