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