28 #ifndef LIBMESH_GETPOT_H
29 #define LIBMESH_GETPOT_H
31 #if defined(WIN32) || defined(SOLARIS_RAW) || (__GNUC__ == 2) || defined(__HP_aCC)
32 #define strtok_r(a, b, c) strtok(a, b)
33 #endif // WINDOWS or SOLARIS or gcc 2.* or HP aCC
62 #include "libmesh/libmesh_common.h"
69 #if !defined(GETPOT_DISABLE_MUTEX)
70 #include "libmesh/threads.h"
71 #define SCOPED_MUTEX libMesh::Threads::spin_mutex::scoped_lock lock(_getpot_mtx)
72 #define GETPOT_MUTEX_DECLARE mutable libMesh::Threads::spin_mutex _getpot_mtx
75 #define GETPOT_MUTEX_DECLARE
78 #define getpot_cerr libMesh::err
79 #define getpot_error() libmesh_error()
80 #define getpot_file_error(filename) libmesh_file_error(filename)
81 #define getpot_cast_int libMesh::cast_int
85 #ifdef LIBMESH_HAVE_CXX11_INVERSE_HYPERBOLIC_SINE
86 #define HAVE_INVERSE_HYPERBOLIC_SINE
89 #ifdef LIBMESH_HAVE_CXX11_INVERSE_HYPERBOLIC_COSINE
90 #define HAVE_INVERSE_HYPERBOLIC_COSINE
93 #ifdef LIBMESH_HAVE_CXX11_INVERSE_HYPERBOLIC_TANGENT
94 #define HAVE_INVERSE_HYPERBOLIC_TANGENT
100 #define GETPOT_DISABLE_MUTEX
102 #define GETPOT_MUTEX_DECLARE
104 #define getpot_cerr std::cerr
105 #define getpot_error() throw std::runtime_error(std::string("GetPot Error"))
106 #define getpot_file_error(filename) getpot_error()
107 #define getpot_cast_int static_cast
111 #ifndef __has_builtin
112 #define __has_builtin(x) 0
118 #if __cplusplus > 199711L && (!defined(__clang__) || __has_builtin(asinh))
119 #define HAVE_INVERSE_HYPERBOLIC_SINE
122 #if __cplusplus > 199711L && (!defined(__clang__) || __has_builtin(acosh))
123 #define HAVE_INVERSE_HYPERBOLIC_COSINE
126 #if __cplusplus > 199711L && (!defined(__clang__) || __has_builtin(atanh))
127 #define HAVE_INVERSE_HYPERBOLIC_TANGENT
130 #endif // #ifdef USE_LIBMESH
135 #define victorate(TYPE, VARIABLE, ITERATOR) \
136 std::vector<TYPE>::const_iterator ITERATOR = (VARIABLE).begin(); \
137 for (; (ITERATOR) != (VARIABLE).end(); ++(ITERATOR))
143 #ifdef GETPOT_NAMESPACE
144 namespace GETPOT_NAMESPACE {
164 inline GetPot(
const int argc_,
const char*
const* argv_,
165 const char* FieldSeparator=0x0);
166 inline GetPot(
const char* FileName,
167 const char* CommentStart=0x0,
const char* CommentEnd=0x0,
168 const char* FieldSeparator=0x0);
169 inline GetPot(
const std::string& FileName,
170 const std::string& CommentStart = std::string(
"#"),
171 const std::string& CommentEnd = std::string(
"\n"),
172 const std::string& FieldSeparator = std::string(
" \t\n"));
178 inline GetPot(std::istream& FileStream,
179 const std::string& CommentStart = std::string(
"#"),
180 const std::string& CommentEnd = std::string(
"\n"),
181 const std::string& FieldSeparator = std::string(
" \t\n"));
189 const char* FieldSeparator =0x0);
191 const std::string& CommentStart=std::string(
"#"),
192 const std::string& CommentEnd=std::string(
"\n"),
193 const std::string& FieldSeparator=std::string(
" \t\n"));
196 const std::string& FileName=std::string(
"ParsedFromStream"),
197 const std::string& CommentStart=std::string(
"#"),
198 const std::string& CommentEnd=std::string(
"\n"),
199 const std::string& FieldSeparator=std::string(
" \t\n"));
216 inline const char*
operator[](
unsigned Idx)
const;
218 template <
typename T>
219 inline T
get(
unsigned Idx,
const T& Default)
const;
221 inline const char*
get(
unsigned Idx,
const char* Default)
const;
222 inline unsigned size()
const;
260 bool have_section(
const std::string& section_name)
const;
266 inline T
operator()(
const char* VarName,
const T& Default)
const;
269 inline T
operator()(
const std::string& VarName,
const T& Default)
const;
271 inline const char*
operator()(
const char* VarName,
const char* Default)
const;
272 inline const char*
operator()(
const std::string& VarName,
const char* Default)
const;
278 inline T
operator()(
const char* VarName,
const T& Default,
unsigned Idx)
const;
281 inline T
operator()(
const std::string& VarName,
const T& Default,
unsigned Idx)
const;
283 inline const char*
operator()(
const char* VarName,
const char* Default,
unsigned Idx)
const;
284 inline const char*
operator()(
const std::string& VarName,
const char* Default,
unsigned Idx)
const;
306 inline T
get_value_no_default(
const std::string& VarName,
const T& Default,
unsigned Idx)
const;
308 inline const char*
get_value_no_default(
const char* VarName,
const char* Default,
unsigned Idx)
const;
309 inline const char*
get_value_no_default(
const std::string& VarName,
const char* Default,
unsigned Idx)
const;
317 inline void set(
const char* VarName,
const T& Value,
const bool Requested =
true);
320 inline void set(
const std::string& VarName,
const T& Value,
const bool Requested =
true);
322 inline void set(
const char* VarName,
const char* Value,
const bool Requested =
true);
323 inline void set(
const std::string& VarName,
const char* Value,
const bool Requested =
true);
373 inline bool search(
const char* option);
374 inline bool search(
const std::string& option);
375 inline bool search(
unsigned No,
const char* P, ...);
381 inline T
next(
const T& Default);
383 inline const char*
next(
const char* Default);
389 inline T
follow(
const T& Default,
const char* Option);
391 inline const char*
follow(
const char* Default,
const char* Option);
397 inline T
follow(
const T& Default,
unsigned No,
const char* Option, ...);
399 inline const char*
follow(
const char* Default,
unsigned No,
const char* Option, ...);
405 inline T
direct_follow(
const T& Default,
const char* Option);
407 inline const char*
direct_follow(
const char* Default,
const char* Option);
462 inline int print(std::ostream &out_stream = std::cout)
const;
469 inline int print(
const char *custom_prefix,
470 std::ostream &out_stream = std::cout,
471 unsigned int skip_count=1)
const;
486 variable(
const char* Name,
const char* Value,
const char* FieldSeparator);
490 void take(
const char* Value,
const char* FieldSeparator);
496 const std::string*
get_element(
unsigned Idx)
const;
549 bool operator()(
const char* s1,
const char* s2)
const {
return strcmp(s1, s2) < 0; }
603 const std::string& Value,
604 const bool Requested);
636 inline bool _check_flags(
const std::string& Str,
const char* FlagList)
const;
642 inline T
_convert_to_type(
const std::string& String,
const T& Default)
const;
644 inline std::string
_convert_to_type(
const std::string& String,
const char* Default)
const;
655 const std::string& Start)
const;
660 const std::string& Str)
const;
674 inline const std::string
_get_string(std::istream& istr);
690 template <
typename T>
693 std::ostringstream out_string;
695 return out_string.str();
705 for (std::size_t pos = 0; pos != FullPath.size(); ++pos)
707 if (FullPath[pos] ==
'/')
708 result.push_back(FullPath.substr(0,pos));
758 #if !defined(GETPOT_DISABLE_MUTEX)
761 _internal_string_container(),
762 _requested_arguments(),
763 _requested_variables(),
764 _requested_sections(),
765 request_recording_f()
774 const char* FieldSeparator ) :
789 #if !defined(GETPOT_DISABLE_MUTEX)
792 _internal_string_container(),
793 _requested_arguments(),
794 _requested_variables(),
795 _requested_sections(),
796 request_recording_f()
806 const char* FieldSeparator )
822 _apriori_argv.push_back(std::string(argv_[0]));
823 for (
int i=1; i<argc_; i++)
825 std::string tmp(argv_[i]);
826 _apriori_argv.push_back(tmp);
835 const char* CommentStart ,
const char* CommentEnd ,
836 const char* FieldSeparator) :
850 #if !defined(GETPOT_DISABLE_MUTEX)
853 _internal_string_container(),
854 _requested_arguments(),
855 _requested_variables(),
856 _requested_sections(),
857 request_recording_f()
859 const std::string& StrCommentStart = CommentStart ? CommentStart : std::string(
"#");
860 const std::string& StrCommentEnd = CommentEnd ? CommentEnd : std::string(
"\n");
861 const std::string& StrFieldSeparator = FieldSeparator ? FieldSeparator : std::string(
" \t\n");
862 this->
parse_input_file(FileName, StrCommentStart, StrCommentEnd, StrFieldSeparator);
869 const std::string& CommentStart,
870 const std::string& CommentEnd,
871 const std::string& FieldSeparator) :
885 #if !defined(GETPOT_DISABLE_MUTEX)
888 _internal_string_container(),
889 _requested_arguments(),
890 _requested_variables(),
891 _requested_sections(),
892 request_recording_f()
899 const std::string& CommentStart,
900 const std::string& CommentEnd,
901 const std::string& FieldSeparator)
903 std::ifstream input(FileName.c_str());
906 getpot_file_error(FileName);
914 const std::string& CommentStart,
915 const std::string& CommentEnd,
916 const std::string& FieldSeparator) :
930 #if !defined(GETPOT_DISABLE_MUTEX)
933 _internal_string_container(),
934 _requested_arguments(),
935 _requested_variables(),
936 _requested_sections(),
937 request_recording_f()
940 std::string(
"ParsedFromStream"),
941 CommentStart, CommentEnd, FieldSeparator);
947 const std::string& FileName,
948 const std::string& CommentStart,
949 const std::string& CommentEnd,
950 const std::string& FieldSeparator)
967 _apriori_argv.push_back(FileName);
970 _apriori_argv.insert(_apriori_argv.begin()+1, args.begin(), args.end());
978 prefix(Other.prefix),
979 section(Other.section),
980 section_list(Other.section_list),
982 cursor(Other.cursor),
983 search_loop_f(Other.search_loop_f),
984 search_failed_f(Other.search_failed_f),
986 nominus_cursor(Other.nominus_cursor),
987 idx_nominus(Other.idx_nominus),
988 variables(Other.variables),
989 _comment_start(Other._comment_start),
990 _comment_end(Other._comment_end),
991 _field_separator(Other._field_separator),
995 _internal_string_container(),
996 _requested_arguments(Other._requested_arguments),
997 _requested_variables(Other._requested_variables),
998 _requested_sections(Other._requested_sections),
999 request_recording_f(Other.request_recording_f)
1001 std::set<const char*,ltstr>::const_iterator it =
1004 const std::set<const char*,ltstr>::const_iterator end =
1007 for (; it != end; ++it)
1009 const char* otherstr = *it;
1010 char* newcopy =
new char[strlen(otherstr)+1];
1011 strncpy(newcopy, otherstr, strlen(otherstr)+1);
1024 for (; it != end; ++it)
1058 std::set<const char*, ltstr>::const_iterator my_it =
1060 const std::set<const char*, ltstr>::const_iterator my_end =
1063 for (; my_it != my_end; ++my_it)
1068 std::set<const char*,ltstr>::const_iterator it =
1070 const std::set<const char*,ltstr>::const_iterator end =
1073 for (; it != end; ++it)
1075 const char* otherstr = *it;
1076 const std::size_t bufsize = strlen(otherstr)+1;
1077 char* newcopy =
new char[bufsize];
1078 strncpy(newcopy, otherstr, bufsize);
1141 STRING_VECTOR::const_iterator it = ARGV.begin();
1151 argv.push_back(*it);
1155 for (; it != ARGV.end(); ++it)
1157 std::string arg = *it;
1159 if (arg.length() == 0)
1163 if (arg.length() > 1 && arg[0] ==
'[' && arg[arg.length()-1] ==
']')
1167 std::size_t include_pos = arg.find(
"include ", 1);
1168 if (include_pos != std::string::npos)
1171 const std::string includefile =
1194 argv.push_back(arg);
1200 argv.push_back(arg);
1208 const std::size_t equals_pos = arg.find_first_of(
'=');
1209 if (equals_pos != std::string::npos)
1226 arg.substr(equals_pos+1),
false);
1244 if (Token[0] == EOF)
1246 brute_tokens.push_back(Token);
1259 while (i1 < brute_tokens.size())
1265 if (i2 < brute_tokens.size() && brute_tokens[i2] ==
"=")
1267 if (i3 >= brute_tokens.size())
1268 result = brute_tokens[i1] + brute_tokens[i2];
1270 result = brute_tokens[i1] + brute_tokens[i2] + brute_tokens[i3];
1271 i1 = i3+1; i2 = i3+2; i3 = i3+3;
1273 else if (i2 < brute_tokens.size() &&
1274 brute_tokens[i2].length() > 0 &&
1275 brute_tokens[i2][0] ==
'=')
1279 result = brute_tokens[i1] + brute_tokens[i2];
1280 i1 = i3; i2 = i3+1; i3 = i3+2;
1282 else if (i2 < brute_tokens.size() && brute_tokens[i1][brute_tokens[i1].size()-1] ==
'=')
1284 result = brute_tokens[i1] + brute_tokens[i2];
1285 i1 = i3; i2 = i3+1; i3 = i3+2;
1289 result = brute_tokens[i1];
1295 if (comment_start_loc != std::string::npos)
1296 result = result.substr(0, comment_start_loc);
1298 arglist.push_back(result);
1309 int tmp = istr.get();
1312 while (std::isspace(tmp))
1336 unsigned match_no=0;
1367 inline const std::string
1376 int last_letter = tmp;
1383 token += getpot_cast_int<char>(tmp);
1387 else if (tmp == EOF || ((tmp ==
' ' || tmp ==
'\t' || tmp ==
'\n') && last_letter !=
'\\'))
1390 else if (tmp ==
'\'' && last_letter !=
'\\')
1397 else if (tmp ==
'{' && last_letter ==
'$')
1403 else if (tmp ==
'[')
1409 else if (tmp ==
'$' && last_letter ==
'\\')
1411 token += getpot_cast_int<char>(tmp); tmp = 0;
1415 else if (tmp ==
'\\' && last_letter !=
'\\')
1418 token += getpot_cast_int<char>(tmp);
1424 inline const std::string
1432 int last_letter = tmp;
1438 else if (tmp ==
'\'' && last_letter !=
'\\')
1441 else if (tmp ==
'\\' && last_letter !=
'\\')
1444 str += getpot_cast_int<char>(tmp);
1450 inline const std::string
1454 std::string str =
"";
1459 int last_letter = tmp;
1464 else if (tmp ==
'{' && last_letter ==
'$')
1467 else if (tmp ==
'}')
1474 else if (tmp ==
'\\' && last_letter !=
'\\')
1477 str += getpot_cast_int<char>(tmp);
1483 inline const std::string
1487 std::string str =
"";
1491 int tmp = istr.get();
1495 else if (tmp ==
'[')
1498 else if (tmp ==
']')
1505 str += getpot_cast_int<char>(tmp);
1515 std::string sname = Section;
1517 if (sname.length() >= 2 && sname.substr(0, 2) ==
"./")
1518 sname = sname.substr(2);
1521 else if (sname.length() >= 3 && sname.substr(0, 3) ==
"../")
1525 if (section_stack.end() != section_stack.begin())
1526 section_stack.pop_back();
1527 sname = sname.substr(3);
1528 }
while (sname.substr(0, 3) ==
"../");
1534 section_stack.erase(section_stack.begin(), section_stack.end());
1540 while (i < sname.length())
1542 if (sname[i] ==
'/')
1544 section_stack.push_back(sname.substr(0,i));
1545 if (i+1 < sname.length())
1546 sname = sname.substr(i+1);
1552 section_stack.push_back(sname);
1555 std::string section_label =
"";
1556 if (!section_stack.empty())
1558 victorate(std::string, section_stack, it)
1559 section_label += *it +
"/";
1561 return section_label;
1567 template <
typename T>
1571 std::istringstream in_string(String);
1573 in_string >> retval;
1574 if (in_string.fail())
1603 GetPot::_convert_to_type<bool>(
const std::string& String,
const bool & Default)
const
1605 std::string newstring(String);
1607 for (
unsigned int i=0; i<newstring.length(); ++i)
1608 newstring[i] = getpot_cast_int<char>(toupper(newstring[i]));
1611 if (newstring.find(
"TRUE")!=std::string::npos)
1614 if (newstring.find(
"FALSE")!=std::string::npos)
1620 std::istringstream in_string(String);
1621 unsigned int retval;
1622 in_string >> retval;
1623 if (in_string.fail())
1632 template <
typename T>
1636 std::istringstream in_string(String);
1638 in_string >> retval;
1639 if (in_string.fail())
1641 getpot_cerr <<
"ERROR: Input value for variable "<<VarName<<
" is of the wrong type."<<std::endl;
1642 getpot_cerr <<
" value = "<<String<<
" expected type = "<<
typeid(T).name()<<std::endl;
1672 GetPot::_convert_to_type_no_default<bool>(
const char* VarName,
const std::string& String,
const bool &)
const
1674 std::string newstring(String);
1676 for (
unsigned int i=0; i<newstring.length(); ++i)
1678 newstring[i]=getpot_cast_int<char>(toupper(newstring[i]));
1682 if (newstring.find(
"TRUE")!=std::string::npos)
1685 if (newstring.find(
"FALSE")!=std::string::npos)
1691 std::istringstream in_string(String);
1692 unsigned int retval;
1693 in_string >> retval;
1694 if (in_string.fail())
1696 getpot_cerr <<
"ERROR: Input value for variable "<<VarName<<
" is of the wrong type."<<std::endl;
1697 getpot_cerr <<
" value = "<<String<<
" expected type = "<<
typeid(bool).name()<<std::endl;
1709 const char* arg = Arg.c_str();
1715 std::set<const char*,ltstr>::const_iterator it =
1723 const std::size_t bufsize = strlen(arg)+1;
1724 char* newcopy =
new char[bufsize];
1725 strncpy(newcopy, arg, bufsize);
1738 inline const std::string
1746 if (String.find(Start) == 0)
1747 return String.substr(Start.length());
1759 return search(Option.c_str());
1768 unsigned OldCursor =
cursor;
1769 const std::string SearchTerm =
prefix + Option;
1774 if (OldCursor >=
argv.size())
1775 OldCursor = getpot_cast_int<unsigned>(
argv.size() - 1);
1779 for (
unsigned c =
cursor; c <
argv.size(); c++)
1781 if (
argv[c] == SearchTerm)
1792 for (
unsigned c = 1; c <= OldCursor; c++)
1794 if (
argv[c] == SearchTerm)
1825 char* Opt = va_arg(ap,
char *);
1839 char* Opt = va_arg(ap,
char *);
1879 return idx<
argv.size() ?
argv[idx].c_str() : 0;
1884 template <
typename T>
1888 if (Idx >=
argv.size())
1896 GetPot::get(
unsigned int Idx,
const char* Default)
const
1898 if (Idx >=
argv.size())
1900 return argv[Idx].c_str();
1908 return getpot_cast_int<unsigned>(
argv.size());
1914 template <
typename T>
1923 cursor = getpot_cast_int<unsigned>(
argv.size());
1947 template <
typename T>
1952 if (
search(Option) ==
false)
1955 return next(Default);
1970 template <
typename T>
1979 return next(Default);
1983 for (
unsigned i=1; i<No; i++)
1985 char* Opt = va_arg(ap,
char *);
1989 return next(Default);
2006 return next(Default);
2010 for (
unsigned i=1; i<No; i++)
2012 char* Opt = va_arg(ap,
char *);
2016 return next(Default);
2029 template <
typename T>
2042 cursor = getpot_cast_int<unsigned>(
argv.size());
2063 getpot_cast_int<unsigned>(strlen(StartString));
2064 unsigned OldCursor =
cursor;
2066 if (OldCursor >=
argv.size())
2067 OldCursor = getpot_cast_int<unsigned>(
argv.size() - 1);
2071 for (
unsigned c =
cursor; c <
argv.size(); c++)
2073 if (strncmp(StartString,
argv[c].c_str(), N) == 0)
2077 return &(
argv[c].c_str()[N]);
2085 for (
unsigned c = 1; c < OldCursor; c++)
2087 if (strncmp(StartString,
argv[c].c_str(), N) == 0)
2091 return &(
argv[c].c_str()[N]);
2108 STRING_VECTOR::const_iterator it =
argv.begin();
2109 for (; it !=
argv.end(); ++it)
2113 if (str.length() >= 2 && str[0] ==
'-' && str[1] !=
'-')
2125 if (Idx >=
argv.size())
2139 unsigned no_matches = 0;
2140 for (
unsigned i=0; i<
argv.size(); i++)
2146 if (no_matches == Idx)
2160 for (
const char* p=FlagList; *p !=
'\0' ; p++)
2161 if (Str.find(*p) != std::string::npos)
2176 std::vector<unsigned>::const_iterator it =
idx_nominus.begin();
2179 nv.push_back(
argv[*it]);
2260 std::string s = std::string(section_name);
2267 const char slash(
'/');
2269 std::string::const_reverse_iterator it = section_name.rbegin();
2271 bool found_section =
false;
2275 if( (*it) != slash )
2282 return found_section;
2285 template <
typename T>
2300 template <
typename T>
2325 template <
typename T>
2334 const std::string* element = sv->
get_element(Idx);
2342 template <
typename T>
2346 return operator()(VarName.c_str(), Default, Idx);
2360 GetPot::operator()(
const std::string& VarName,
const char* Default,
unsigned int Idx)
const
2362 return operator()(VarName.c_str(), Default, Idx);
2367 template <
typename T>
2375 getpot_cerr <<
"ERROR: cannot find variable "<<VarName<<std::endl;
2383 template <
typename T>
2408 template <
typename T>
2416 getpot_cerr <<
"ERROR: cannot find variable "<<VarName<<std::endl;
2420 const std::string* element = sv->
get_element(Idx);
2423 getpot_cerr <<
"ERROR: cannot find index "<<Idx<<
" of variable "<<VarName<<std::endl;
2431 template <
typename T>
2470 victorate(std::string, STree, it)
2492 victorate(std::string, STree, it)
2504 const std::string& Value,
const bool Requested )
2520 template <
typename T>
2522 GetPot::set(
const char* VarName,
const T& Value,
const bool Requested )
2524 std::ostringstream string_value;
2525 string_value << Value;
2526 _set_variable(VarName, string_value.str().c_str(), Requested);
2531 template <
typename T>
2533 GetPot::set(
const std::string& VarName,
const T& Value,
const bool Requested )
2535 set(VarName.c_str(), Value, Requested);
2541 GetPot::set(
const char* VarName,
const char* Value,
const bool Requested )
2549 GetPot::set(
const std::string& VarName,
const char* Value,
const bool Requested )
2551 set(VarName.c_str(), Value, Requested);
2562 return (
unsigned)(sv->
value.size());
2579 std::vector<GetPot::variable>::const_iterator it =
variables.begin();
2584 result.push_back(Tmp);
2604 const std::string full_prefix =
2605 *sec_prefix.rbegin() ==
'/' ? sec_prefix : sec_prefix +
'/';
2607 const std::size_t full_prefix_len = full_prefix.size();
2613 std::set<std::string> subsections;
2617 for (STRING_VECTOR::const_iterator it =
section_list.begin();
2620 const std::string & section_name = *it;
2623 if (section_name.compare(0, full_prefix_len, full_prefix) == 0)
2625 const std::size_t next_slash_len =
2626 section_name.find(
'/', full_prefix_len);
2628 const std::string subsection_name =
2629 section_name.substr(full_prefix_len,
2630 next_slash_len - full_prefix_len);
2635 if (!subsection_name.empty() &&
2636 !subsections.count(subsection_name))
2638 returnval.push_back(subsection_name);
2639 subsections.insert(subsection_name);
2649 inline std::set<std::string>
2660 const std::string Name =
prefix + VarName;
2662 std::vector<variable>::const_iterator it =
variables.begin();
2665 if ((*it).name == Name)
2691 out_stream <<
"argc = " <<
argv.size() << std::endl;
2692 STRING_VECTOR::const_iterator it =
argv.begin();
2693 for (; it !=
argv.end(); ++it)
2694 out_stream << *it << std::endl;
2695 out_stream << std::endl;
2707 GetPot::print(
const char* custom_prefix, std::ostream &out_stream,
unsigned int skip_count)
const
2709 STRING_VECTOR::const_iterator it =
argv.begin();
2711 for (; it !=
argv.end(); ++it)
2713 out_stream << custom_prefix;
2714 out_stream << *it << std::endl;
2716 out_stream << std::endl;
2775 std::string new_string =
"";
2776 unsigned open_brackets = 0;
2778 for (
unsigned i = 0; i<str.size(); i++)
2780 if (i + 2 < str.size() && str.substr(i, 2) ==
"${")
2782 if (open_brackets == 0)
2786 else if (str[i] ==
'}' && open_brackets > 0)
2789 if (open_brackets == 0)
2791 const std::string Replacement =
_DBE_expand(str.substr(first, i - first));
2792 new_string += Replacement;
2795 else if (open_brackets == 0)
2796 new_string += str[i];
2808 std::string str = str_;
2814 for (; i < str.size(); i++)
2815 if (!std::isspace(str[i]))
2819 unsigned open_brackets = 0;
2820 std::vector<unsigned> start_idx;
2821 unsigned start_new_string = i;
2822 unsigned l = (unsigned)(str.size());
2827 const char letter = str[i];
2829 if (std::isspace(letter) && open_brackets == 0)
2831 expr_list.push_back(str.substr(start_new_string, i - start_new_string));
2832 bool no_breakout_f =
true;
2833 for (i++; i < l ; i++)
2835 if (!std::isspace(str[i]))
2837 no_breakout_f =
false;
2838 start_new_string = i;
2846 if (expr_list.size() < ExpectedNumber)
2848 const std::string pre_tmp(
"<< ${ }: missing arguments>>");
2849 STRING_VECTOR tmp(ExpectedNumber - expr_list.size(), pre_tmp);
2850 expr_list.insert(expr_list.end(), tmp.begin(), tmp.end());
2857 if (str.length() >= i+2 && str.substr(i, 2) ==
"${")
2860 start_idx.push_back(i+2);
2863 else if (letter ==
'}' && open_brackets > 0)
2865 int start = start_idx[start_idx.size()-1];
2866 start_idx.pop_back();
2867 const std::string Replacement =
_DBE_expand(str.substr(start, i-start));
2868 if (start - 3 < (
int)0)
2869 str = Replacement + str.substr(i+1);
2871 str = str.substr(0, start-2) + Replacement + str.substr(i+1);
2872 l = (int)(str.size());
2873 i = start + (int)(Replacement.size()) - 3;
2880 expr_list.push_back(str.substr(start_new_string, i-start_new_string));
2882 if (expr_list.size() < ExpectedNumber)
2884 const std::string pre_tmp(
"<< ${ }: missing arguments>>");
2885 STRING_VECTOR tmp(ExpectedNumber - expr_list.size(), pre_tmp);
2886 expr_list.insert(expr_list.end(), tmp.begin(), tmp.end());
2898 std::string secure_Prefix =
prefix;
2922 ev.
original += VarName +
"' undefined>>";
2933 return expr.substr(1);
2936 else if (expr[0] ==
'&')
2940 STRING_VECTOR::const_iterator it = A.begin();
2941 std::string result = *it++;
2942 for (; it != A.end(); ++it) result += *it;
2948 else if (expr.length() >= 3 && expr.substr(0, 3) ==
"<->")
2952 const size_t L = A[1].length();
2954 while ((tmp = A[0].find(A[1])) != std::string::npos)
2955 A[0].replace(tmp, L, A[2]);
2961 else if (expr.length() >= 2 &&
2962 expr.substr(0, 1) ==
"=" &&
2963 expr.substr(0, 2) !=
"==")
2965 size_t funcnamestart = expr.find_first_not_of(
" \t", 1);
2966 if (funcnamestart != std::string::npos)
2968 size_t funcnameend = expr.find_first_of(
" \t",funcnamestart);
2969 std::string funcname = expr.substr(funcnamestart,
2970 funcnameend-funcnamestart);
2971 if (funcname ==
"log")
2978 else if (funcname ==
"log10")
2985 else if (funcname ==
"exp")
2992 else if (funcname ==
"sin")
2999 else if (funcname ==
"cos")
3006 else if (funcname ==
"tan")
3013 else if (funcname ==
"asin")
3020 else if (funcname ==
"acos")
3027 else if (funcname ==
"atan")
3034 else if (funcname ==
"atan2")
3042 else if (funcname ==
"sinh")
3049 else if (funcname ==
"cosh")
3056 else if (funcname ==
"tanh")
3063 #ifdef HAVE_INVERSE_HYPERBOLIC_SINE
3064 else if (funcname ==
"asinh")
3072 #ifdef HAVE_INVERSE_HYPERBOLIC_COSINE
3073 else if (funcname ==
"acosh")
3081 #ifdef HAVE_INVERSE_HYPERBOLIC_TANGENT
3082 else if (funcname ==
"atanh")
3090 else if (funcname ==
"sqrt")
3097 else if (funcname ==
"abs")
3104 else if (funcname ==
"max")
3108 STRING_VECTOR::const_iterator it = A.begin();
3110 for (; it != A.end(); ++it)
3114 else if (funcname ==
"min")
3118 STRING_VECTOR::const_iterator it = A.begin();
3120 for (; it != A.end(); ++it)
3124 else if (funcname ==
"ceil")
3131 else if (funcname ==
"floor")
3138 else if (funcname ==
"fmod")
3146 else if (funcname ==
"srand")
3155 else if (funcname ==
"rand")
3157 if (funcnameend >= expr.length() ||
3158 expr.find_first_not_of(
" \t", funcnameend) == std::string::npos)
3166 const unsigned int x = (RAND_MAX + 1u) / range;
3167 const unsigned int y = x * range;
3168 unsigned int returnval;
3172 }
while (returnval >= y);
3175 else if (funcname ==
"time")
3179 getpot_cerr <<
"ERROR: unrecognized function "
3180 << funcname << std::endl;
3187 else if (expr[0] ==
'+')
3190 STRING_VECTOR::const_iterator it = A.begin();
3192 for (; it != A.end(); ++it)
3197 else if (expr[0] ==
'-')
3200 STRING_VECTOR::const_iterator it = A.begin();
3202 for (; it != A.end(); ++it)
3207 else if (expr[0] ==
'*')
3210 STRING_VECTOR::const_iterator it = A.begin();
3212 for (; it != A.end(); ++it)
3217 else if (expr[0] ==
'/')
3220 STRING_VECTOR::const_iterator it = A.begin();
3225 for (; it != A.end(); ++it)
3234 else if (expr[0] ==
'^')
3237 STRING_VECTOR::const_iterator it = A.begin();
3239 for (; it != A.end(); ++it)
3245 else if (expr.length() >= 2 &&
3246 (expr.substr(0,2) ==
"==" || expr.substr(0,2) ==
">=" ||
3247 expr.substr(0,2) ==
"<=" || expr[0] ==
'>' || expr[0] ==
'<'))
3251 enum { EQ, GEQ, LEQ, GT, LT };
3253 if (expr.substr(0, 2) ==
"==")
3256 else if (expr.substr(0, 2) ==
">=")
3259 else if (expr.substr(0, 2) ==
"<=")
3262 else if (expr[0] ==
'>')
3269 if (op == GT || op == LT)
3275 std::string x_orig = a[0];
3279 STRING_VECTOR::const_iterator y_orig = a.begin();
3280 for (y_orig++; y_orig != a.end(); ++y_orig)
3285 if (x == 1e37 || y == 1e37)
3288 if ((op == EQ && x_orig == *y_orig) || (op == GEQ && x_orig >= *y_orig) ||
3289 (op == LEQ && x_orig <= *y_orig) || (op == GT && x_orig > *y_orig) ||
3290 (op == LT && x_orig < *y_orig))
3296 if ((op == EQ && x == y) || (op == GEQ && x >= y) ||
3297 (op == LEQ && x <= y) || (op == GT && x > y) ||
3298 (op == LT && x < y))
3309 else if (expr.length() >= 2 && expr.substr(0, 2) ==
"??")
3315 if (x == 1e37 || x < 0 || x >=
double(a.size() - 1))
3316 return a[a.size()-1];
3319 return a[int(x+0.5)];
3323 else if (expr[0] ==
'?')
3330 else if (a.size() > 2)
3334 else if (expr[0] ==
'!')
3338 if (Var->
name ==
"")
3345 else if (expr.length() >= 2 && expr.substr(0,2) ==
"@:")
3351 if (x == 1e37 || x < 0 || x >=
double(A[0].
size() - 1))
3352 return "<<1st index out of range>>";
3357 if (y != 1e37 && y > 0 && y <=
double(A[0].
size() - 1) && y > x)
3358 return A[0].substr(
int(x+0.5),
int(y+1.5) -
int(x+0.5));
3361 return A[0].substr(
int(x+0.5));
3363 return "<<2nd index out of range>>";
3367 char* tmp =
new char[2];
3368 tmp[0] = A[0][int(x+0.5)]; tmp[1] =
'\0';
3369 std::string result(tmp);
3375 else if (expr[0] ==
'@')
3380 if (Var->name ==
"")
3384 return std::string(Var->original);
3390 if (x == 1e37 || x < 0 || x >=
double(Var->value.size()))
3391 return "<<1st index out of range>>";
3396 int begin = int(x+0.5);
3398 if (y != 1e37 && y > 0 && y <=
double(Var->value.size()) && y > x)
3401 end = int(Var->value.size());
3403 return "<<2nd index out of range>>";
3405 std::string result = *(Var->get_element(begin));
3406 for (
int i = begin+1; i < end; i++)
3407 result += std::string(
" ") + *(Var->get_element(i));
3411 return *(Var->get_element(
int(x+0.5)));
3436 victorate(std::string, VecStr, itk)
3448 const char* KnownArgument1, ...)
const
3450 std::set<std::string> known_arguments;
3457 va_start(ap, KnownArgument1);
3458 known_arguments.insert(std::string(KnownArgument1));
3459 for (
unsigned i=1; i<
Number; i++)
3460 known_arguments.insert(std::string(va_arg(ap,
char *)));
3490 STRING_VECTOR::const_iterator it =
argv.begin();
3492 for (; it !=
argv.end(); ++it)
3500 if (Knowns.find(arg) == Knowns.end())
3501 ufos.push_back(*it);
3510 const char* KnownOption1, ...)
const
3512 std::set<std::string> known_options;
3519 va_start(ap, KnownOption1);
3520 known_options.insert(std::string(KnownOption1));
3521 for (
unsigned i=1; i<
Number; i++)
3522 known_options.insert(std::string(va_arg(ap,
char *)));
3558 STRING_VECTOR::const_iterator it =
argv.begin();
3560 for (; it !=
argv.end(); ++it)
3568 if (arg.length() < 1 || arg[0] !=
'-')
3571 if (Knowns.find(arg) == Knowns.end())
3572 ufos.push_back(*it);
3589 std::string KFL(KnownFlagList);
3592 if (ArgumentNumber == -1)
3594 STRING_VECTOR::const_iterator it =
argv.begin();
3596 for (; it !=
argv.end(); ++it)
3600 if (arg ==
"")
continue;
3603 if (arg.length() < 2)
3606 else if (arg[0] !=
'-')
3609 else if (arg[1] ==
'-')
3613 const char* p=arg.c_str();
3615 for (; *p !=
'\0' ; p++)
3616 if (KFL.find(*p) == std::string::npos) ufos += *p;
3624 for (
unsigned i=1; i<
argv.size(); i++)
3630 if (no_matches == ArgumentNumber)
3634 const char* p = Remain.c_str();
3636 for (; *p !=
'\0' ; p++)
3637 if (KFL.find(*p) == std::string::npos) ufos += *p;
3650 const char* KnownVariable1, ...)
const
3652 std::set<std::string> known_variables;
3659 va_start(ap, KnownVariable1);
3660 known_variables.insert(std::string(KnownVariable1));
3661 for (
unsigned i=1; i<
Number; i++)
3662 known_variables.insert(std::string(va_arg(ap,
char *)));
3693 if (Knowns.find(var_name) == Knowns.end())
3694 ufos.push_back((*it).name);
3711 const char* KnownSection1, ...)
const
3713 std::set<std::string> known_sections;
3720 va_start(ap, KnownSection1);
3721 known_sections.insert(std::string(KnownSection1));
3722 for (
unsigned i=1; i<
Number; i++)
3724 std::string tmp = std::string(va_arg(ap,
char *));
3726 if (tmp.length() == 0)
3729 if (tmp[tmp.length()-1] !=
'/')
3732 known_sections.insert(tmp);
3772 if (Knowns.find(sec_name) == Knowns.end())
3773 ufos.push_back(*it);
3784 std::set<std::string> known_nominuses;
3791 va_start(ap, Known);
3792 known_nominuses.insert(std::string(Known));
3793 for (
unsigned i=1; i<
Number; i++)
3795 std::string tmp = std::string(va_arg(ap,
char *));
3796 if (tmp.length() == 0)
3798 known_nominuses.insert(tmp);
3838 STRING_VECTOR::const_iterator it =
argv.begin();
3840 for (; it !=
argv.end(); ++it)
3847 if (arg.length() < 1)
3855 if (arg[0] ==
'[' && arg[arg.length()-1] ==
']')
3859 bool continue_f =
false;
3860 for (
unsigned i=0; i<arg.length() ; i++)
3871 if (Knowns.find(arg) == Knowns.end())
3872 ufos.push_back(*it);
3883 std::set<std::string>
3892 std::set<std::string>
3901 std::set<std::string>
3939 take(Value, FieldSeparator);
3944 inline const std::string*
3947 if (Idx >= value.size())
3950 return &(value[Idx]);
3958 original = std::string(Value);
3983 std::string Value_str = std::string(Value);
3984 std::string delimiters = std::string(FieldSeparator);
3987 std::string::size_type lastPos = Value_str.find_first_not_of(delimiters, 0);
3990 std::string::size_type pos = Value_str.find_first_of(delimiters, lastPos);
3994 while (std::string::npos != pos || std::string::npos != lastPos)
3997 value.push_back(Value_str.substr(lastPos, pos - lastPos));
4000 lastPos = Value_str.find_first_not_of(delimiters, pos);
4003 pos = Value_str.find_first_of(delimiters, lastPos);
4021 value = Other.
value;
4027 #ifdef GETPOT_NAMESPACE
4033 #endif // LIBMESH_GETPOT_H
std::set< std::string > get_requested_sections() const
STRING_VECTOR unidentified_nominuses() const
const std::string _get_remaining_string(const std::string &String, const std::string &Start) const
prefix extraction
GETPOT_MUTEX_DECLARE
we have some mutable non-thread-safe members, but we want to be able to call const member functions f...
static STRING_VECTOR _get_section_tree(const std::string &FullPath)
cuts a variable name into a tree of sub-sections.
int nominus_cursor
nominus vector
const std::string _get_string(std::istream &istr)
STRING_VECTOR get_section_names() const
std::string _DBE_expand(const std::string &str)
T _convert_to_type(const std::string &String, const T &Default) const
type conversion if possible
void disable_loop()
enable/disable search for an option in loop
void reset_cursor()
reset cursor to position '1'
void _record_argument_request(const std::string &Arg) const
if an argument is requested record it and the 'tag' the section branch to which it belongs...
STRING_VECTOR _read_in_stream(std::istream &istr)
bool argument_contains(unsigned Idx, const char *FlagList) const
Variable to be specified on the command line or in input files.
variable()
constructors, destructors, assignment operator
std::string name
data members
bool options_contain(const char *FlagList) const
flags
const char * _internal_managed_copy(const std::string &Arg) const
some functions return a char pointer to a temporarily existing string this function adds them to our ...
helper functor for creating sets of C-style strings
const std::string _get_until_closing_bracket(std::istream &istr)
bool search(const char *option)
search for a certain option and set cursor to position
STRING_VECTOR get_subsection_names(const std::string §ion_name) const
static std::string _convert_from_type(const T &Value)
const std::string _get_until_closing_square_bracket(std::istream &istr)
variable & operator=(const variable &Other)
ADRealEigenVector< T, D, asd > sqrt(const ADRealEigenVector< T, D, asd > &)
计算自动微分实数向量的平方根。
void _parse_argument_vector(const STRING_VECTOR &ARGV)
produce three basic data vectors:
void set(const char *VarName, const T &Value, const bool Requested=true)
setting variables i) from outside of GetPot (considering prefix etc.) ii) from inside, use '_set_variable()' below
T follow(const T &Default, const char *Option)
search for option and get argument at cursor++
bool _check_flags(const std::string &Str, const char *FlagList) const
support search for flags in a specific argument
bool search_failed() const
void disable_request_recording()
const std::string _get_next_token(std::istream &istr)
const variable * _request_variable(const char *) const
search (and record request) for a variable in 'variables' array
std::vector< unsigned > idx_nominus
bool operator()(const char *s1, const char *s2) const
STRING_VECTOR _DBE_get_expr_list(const std::string &str, const unsigned ExpectedNumber)
std::string prefix
member variables
std::vector< variable > variables
variables (arguments of the form "variable=value")
ADRealEigenVector< T, D, asd > abs(const ADRealEigenVector< T, D, asd > &)
计算自动微分实数向量的绝对值。
GetPot & operator=(const GetPot &)
STRING_VECTOR unidentified_variables() const
STRING_VECTOR get_variable_names() const
const char * _match_starting_string(const char *StartString)
support finding directly followed arguments
std::string unidentified_flags(const char *Known, int ArgumentNumber) const
T direct_follow(const T &Default, const char *Option)
directly followed arguments
STRING_VECTOR unidentified_arguments() const
GetPot - A class for parsing command line arguments and configuration files.
GetPot()
constructors, destructor, assignment operator
void absorb(const GetPot &Other)
absorbing contents of another GetPot object
void _basic_initialization()
STRING_VECTOR unidentified_options() const
unsigned vector_variable_size(const char *VarName) const
std::set< std::string > _requested_sections
void _skip_whitespace(std::istream &istr)
helpers to parse input file create an argument vector based on data found in an input file...
STRING_VECTOR argv
argument vector
T _convert_to_type_no_default(const char *VarName, const std::string &String, const T &Default) const
unsigned nominus_size() const
bool have_section(const char *section_name) const
Check for a section name.
void enable_request_recording()
T get_value_no_default(const char *VarName, const T &Default) const
access variables, but error out if not present scalar values
bool _search_string_vector(const STRING_VECTOR &Vec, const std::string &Str) const
search for a specific string
void _record_variable_request(const std::string &Arg) const
bool have_variable(const char *VarName) const
variables
const char * next_nominus()
const GetPot::variable * _DBE_get_variable(const std::string &str)
void set_prefix(const char *Prefix)
cursor oriented functions
void parse_input_stream(std::istream &FileStream, const std::string &FileName=std::string("ParsedFromStream"), const std::string &CommentStart=std::string("#"), const std::string &CommentEnd=std::string("\n"), const std::string &FieldSeparator=std::string(" \t\n"))
void reset_nominus_cursor()
nominus arguments
void clear_requests()
for ufo detection: recording requested arguments, options etc.
std::string next_nominus_string()
void init_multiple_occurrence()
void _set_variable(const std::string &VarName, const std::string &Value, const bool Requested)
helper functions
std::set< std::string > _requested_variables
std::string _process_section_label(const std::string &Section, STRING_VECTOR §ion_stack)
const variable * _find_variable(const char *) const
helpers for argument list processing
void parse_input_file(const std::string &FileName, const std::string &CommentStart=std::string("#"), const std::string &CommentEnd=std::string("\n"), const std::string &FieldSeparator=std::string(" \t\n"))
const char * operator[](unsigned Idx) const
direct access to command line arguments
std::string _field_separator
field separator (separating elements of a vector)
int print(std::ostream &out_stream=std::cout) const
output
STRING_VECTOR nominus_vector() const
void take(const char *Value, const char *FieldSeparator)
void parse_command_line(const int argc_, const char *const *argv_, const char *FieldSeparator=0x0)
Re-initialization methods.
std::set< std::string > get_requested_variables() const
STRING_VECTOR section_list
std::vector< std::string > STRING_VECTOR
const std::string * get_element(unsigned Idx) const
get a specific element in the string vector (return 0 if not present)
std::set< std::string > get_overridden_variables() const
T next(const T &Default)
get argument at cursor++
std::string _comment_start
comment delimiters
std::set< std::string > get_requested_arguments() const
Accessors for requested variables.
STRING_VECTOR unidentified_sections() const
std::set< std::string > overridden_vars
std::set< std::string > _requested_arguments
keeping track about arguments that are requested, so that the UFO detection can be simplified ...
std::string _DBE_expand_string(const std::string &str)
dollar bracket expressions
T get(unsigned Idx, const T &Default) const
std::set< const char *, ltstr > _internal_string_container
some functions return a char pointer to a string created on the fly.
T operator()(const char *VarName, const T &Default) const
scalar values