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);
84 for (string::size_type i = start; i < str.size(); i++){
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);
99 for (string::size_type i = start; i < str.size(); i++){
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)){
178 for (string::size_type i = 0; i < line.size(); i++){
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 for (vector<NameList>::iterator nl = namelists.begin(); nl != namelists.end(); ++nl) {
302 for (vector<Param>::iterator param = nl->params.begin(); param != nl->params.end(); ++param ) {
303 if (param->used==
false){
304 printf(
"Warning: '%s' was present in '%s' but was not used.\n",param->name.c_str(), nl->name.c_str());
309 return (n_unused==0);
314 vector<NameList>::iterator it = namelists.begin();
315 while (it!=namelists.end()) {
316 if ((*it).name==namelist)
break;
319 return it != namelists.end();
324 vector<NameList>::iterator it = namelists.begin();
325 while (it!=namelists.end()) {
326 if ((*it).name==namelist)
break;
329 if (it != namelists.end()){
330 namelist_index = distance(namelists.begin(), it);
332 printf(
"\nNamelist '%s' not found in the file!",namelist.c_str());
338 if (namelist_index==-1){
339 printf(
"\nNeed to choose which namelist to use with use_namelist(const std::string&)!\n");
343 vector<Param>::iterator it = namelists[namelist_index].params.begin();
344 while (it!=namelists[namelist_index].params.end()) {
345 if ((*it).name==param)
break;
349 return (it != namelists[namelist_index].params.end());
352 template <
typename T>
353 T
get(
const string& param,
const T default_val,
int val_ind=0){
354 if (namelist_index==-1){
355 printf(
"\nNeed to choose which namelist to use with use_namelist(const std::string&)!\n");
359 int param_index = -1;
360 vector<Param>::iterator it = namelists[namelist_index].params.begin();
361 while (it!=namelists[namelist_index].params.end()) {
362 if ((*it).name==param)
break;
366 if (it != namelists[namelist_index].params.end())
367 param_index = distance(namelists[namelist_index].params.begin(), it);
372 namelists[namelist_index].params[param_index].used=
true;
374 if (val_ind>=0 && val_ind<namelists[namelist_index].params[param_index].values.size()){
375 string str_var = namelists[namelist_index].params[param_index].values[val_ind];
376 return string_to_param<T>(str_var);
378 printf(
"\nParameter '%s' in namelist '%s' didn't have enough values!",param.c_str(),namelists[namelist_index].name.c_str());
384 template <
typename T>
386 if (namelist_index==-1){
387 printf(
"\nNeed to choose which namelist to use with use_namelist(const std::string&)!\n");
391 int param_index = -1;
392 vector<Param>::iterator it = namelists[namelist_index].params.begin();
393 while (it!=namelists[namelist_index].params.end()) {
394 if ((*it).name==param)
break;
398 if (it != namelists[namelist_index].params.end())
399 param_index = distance(namelists[namelist_index].params.begin(), it);
401 printf(
"\nParameter '%s' not found in namelist '%s'!",param.c_str(),namelists[namelist_index].name.c_str());
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());
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_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:337
bool check_all_used()
Definition: NamelistReader.hpp:299
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
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:322
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:312
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:385
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