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);
120 for (
int i = 0; i<lc_str.size(); i++)
121 lc_str[i]=tolower(lc_str[i]);
134 if (lc_param==
".false."){
136 }
else if (lc_param==
".true."){
139 printf(
"Error, couldn't parse %s \n", param.c_str());
145 for (
int i = 0; i<param.size(); i++)
146 if (param[i]==
'D' || param[i]==
'd') param[i]=
'e';
176 return param.substr(1,param.size()-2);
186 typename vector<T>::iterator it = vec.begin();
187 while (it!=vec.end()) {
193 return distance(vec.begin(), it);
207 const bool verbose=
false;
211 while(getline(newfile, line)){
223 }
else if (expect==
NLName){
227 namelists.push_back(
NameList(word));
228 if (verbose) cout <<
"Found namelist: " << word <<
"\n";
241 namelists[namelists.size()-1].add_param(word);
242 if (verbose) cout <<
" Found parameter: " << word <<
"\n";
244 }
else if(expect==
Equals){
253 namelists[namelists.size()-1].add_value(word);
254 if (verbose) cout <<
" Found Value: " << word <<
"\n";
260 printf(
"\nParse failure reading %s at Line %d. Failed to find name of namelist.\n", filename.c_str(), i_line);
262 }
else if(expect==
Equals){
263 printf(
"\nParse failure reading %s at Line %d. Expected parameter assignment.\n", filename.c_str(), i_line);
265 }
else if(expect==
Value){
266 printf(
"\nParse failure reading %s at Line %d. Couldn't parse value assignment.\n", filename.c_str(), i_line);
274 void load(
const string& filename){
276 newfile.open(filename,ios::in);
277 if (!newfile.is_open())
return;
279 parse_lines(newfile,filename);
285 istringstream f(str.c_str());
287 parse_lines(f,
"string input");
298 : namelist_index(-1), use_all(
false), modifiable(
false)
304 : namelist_index(-1), use_all(
false), modifiable(
false)
309 load_from_string(str_name);
314 : namelist_index(-1), use_all(
false), modifiable(
false)
325 namelists.push_back(
NameList(namelist));
326 namelist_index = namelists.size()-1;
328 printf(
"Warning: 'add_namelist' ignored, only valid if NamelistReader is in CreateManually mode");
334 namelists[namelist_index].add_param(param);
335 namelists[namelist_index].add_value(val);
337 printf(
"Warning: 'add_to_namelist' ignored, only valid if NamelistReader is in CreateManually mode");
343 namelists[namelist_index].add_value(val);
345 printf(
"Warning: 'add_to_param' ignored, only valid if NamelistReader is in CreateManually mode");
351 for (vector<NameList>::iterator nl = namelists.begin(); nl != namelists.end(); ++nl) {
352 for (vector<Param>::iterator param = nl->params.begin(); param != nl->params.end(); ++param ) {
353 if (param->used==
false){
354 printf(
"Warning: '%s' was present in '%s' but was not used.\n",param->name.c_str(), nl->name.c_str());
359 return (n_unused==0);
368 if(namelist_index==-1){
369 if(required==Required){
370 printf(
"\nNamelist '%s' not found in the file!",namelist.c_str());
381 if(namelist_index==-1){
382 printf(
"\nNeed to choose which namelist to use with use_namelist(const std::string&)!\n");
383 }
else if(namelist_index==-2){
391 template <
typename T>
392 T
get(
const string& param,
const T default_val,
int val_ind=0){
393 if (namelist_index==-1){
394 printf(
"\nNeed to choose which namelist to use with use_namelist(const std::string&)!\n");
395 }
else if(namelist_index==-2){
405 namelists[namelist_index].params[param_index].used=
true;
407 if (val_ind>=0 && val_ind<namelists[namelist_index].params[param_index].values.size()){
408 string str_var = namelists[namelist_index].params[param_index].values[val_ind];
409 return string_to_param<T>(str_var);
411 printf(
"\nParameter '%s' in namelist '%s' didn't have enough values!",param.c_str(),namelists[namelist_index].name.c_str());
417 template <
typename T>
419 if (namelist_index==-1){
420 printf(
"\nNeed to choose which namelist to use with use_namelist(const std::string&)!\n");
422 }
else if(namelist_index==-2){
423 printf(
"\nParameter '%s' not found since the namelist was not found.\n",param.c_str(),namelists[namelist_index].name.c_str());
430 printf(
"\nParameter '%s' not found in namelist '%s'!",param.c_str(),namelists[namelist_index].name.c_str());
434 namelists[namelist_index].params[param_index].used=
true;
436 if (val_ind>=0 && val_ind<namelists[namelist_index].params[param_index].values.size()){
437 string str_var = namelists[namelist_index].params[param_index].values[val_ind];
438 return string_to_param<T>(str_var);
440 printf(
"\nParameter '%s' in namelist '%s' didn't have enough values!",param.c_str(),namelists[namelist_index].name.c_str());
Definition: NamelistReader.hpp:199
void add_to_param(const string &val)
Definition: NamelistReader.hpp:341
NamelistReader(Create create)
Definition: NamelistReader.hpp:313
void load_from_string(const string &str)
Definition: NamelistReader.hpp:284
vector< NameList > namelists
Definition: NamelistReader.hpp:200
NamelistReader(const string &filename)
Definition: NamelistReader.hpp:297
T get_required(const string ¶m, int val_ind=0)
Definition: NamelistReader.hpp:418
void load(const string &filename)
Definition: NamelistReader.hpp:274
void add_to_namelist(const string ¶m, const string &val)
Definition: NamelistReader.hpp:332
T get(const string ¶m, const T default_val, int val_ind=0)
Definition: NamelistReader.hpp:392
void enable_modifications()
Definition: NamelistReader.hpp:319
void add_namelist(const string &namelist)
Definition: NamelistReader.hpp:323
void use_namelist(const string &namelist, Options required=Required)
Definition: NamelistReader.hpp:366
int namelist_index
Definition: NamelistReader.hpp:201
Options
Definition: NamelistReader.hpp:292
void parse_lines(T &newfile, const string &filename)
Definition: NamelistReader.hpp:206
bool modifiable
Definition: NamelistReader.hpp:203
bool use_all
Definition: NamelistReader.hpp:202
bool present(const string ¶m)
Definition: NamelistReader.hpp:380
bool namelist_present(const string &namelist)
Definition: NamelistReader.hpp:362
NamelistReader(const string &str_name, ReadFrom read_from)
Definition: NamelistReader.hpp:303
bool check_all_used()
Definition: NamelistReader.hpp:349
int size_type
Definition: col_grid_matrix.hpp:19
Definition: NamelistReader.hpp:12
static string get_first_value(string &str, int start)
Definition: NamelistReader.hpp:96
ReadFrom
Definition: NamelistReader.hpp:25
@ ReadFromFile
Definition: NamelistReader.hpp:26
@ ReadFromString
Definition: NamelistReader.hpp:27
Create
Definition: NamelistReader.hpp:30
@ CreateManually
Definition: NamelistReader.hpp:31
string & trim(string &s, const char *t=" \t\n\r\f\v")
Definition: NamelistReader.hpp:49
static string lower_case_copy(const string &str)
Definition: NamelistReader.hpp:115
static void change_D_to_E(string ¶m)
Definition: NamelistReader.hpp:144
float string_to_param< float >(string ¶m)
Definition: NamelistReader.hpp:162
string string_to_param< string >(string ¶m)
Definition: NamelistReader.hpp:174
int find_case_insensitive_name_match(vector< T > &vec, const string &str)
Definition: NamelistReader.hpp:181
string & rtrim(string &s, const char *t=" \t\n\r\f\v")
Definition: NamelistReader.hpp:42
double string_to_param< double >(string ¶m)
Definition: NamelistReader.hpp:168
static string get_first_word(string &str, int start)
Definition: NamelistReader.hpp:83
static T string_to_param(string ¶m)
bool string_to_param< bool >(string ¶m)
Definition: NamelistReader.hpp:130
int string_to_param< int >(string ¶m)
Definition: NamelistReader.hpp:150
string & ltrim(string &s, const char *t=" \t\n\r\f\v")
Definition: NamelistReader.hpp:35
long long int string_to_param< long long int >(string ¶m)
Definition: NamelistReader.hpp:156
Expect
Definition: NamelistReader.hpp:16
@ Value
Definition: NamelistReader.hpp:21
@ Equals
Definition: NamelistReader.hpp:20
@ ParaNameOrEnd
Definition: NamelistReader.hpp:19
@ NLName
Definition: NamelistReader.hpp:18
@ Ampersand
Definition: NamelistReader.hpp:17
@ ValueOrEOL
Definition: NamelistReader.hpp:22
logical false
Definition: module.F90:103
Definition: NamelistReader.hpp:64
vector< Param > params
Definition: NamelistReader.hpp:66
void add_value(string word)
Definition: NamelistReader.hpp:77
string name
Definition: NamelistReader.hpp:65
void add_param(string word)
Definition: NamelistReader.hpp:72
NameList(string name)
Definition: NamelistReader.hpp:68
Definition: NamelistReader.hpp:54
bool used
Definition: NamelistReader.hpp:56
string name
Definition: NamelistReader.hpp:55
vector< string > values
Definition: NamelistReader.hpp:57
Param(string name)
Definition: NamelistReader.hpp:59