1 #ifndef NAMELISTREADER_HPP
2 #define NAMELISTREADER_HPP
35 inline string&
ltrim(
string& s,
const char* t =
" \t\n\r\f\v")
37 s.erase(0, s.find_first_not_of(t));
42 inline string&
rtrim(
string& s,
const char* t =
" \t\n\r\f\v")
44 s.erase(s.find_last_not_of(t) + 1);
49 inline string&
trim(
string& s,
const char* t =
" \t\n\r\f\v")
60 : name(name), used(false)
74 params.push_back(
Param(word));
79 params[params.size()-1].values.push_back(word);
85 if ((str[i]>=48 && str[i]<=57) || (str[i]>=65 && str[i]<=90) ||
86 (str[i]>=97 && str[i]<=122) || str[i]==95){
90 return str.substr(start, i-start);
93 return str.substr(start,str.size()-start);
100 if (in_dquote==
true || in_squote==
true){
101 if (str[i]==34) in_dquote=
false;
102 if (str[i]==39) in_squote=
false;
104 if (str[i]==34) in_dquote=
true;
105 if (str[i]==39) in_squote=
true;
106 if (str[i]==
'!' || str[i]==
' ' || str[i]==
'\t'|| str[i]==
'\r'|| str[i]==
'\f'|| str[i]==
'\v'){
108 return str.substr(start, i-start);
112 return str.substr(start,str.size()-start);
121 for (
int i = 0; i<param.size(); i++)
122 param[i]=tolower(param[i]);
124 if (param==
".false."){
126 }
else if (param==
".true."){
129 printf(
"Error, couldn't parse %s \n", param.c_str());
135 for (
int i = 0; i<param.size(); i++)
136 if (param[i]==
'D' || param[i]==
'd') param[i]=
'e';
160 return param.substr(1,param.size()-2);
171 const bool verbose=
false;
175 while(getline(newfile, line)){
187 }
else if (expect==
NLName){
191 namelists.push_back(
NameList(word));
192 if (verbose) cout <<
"Found namelist: " << word <<
"\n";
205 namelists[namelists.size()-1].add_param(word);
206 if (verbose) cout <<
" Found parameter: " << word <<
"\n";
208 }
else if(expect==
Equals){
217 namelists[namelists.size()-1].add_value(word);
218 if (verbose) cout <<
" Found Value: " << word <<
"\n";
224 printf(
"\nParse failure reading %s at Line %d. Failed to find name of namelist.\n", filename.c_str(), i_line);
226 }
else if(expect==
Equals){
227 printf(
"\nParse failure reading %s at Line %d. Expected parameter assignment.\n", filename.c_str(), i_line);
229 }
else if(expect==
Value){
230 printf(
"\nParse failure reading %s at Line %d. Couldn't parse value assignment.\n", filename.c_str(), i_line);
238 void load(
const string& filename){
240 newfile.open(filename,ios::in);
241 if (!newfile.is_open())
return;
243 parse_lines(newfile,filename);
249 istringstream f(str.c_str());
251 parse_lines(f,
"string input");
257 : namelist_index(-1), use_all(false), modifiable(false)
263 : namelist_index(-1), use_all(false), modifiable(false)
268 load_from_string(str_name);
273 : namelist_index(-1), use_all(false), modifiable(false)
284 namelists.push_back(
NameList(namelist));
286 printf(
"Warning: 'add_namelist' ignored, only valid if NamelistReader is in CreateManually mode");
292 namelists[namelists.size()-1].add_param(param);
293 namelists[namelists.size()-1].add_value(val);
295 printf(
"Warning: 'add_to_namelist' ignored, only valid if NamelistReader is in CreateManually mode");
301 namelists[namelists.size()-1].add_value(val);
303 printf(
"Warning: 'add_to_param' ignored, only valid if NamelistReader is in CreateManually mode");
309 for (vector<NameList>::iterator nl = namelists.begin(); nl != namelists.end(); ++nl) {
310 for (vector<Param>::iterator param = nl->params.begin(); param != nl->params.end(); ++param ) {
311 if (param->used==
false){
312 printf(
"Warning: '%s' was present in '%s' but was not used.\n",param->name.c_str(), nl->name.c_str());
317 return (n_unused==0);
322 vector<NameList>::iterator it = namelists.begin();
323 while (it!=namelists.end()) {
324 if ((*it).name==namelist)
break;
327 return it != namelists.end();
332 vector<NameList>::iterator it = namelists.begin();
333 while (it!=namelists.end()) {
334 if ((*it).name==namelist)
break;
337 if (it != namelists.end()){
338 namelist_index = distance(namelists.begin(), it);
340 printf(
"\nNamelist '%s' not found in the file!",namelist.c_str());
346 if (namelist_index==-1){
347 printf(
"\nNeed to choose which namelist to use with use_namelist(const std::string&)!\n");
351 vector<Param>::iterator it = namelists[namelist_index].params.begin();
352 while (it!=namelists[namelist_index].params.end()) {
353 if ((*it).name==param)
break;
357 return (it != namelists[namelist_index].params.end());
360 template <
typename T>
361 T
get(
const string& param,
const T default_val,
int val_ind=0){
362 if (namelist_index==-1){
363 printf(
"\nNeed to choose which namelist to use with use_namelist(const std::string&)!\n");
367 int param_index = -1;
368 vector<Param>::iterator it = namelists[namelist_index].params.begin();
369 while (it!=namelists[namelist_index].params.end()) {
370 if ((*it).name==param)
break;
374 if (it != namelists[namelist_index].params.end())
375 param_index = distance(namelists[namelist_index].params.begin(), it);
380 namelists[namelist_index].params[param_index].used=
true;
382 if (val_ind>=0 && val_ind<namelists[namelist_index].params[param_index].values.size()){
383 string str_var = namelists[namelist_index].params[param_index].values[val_ind];
384 return string_to_param<T>(str_var);
386 printf(
"\nParameter '%s' in namelist '%s' didn't have enough values!",param.c_str(),namelists[namelist_index].name.c_str());
392 template <
typename T>
394 if (namelist_index==-1){
395 printf(
"\nNeed to choose which namelist to use with use_namelist(const std::string&)!\n");
399 int param_index = -1;
400 vector<Param>::iterator it = namelists[namelist_index].params.begin();
401 while (it!=namelists[namelist_index].params.end()) {
402 if ((*it).name==param)
break;
406 if (it != namelists[namelist_index].params.end())
407 param_index = distance(namelists[namelist_index].params.begin(), it);
409 printf(
"\nParameter '%s' not found in namelist '%s'!",param.c_str(),namelists[namelist_index].name.c_str());
413 namelists[namelist_index].params[param_index].used=
true;
415 if (val_ind>=0 && val_ind<namelists[namelist_index].params[param_index].values.size()){
416 string str_var = namelists[namelist_index].params[param_index].values[val_ind];
417 return string_to_param<T>(str_var);
419 printf(
"\nParameter '%s' in namelist '%s' didn't have enough values!",param.c_str(),namelists[namelist_index].name.c_str());
static void change_D_to_E(string ¶m)
Definition: NamelistReader.hpp:134
void add_value(string word)
Definition: NamelistReader.hpp:77
bool modifiable
Definition: NamelistReader.hpp:167
Definition: NamelistReader.hpp:64
void add_to_param(const string &val)
Definition: NamelistReader.hpp:299
void add_namelist(const string &namelist)
Definition: NamelistReader.hpp:282
void enable_modifications()
Definition: NamelistReader.hpp:278
void load_from_string(const string &str)
Definition: NamelistReader.hpp:248
Definition: NamelistReader.hpp:21
Definition: NamelistReader.hpp:31
Definition: NamelistReader.hpp:20
void load(const string &filename)
Definition: NamelistReader.hpp:238
vector< string > values
Definition: NamelistReader.hpp:57
string name
Definition: NamelistReader.hpp:65
string & rtrim(string &s, const char *t=" \t\n\r\f\v")
Definition: NamelistReader.hpp:42
bool present(const string ¶m)
Definition: NamelistReader.hpp:345
bool check_all_used()
Definition: NamelistReader.hpp:307
bool use_all
Definition: NamelistReader.hpp:166
Definition: NamelistReader.hpp:163
string & ltrim(string &s, const char *t=" \t\n\r\f\v")
Definition: NamelistReader.hpp:35
Definition: NamelistReader.hpp:18
NamelistReader(const string &filename)
Definition: NamelistReader.hpp:256
int size_type
Definition: col_grid_matrix.hpp:19
Create
Definition: NamelistReader.hpp:30
vector< NameList > namelists
Definition: NamelistReader.hpp:164
bool string_to_param< bool >(string ¶m)
Definition: NamelistReader.hpp:119
void use_namelist(const string &namelist)
Definition: NamelistReader.hpp:330
Definition: NamelistReader.hpp:27
bool used
Definition: NamelistReader.hpp:56
Definition: NamelistReader.hpp:17
int namelist_index
Definition: NamelistReader.hpp:165
float string_to_param< float >(string ¶m)
Definition: NamelistReader.hpp:146
NameList(string name)
Definition: NamelistReader.hpp:68
vector< Param > params
Definition: NamelistReader.hpp:66
void parse_lines(T &newfile, const string &filename)
Definition: NamelistReader.hpp:170
NamelistReader(const string &str_name, ReadFrom read_from)
Definition: NamelistReader.hpp:262
void add_to_namelist(const string ¶m, const string &val)
Definition: NamelistReader.hpp:290
int string_to_param< int >(string ¶m)
Definition: NamelistReader.hpp:140
static T string_to_param(string ¶m)
Definition: NamelistReader.hpp:19
string & trim(string &s, const char *t=" \t\n\r\f\v")
Definition: NamelistReader.hpp:49
bool namelist_present(const string &namelist)
Definition: NamelistReader.hpp:320
string name
Definition: NamelistReader.hpp:55
Param(string name)
Definition: NamelistReader.hpp:59
ReadFrom
Definition: NamelistReader.hpp:25
Expect
Definition: NamelistReader.hpp:16
NamelistReader(Create create)
Definition: NamelistReader.hpp:272
double string_to_param< double >(string ¶m)
Definition: NamelistReader.hpp:152
string string_to_param< string >(string ¶m)
Definition: NamelistReader.hpp:158
static string get_first_value(string &str, int start)
Definition: NamelistReader.hpp:96
static string get_first_word(string &str, int start)
Definition: NamelistReader.hpp:83
T get_required(const string ¶m, int val_ind=0)
Definition: NamelistReader.hpp:393
Definition: NamelistReader.hpp:26
subroutine load()
Definition: load.F90:57
Definition: NamelistReader.hpp:54
void add_param(string word)
Definition: NamelistReader.hpp:72
Definition: NamelistReader.hpp:22