Fix ZenUtils compilation
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@21242 a1c6a512-1295-4272-9138-f99709370657
diff --git a/utils/zenutils/CMakeLists.txt b/utils/zenutils/CMakeLists.txt
index 0983d39..fe2fa91 100644
--- a/utils/zenutils/CMakeLists.txt
+++ b/utils/zenutils/CMakeLists.txt
@@ -6,7 +6,7 @@
INCLUDE_DIRECTORIES(
${zenutils_SOURCE_DIR}/libraries/beecrypt-4.1.2
- ${zenutils_SOURCE_DIR}/libraries/getpot-c++-1.1.17
+ ${zenutils_SOURCE_DIR}/libraries/getpot-c++-1.1.18
${zenutils_SOURCE_DIR}/libraries/pelib-0.9
${zenutils_SOURCE_DIR}/libraries/zlib123
${zenutils_SOURCE_DIR}/source/shared
diff --git a/utils/zenutils/libraries/getpot-c++-1.1.17/getpot/getpot.hpp b/utils/zenutils/libraries/getpot-c++-1.1.17/getpot/getpot.hpp
deleted file mode 100644
index 9986d17..0000000
--- a/utils/zenutils/libraries/getpot-c++-1.1.17/getpot/getpot.hpp
+++ /dev/null
@@ -1,2435 +0,0 @@
-// -*- c++ -*-
-// GetPot Version $$Version$$ $$Date$$
-//
-// WEBSITE: http://getpot.sourceforge.net
-//
-// NOTE: The LPGL License for this library is only valid in case that
-// it is not used for the production or development of applications
-// dedicated to military industry. This is what the author calls
-// the 'unofficial peace version of the LPGL'.
-//
-// This library is free software; you can redistribute it and/or modify
-// it under the terms of the GNU Lesser General Public License as
-// published by the Free Software Foundation; either version 2.1 of the
-// License, or (at your option) any later version.
-//
-// This library is distributed in the hope that it will be useful, but
-// WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
-// USA
-//
-// (C) 2001-2005 Frank R. Schaefer <fschaef@users.sf.net>
-//==========================================================================
-
-#ifndef __include_guard_GETPOT_H__
-#define __include_guard_GETPOT_H__
-
-#if defined(WIN32) || defined(SOLARIS_RAW) || (__GNUC__ == 2) || defined(__HP_aCC)
-#define strtok_r(a, b, c) strtok(a, b)
-#endif // WINDOWS or SOLARIS or gcc 2.* or HP aCC
-
-extern "C" {
-// leave the 'extern C' to make it 100% sure to work -
-// expecially with older distributions of header files.
-#ifndef WIN32
-// this is necessary (depending on OS)
-#include <ctype.h>
-#endif
-#include <stdio.h>
-#include <stdarg.h>
-#include <assert.h>
-}
-#include <cmath>
-#include <string>
-#include <vector>
-#include <algorithm>
-
-#include <fstream>
-#include <iostream> // not every compiler distribution includes <iostream>
-// // with <fstream>
-
-typedef std::vector<std::string> STRING_VECTOR;
-
-#define victorate(TYPE, VARIABLE, ITERATOR) \
- std::vector<TYPE>::const_iterator ITERATOR = (VARIABLE).begin(); \
- for(; (ITERATOR) != (VARIABLE).end(); (ITERATOR)++)
-
-
-class GetPot {
- //--------
- inline void __basic_initialization();
-public:
- // (*) constructors, destructor, assignment operator -----------------------
- inline GetPot();
- inline GetPot(const GetPot&);
- inline GetPot(const int argc_, char** argv_,
- const char* FieldSeparator=0x0);
- inline GetPot(const char* FileName,
- const char* CommentStart=0x0, const char* CommentEnd=0x0,
- const char* FieldSeparator=0x0);
- inline ~GetPot();
- inline GetPot& operator=(const GetPot&);
-
-
- // (*) absorbing contents of another GetPot object
- inline void absorb(const GetPot& That);
- // -- for ufo detection: recording requested arguments, options etc.
- inline void clear_requests();
- inline void disable_request_recording() { __request_recording_f = false; }
- inline void enable_request_recording() { __request_recording_f = true; }
-
- // (*) direct access to command line arguments -----------------------------
- inline const std::string operator[](unsigned Idx) const;
- inline int get(unsigned Idx, int Default) const;
- inline double get(unsigned Idx, const double& Default) const;
- inline const std::string get(unsigned Idx, const char* Default) const;
- inline unsigned size() const;
-
- // (*) flags ---------------------------------------------------------------
- inline bool options_contain(const char* FlagList) const;
- inline bool argument_contains(unsigned Idx, const char* FlagList) const;
-
- // (*) variables -----------------------------------------------------------
- // -- scalar values
- inline int operator()(const char* VarName, int Default) const;
- inline double operator()(const char* VarName, const double& Default) const;
- inline const std::string operator()(const char* VarName, const char* Default) const;
- // -- vectors
- inline int operator()(const char* VarName, int Default, unsigned Idx) const;
- inline double operator()(const char* VarName, const double& Default, unsigned Idx) const;
- inline const std::string operator()(const char* VarName, const char* Default, unsigned Idx) const;
-
- // -- setting variables
- // i) from outside of GetPot (considering prefix etc.)
- // ii) from inside, use '__set_variable()' below
- inline void set(const char* VarName, const char* Value, const bool Requested = true);
- inline void set(const char* VarName, const double& Value, const bool Requested = true);
- inline void set(const char* VarName, const int Value, const bool Requested = true);
-
- inline unsigned vector_variable_size(const char* VarName) const;
- inline STRING_VECTOR get_variable_names() const;
- inline STRING_VECTOR get_section_names() const;
-
-
- // (*) cursor oriented functions -------------------------------------------
- inline void set_prefix(const char* Prefix) { prefix = std::string(Prefix); }
- inline bool search_failed() const { return search_failed_f; }
-
- // -- enable/disable search for an option in loop
- inline void disable_loop() { search_loop_f = false; }
- inline void enable_loop() { search_loop_f = true; }
-
- // -- reset cursor to position '1'
- inline void reset_cursor();
- inline void init_multiple_occurrence();
-
- // -- search for a certain option and set cursor to position
- inline bool search(const char* option);
- inline bool search(unsigned No, const char* P, ...);
- // -- get argument at cursor++
- inline int next(int Default);
- inline double next(const double& Default);
- inline const std::string next(const char* Default);
- // -- search for option and get argument at cursor++
- inline int follow(int Default, const char* Option);
- inline double follow(const double& Default, const char* Option);
- inline const std::string follow(const char* Default, const char* Option);
- // -- search for one of the given options and get argument that follows it
- inline int follow(int Default, unsigned No, const char* Option, ...);
- inline double follow(const double& Default, unsigned No, const char* Option, ...);
- inline const std::string follow(const char* Default, unsigned No, const char* Option, ...);
- // -- lists of nominuses following an option
- inline std::vector<std::string> nominus_followers(const char* Option);
- inline std::vector<std::string> nominus_followers(unsigned No, ...);
-
- // -- directly followed arguments
- inline int direct_follow(int Default, const char* Option);
- inline double direct_follow(const double& Default, const char* Option);
- inline const std::string direct_follow(const char* Default, const char* Option);
-
- inline std::vector<std::string> string_tails(const char* StartString);
- inline std::vector<int> int_tails(const char* StartString, const int Default = 1);
- inline std::vector<double> double_tails(const char* StartString, const double Default = 1.0);
-
- // (*) nominus arguments ---------------------------------------------------
- inline STRING_VECTOR nominus_vector() const;
- inline unsigned nominus_size() const { return static_cast<unsigned int>(idx_nominus.size()); }
- inline std::string next_nominus();
-
- // (*) unidentified flying objects -----------------------------------------
- inline STRING_VECTOR unidentified_arguments(unsigned Number, const char* Known, ...) const;
- inline STRING_VECTOR unidentified_arguments(const STRING_VECTOR& Knowns) const;
- inline STRING_VECTOR unidentified_arguments() const;
-
- inline STRING_VECTOR unidentified_options(unsigned Number, const char* Known, ...) const;
- inline STRING_VECTOR unidentified_options(const STRING_VECTOR& Knowns) const;
- inline STRING_VECTOR unidentified_options() const;
-
- inline std::string unidentified_flags(const char* Known,
- int ArgumentNumber /* =-1 */) const;
-
- inline STRING_VECTOR unidentified_variables(unsigned Number, const char* Known, ...) const;
- inline STRING_VECTOR unidentified_variables(const STRING_VECTOR& Knowns) const;
- inline STRING_VECTOR unidentified_variables() const;
-
- inline STRING_VECTOR unidentified_sections(unsigned Number, const char* Known, ...) const;
- inline STRING_VECTOR unidentified_sections(const STRING_VECTOR& Knowns) const;
- inline STRING_VECTOR unidentified_sections() const;
-
- inline STRING_VECTOR unidentified_nominuses(unsigned Number, const char* Known, ...) const;
- inline STRING_VECTOR unidentified_nominuses(const STRING_VECTOR& Knowns) const;
- inline STRING_VECTOR unidentified_nominuses() const;
-
- // (*) output --------------------------------------------------------------
- inline int print() const;
-
-private:
- // (*) Type Declaration ----------------------------------------------------
- struct variable {
- //-----------
- // Variable to be specified on the command line or in input files.
- // (i.e. of the form var='12 312 341')
-
- // -- constructors, destructors, assignment operator
- variable();
- variable(const variable&);
- variable(const char* Name, const char* Value, const char* FieldSeparator);
- ~variable();
- variable& operator=(const variable& That);
-
- void take(const char* Value, const char* FieldSeparator);
-
- // -- get a specific element in the string vector
- // (return 0 if not present)
- const std::string* get_element(unsigned Idx) const;
-
- // -- data memebers
- std::string name; // identifier of variable
- STRING_VECTOR value; // value of variable stored in vector
- std::string original; // value of variable as given on command line
- };
-
- // (*) member variables --------------------------------------------------------------
- std::string prefix; // prefix automatically added in queries
- std::string section; // (for dollar bracket parsing)
- STRING_VECTOR section_list; // list of all parsed sections
- // -- argument vector
- STRING_VECTOR argv; // vector of command line arguments stored as strings
- unsigned cursor; // cursor for argv
- bool search_loop_f; // shall search start at beginning after
- // // reaching end of arg array ?
- bool search_failed_f; // flag indicating a failed search() operation
- // // (e.g. next() functions react with 'missed')
-
- // -- nominus vector
- int nominus_cursor; // cursor for nominus_pointers
- std::vector<unsigned> idx_nominus; // indecies of 'no minus' arguments
-
- // -- variables
- // (arguments of the form "variable=value")
- std::vector<variable> variables;
-
- // -- comment delimiters
- std::string _comment_start;
- std::string _comment_end;
-
- // -- field separator (separating elements of a vector)
- std::string _field_separator;
-
- // -- some functions return a char pointer to a temporarily existing string
- // this container makes them 'available' until the getpot object is destroyed.
- std::vector<char*> __internal_string_container;
-
- // -- keeping track about arguments that are requested, so that the UFO detection
- // can be simplified
- STRING_VECTOR _requested_arguments;
- STRING_VECTOR _requested_variables;
- STRING_VECTOR _requested_sections;
-
- bool __request_recording_f; // speed: request recording can be turned off
-
- // -- if an argument is requested record it and the 'tag' the section branch to which
- // it belongs. Caution: both functions mark the sections as 'tagged'.
- void __record_argument_request(const std::string& Arg);
- void __record_variable_request(const std::string& Arg);
-
- // (*) helper functions ----------------------------------------------------
- // set variable from inside GetPot (no prefix considered)
- inline void __set_variable(const char* VarName, const char* Value);
-
- // -- produce three basic data vectors:
- // - argument vector
- // - nominus vector
- // - variable dictionary
- inline void __parse_argument_vector(const STRING_VECTOR& ARGV);
-
- // -- helpers for argument list processing
- // * search for a variable in 'variables' array
- inline const variable* __find_variable(const char*) const;
- // * support finding directly followed arguments
- inline const char* __match_starting_string(const char* StartString);
- // * support search for flags in a specific argument
- inline bool __check_flags(const std::string& Str, const char* FlagList) const;
- // * type conversion if possible
- inline int __convert_to_type(const std::string& String, int Default) const;
- inline double __convert_to_type(const std::string& String, double Default) const;
- // * prefix extraction
- const std::string __get_remaining_string(const std::string& String,
- const std::string& Start) const;
- // * search for a specific string
- inline bool __search_string_vector(const STRING_VECTOR& Vec,
- const std::string& Str) const;
-
- // -- helpers to parse input file
- // create an argument vector based on data found in an input file, i.e.:
- // 1) delete comments (in between '_comment_start' '_comment_end')
- // 2) contract assignment expressions, such as
- // my-variable = '007 J. B.'
- // into
- // my-variable='007 J. B.'
- // 3) interprete sections like '[../my-section]' etc.
- inline void __skip_whitespace(std::istream& istr);
- inline const std::string __get_next_token(std::istream& istr);
- inline const std::string __get_string(std::istream& istr);
- inline const std::string __get_until_closing_bracket(std::istream& istr);
-
- inline STRING_VECTOR __read_in_stream(std::istream& istr);
- inline STRING_VECTOR __read_in_file(const char* FileName);
- inline std::string __process_section_label(const std::string& Section,
- STRING_VECTOR& section_stack);
-
- // -- dollar bracket expressions
- std::string __DBE_expand_string(const std::string str);
- std::string __DBE_expand(const std::string str);
- const GetPot::variable* __DBE_get_variable(const std::string str);
- STRING_VECTOR __DBE_get_expr_list(const std::string str, const unsigned ExpectedNumber);
-
- std::string __double2string(const double& Value) const {
- // -- converts a double integer into a string
- char* tmp = new char[128];
-#ifndef WIN32
- snprintf(tmp, (int)sizeof(char)*128, "%e", Value);
-#else
- _snprintf(tmp, sizeof(char)*128, "%e", Value);
-#endif
- std::string result(tmp);
- delete [] tmp;
- return result;
- }
-
- std::string __int2string(const int& Value) const {
- // -- converts an integer into a string
- char* tmp = new char[128];
-#ifndef WIN32
- snprintf(tmp, (int)sizeof(char)*128, "%i", Value);
-#else
- _snprintf(tmp, sizeof(char)*128, "%i", Value);
-#endif
- std::string result(tmp);
- delete [] tmp;
- return result;
- }
-
- STRING_VECTOR __get_section_tree(const std::string& FullPath) {
- // -- cuts a variable name into a tree of sub-sections. this is requested for recording
- // requested sections when dealing with 'ufo' detection.
- STRING_VECTOR result;
- const char* Start = FullPath.c_str();
-
- for(char *p = (char*)Start; *p ; p++) {
- if( *p == '/' ) {
- *p = '\0'; // set terminating zero for convinience
- const std::string Section = Start;
- *p = '/'; // reset slash at place
- result.push_back(Section);
- }
- }
-
- return result;
- }
-};
-
-
-///////////////////////////////////////////////////////////////////////////////
-// (*) constructors, destructor, assignment operator
-//.............................................................................
-//
-inline void
-GetPot::__basic_initialization()
-{
- cursor = 0; nominus_cursor = -1;
- search_failed_f = true; search_loop_f = true;
- prefix = ""; section = "";
-
- // automatic request recording for later ufo detection
- __request_recording_f = true;
-
- // comment start and end strings
- _comment_start = std::string("#");
- _comment_end = std::string("\n");
-
- // default: separate vector elements by whitespaces
- _field_separator = " \t\n";
-}
-
-inline
-GetPot::GetPot()
-{
- __basic_initialization();
-
- STRING_VECTOR _apriori_argv;
- _apriori_argv.push_back(std::string("Empty"));
- __parse_argument_vector(_apriori_argv);
-}
-
-inline
-GetPot::GetPot(const int argc_, char ** argv_,
- const char* FieldSeparator /* =0x0 */)
- // leave 'char**' non-const to honor less capable compilers ...
-{
- // TODO: Ponder over the problem when the argument list is of size = 0.
- // This is 'sabotage', but it can still occur if the user specifies
- // it himself.
- assert(argc_ >= 1);
- __basic_initialization();
-
- // if specified -> overwrite default string
- if( FieldSeparator ) _field_separator = std::string(FieldSeparator);
-
- // -- make an internal copy of the argument list:
- STRING_VECTOR _apriori_argv;
- // -- for the sake of clarity: we do want to include the first argument in the argument vector !
- // it will not be a nominus argument, though. This gives us a minimun vector size of one
- // which facilitates error checking in many functions. Also the user will be able to
- // retrieve the name of his application by "get[0]"
- _apriori_argv.push_back(std::string(argv_[0]));
- int i=1;
- for(; i<argc_; ++i) {
- std::string tmp(argv_[i]); // recall the problem with temporaries,
- _apriori_argv.push_back(tmp); // reference counting in arguement lists ...
- }
- __parse_argument_vector(_apriori_argv);
-}
-
-
-inline
-GetPot::GetPot(const char* FileName,
- const char* CommentStart /* = 0x0 */, const char* CommentEnd /* = 0x0 */,
- const char* FieldSeparator/* = 0x0 */)
-{
- __basic_initialization();
-
- // if specified -> overwrite default strings
- if( CommentStart ) _comment_start = std::string(CommentStart);
- if( CommentEnd ) _comment_end = std::string(CommentEnd);
- if( FieldSeparator ) _field_separator = FieldSeparator;
-
- STRING_VECTOR _apriori_argv;
- // -- file name is element of argument vector, however, it is not parsed for
- // variable assignments or nominuses.
- _apriori_argv.push_back(std::string(FileName));
-
- STRING_VECTOR args = __read_in_file(FileName);
- _apriori_argv.insert(_apriori_argv.begin()+1, args.begin(), args.end());
- __parse_argument_vector(_apriori_argv);
-}
-
-inline
-GetPot::GetPot(const GetPot& That)
-{ GetPot::operator=(That); }
-
-inline
-GetPot::~GetPot()
-{
- // may be some return strings had to be created, delete now !
- victorate(char*, __internal_string_container, it)
- delete [] *it;
-}
-
-inline GetPot&
-GetPot::operator=(const GetPot& That)
-{
- if (&That == this) return *this;
-
- _comment_start = That._comment_start;
- _comment_end = That._comment_end;
- argv = That.argv;
- variables = That.variables;
- prefix = That.prefix;
-
- cursor = That.cursor;
- nominus_cursor = That.nominus_cursor;
- search_failed_f = That.search_failed_f;
-
- idx_nominus = That.idx_nominus;
- search_loop_f = That.search_loop_f;
-
- return *this;
-}
-
-
-inline void
-GetPot::absorb(const GetPot& That)
-{
- if (&That == this) return;
-
- STRING_VECTOR __tmp(That.argv);
-
- __tmp.erase(__tmp.begin());
-
- __parse_argument_vector(__tmp);
-}
-
-inline void
-GetPot::clear_requests()
-{
- _requested_arguments.erase(_requested_arguments.begin(), _requested_arguments.end());
- _requested_variables.erase(_requested_variables.begin(), _requested_variables.end());
- _requested_sections.erase(_requested_sections.begin(), _requested_sections.end());
-}
-
-inline void
-GetPot::__parse_argument_vector(const STRING_VECTOR& ARGV)
-{
- if( ARGV.size() == 0 ) return;
-
- // build internal databases:
- // 1) array with no-minus arguments (usually used as filenames)
- // 2) variable assignments:
- // 'variable name' '=' number | string
- STRING_VECTOR section_stack;
- STRING_VECTOR::const_iterator it = ARGV.begin();
-
-
- section = "";
-
- // -- do not parse the first argument, so that it is not interpreted a s a nominus or so.
- argv.push_back(*it);
- ++it;
-
- // -- loop over remaining arguments
- unsigned i=1;
- for(; it != ARGV.end(); ++it, ++i) {
- std::string arg = *it;
-
- if( arg.length() == 0 ) continue;
-
- // -- [section] labels
- if( arg.length() > 1 && arg[0] == '[' && arg[arg.length()-1] == ']' ) {
-
- // (*) sections are considered 'requested arguments'
- if( __request_recording_f ) _requested_arguments.push_back(arg);
-
- const std::string Name = __DBE_expand_string(arg.substr(1, arg.length()-2));
- section = __process_section_label(Name, section_stack);
- // new section --> append to list of sections
- if( find(section_list.begin(), section_list.end(), section) == section_list.end() )
- if( section.length() != 0 ) section_list.push_back(section);
- argv.push_back(arg);
- }
- else {
- arg = section + __DBE_expand_string(arg);
- argv.push_back(arg);
- }
-
- // -- separate array for nominus arguments
- if( arg[0] != '-' ) idx_nominus.push_back(unsigned(i));
-
- // -- variables: does arg contain a '=' operator ?
- const char* p = arg.c_str();
- for(; *p ; p++) {
- if( *p == '=' ) {
- // (*) record for later ufo detection
- // arguments carriying variables are always treated as 'requested' arguments.
- // as a whole! That is 'x=4712' is considered a requested argument.
- //
- // unrequested variables have to be detected with the ufo-variable
- // detection routine.
- if( __request_recording_f ) _requested_arguments.push_back(arg);
-
- // set terminating 'zero' to treat first part as single string
- // => arg (from start to 'p') = Name of variable
- // p+1 (until terminating zero) = value of variable
- char* o = (char*)p++;
- *o = '\0'; // set temporary terminating zero
- // __set_variable(...)
- // calls __find_variable(...) which registers the search
- // temporarily disable this
- const bool tmp = __request_recording_f;
- __request_recording_f = false;
- __set_variable(arg.c_str(), p); // v-name = c_str() bis 'p', value = rest
- __request_recording_f = tmp;
- *o = '='; // reset the original '='
- break;
- }
- }
- }
-}
-
-
-inline STRING_VECTOR
-GetPot::__read_in_file(const char* FileName)
-{
- std::ifstream i(FileName);
- if( ! i ) return STRING_VECTOR();
- // argv[0] == the filename of the file that was read in
- return __read_in_stream(i);
-}
-
-inline STRING_VECTOR
-GetPot::__read_in_stream(std::istream& istr)
-{
- STRING_VECTOR brute_tokens;
- while(istr) {
- __skip_whitespace(istr);
-
- const std::string Token = __get_next_token(istr);
- if( Token.length() == 0 || Token[0] == EOF) break;
- brute_tokens.push_back(Token);
- }
-
- // -- reduce expressions of token1'='token2 to a single
- // string 'token1=token2'
- // -- copy everything into 'argv'
- // -- arguments preceded by something like '[' name ']' (section)
- // produce a second copy of each argument with a prefix '[name]argument'
- unsigned i1 = 0;
- unsigned i2 = 1;
- unsigned i3 = 2;
-
- STRING_VECTOR arglist;
- while( i1 < brute_tokens.size() ) {
- const std::string& SRef = brute_tokens[i1];
- // 1) concatinate 'abcdef' '=' 'efgasdef' to 'abcdef=efgasdef'
- // note: java.lang.String: substring(a,b) = from a to b-1
- // C++ string: substr(a,b) = from a to a + b
- if( i2 < brute_tokens.size() && brute_tokens[i2] == "=" ) {
- if( i3 >= brute_tokens.size() )
- arglist.push_back(brute_tokens[i1] + brute_tokens[i2]);
- else
- arglist.push_back(brute_tokens[i1] + brute_tokens[i2] + brute_tokens[i3]);
- i1 = i3+1; i2 = i3+2; i3 = i3+3;
- continue;
- }
- else {
- arglist.push_back(SRef);
- i1=i2; i2=i3; i3++;
- }
- }
- return arglist;
-}
-
-inline void
-GetPot::__skip_whitespace(std::istream& istr)
- // find next non-whitespace while deleting comments
-{
- int tmp = istr.get();
- do {
- // -- search a non whitespace
- while( isspace(tmp) ) {
- tmp = istr.get();
- if( ! istr ) return;
- }
-
- // -- look if characters match the comment starter string
- const std::istream::pos_type Pos = istr.tellg();
- unsigned i=0;
- for(; i<_comment_start.length() ; ++i) {
- if( tmp != _comment_start[i] ) {
-// HACK: The following line throws off msvc8:
-// istr.seekg(Pos);
- // -- one step more backwards, since 'tmp' already at non-whitespace
- istr.unget();
- return;
- }
- tmp = istr.get();
- if( ! istr ) { istr.unget(); return; }
- }
- // 'tmp' contains last character of _comment_starter
-
- // -- comment starter found -> search for comment ender
- unsigned match_no=0;
- while(1+1 == 2) {
- tmp = istr.get();
- if( ! istr ) { istr.unget(); return; }
-
- if( tmp == _comment_end[match_no] ) {
- match_no++;
- if( match_no == _comment_end.length() ) {
- istr.unget();
- break; // shuffle more whitespace, end of comment found
- }
- }
- else
- match_no = 0;
- }
-
- tmp = istr.get();
-
- } while( istr );
- istr.unget();
-}
-
-inline const std::string
-GetPot::__get_next_token(std::istream& istr)
- // get next concatinates string token. consider quotes that embrace
- // whitespaces
-{
- std::string token;
- int tmp = 0;
- int last_letter = 0;
- while(1+1 == 2) {
- last_letter = tmp; tmp = istr.get();
- if( tmp == EOF
- || ((tmp == ' ' || tmp == '\t' || tmp == '\n') && last_letter != '\\') ) {
- return token;
- }
- else if( tmp == '\'' && last_letter != '\\' ) {
- // QUOTES: un-backslashed quotes => it's a string
- token += __get_string(istr);
- continue;
- }
- else if( tmp == '{' && last_letter == '$') {
- token += '{' + __get_until_closing_bracket(istr);
- continue;
- }
- else if( tmp == '$' && last_letter == '\\') {
- token += tmp; tmp = 0; // so that last_letter will become = 0, not '$';
- continue;
- }
- else if( tmp == '\\' && last_letter != '\\')
- continue; // don't append un-backslashed backslashes
- token += tmp;
- }
-}
-
-inline const std::string
-GetPot::__get_string(std::istream& istr)
- // parse input until next matching '
-{
- std::string str;
- int tmp = 0;
- int last_letter = 0;
- while(1 + 1 == 2) {
- last_letter = tmp; tmp = istr.get();
- if( tmp == EOF) return str;
- // un-backslashed quotes => it's the end of the string
- else if( tmp == '\'' && last_letter != '\\') return str;
- else if( tmp == '\\' && last_letter != '\\') continue; // don't append
-
- str += tmp;
- }
-}
-
-inline const std::string
-GetPot::__get_until_closing_bracket(std::istream& istr)
- // parse input until next matching }
-{
- std::string str = "";
- int tmp = 0;
- int last_letter = 0;
- int brackets = 1;
- while(1 + 1 == 2) {
- last_letter = tmp; tmp = istr.get();
- if( tmp == EOF) return str;
- else if( tmp == '{' && last_letter == '$') brackets += 1;
- else if( tmp == '}') {
- brackets -= 1;
- // un-backslashed brackets => it's the end of the string
- if( brackets == 0) return str + '}';
- else if( tmp == '\\' && last_letter != '\\')
- continue; // do not append an unbackslashed backslash
- }
- str += tmp;
- }
-}
-
-inline std::string
-GetPot::__process_section_label(const std::string& Section,
- STRING_VECTOR& section_stack)
-{
- std::string sname = Section;
- // 1) subsection of actual section ('./' prefix)
- if( sname.length() >= 2 && sname.substr(0, 2) == "./" ) {
- sname = sname.substr(2);
- }
- // 2) subsection of parent section ('../' prefix)
- else if( sname.length() >= 3 && sname.substr(0, 3) == "../" ) {
- do {
- if( section_stack.end() != section_stack.begin() )
- section_stack.pop_back();
- sname = sname.substr(3);
- } while( sname.substr(0, 3) == "../" );
- }
- // 3) subsection of the root-section
- else {
- section_stack.erase(section_stack.begin(), section_stack.end());
- // [] => back to root section
- }
-
- if( sname != "" ) {
- // parse section name for 'slashes'
- unsigned i=0;
- while( i < sname.length() ) {
- if( sname[i] == '/' ) {
- section_stack.push_back(sname.substr(0,i));
- if( i+1 < sname.length()-1 )
- sname = sname.substr(i+1);
- i = 0;
- }
- else
- ++i;
- }
- section_stack.push_back(sname);
- }
- std::string section = "";
- if( section_stack.size() != 0 ) {
- victorate(std::string, section_stack, it)
- section += *it + "/";
- }
- return section;
-}
-
-
-// convert string to DOUBLE, if not possible return Default
-inline double
-GetPot::__convert_to_type(const std::string& String, double Default) const
-{
- double tmp;
- if( sscanf(String.c_str(),"%lf", &tmp) != 1 ) return Default;
- return tmp;
-}
-
-// convert string to INT, if not possible return Default
-inline int
-GetPot::__convert_to_type(const std::string& String, int Default) const
-{
- // NOTE: intermediate results may be floating points, so that the string
- // may look like 2.0e1 (i.e. float format) => use float conversion
- // in any case.
- return (int)__convert_to_type(String, (double)Default);
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// (*) cursor oriented functions
-//.............................................................................
-inline const std::string
-GetPot::__get_remaining_string(const std::string& String, const std::string& Start) const
- // Checks if 'String' begins with 'Start' and returns the remaining String.
- // Returns None if String does not begin with Start.
-{
- if( Start == "" ) return String;
- // note: java.lang.String: substring(a,b) = from a to b-1
- // C++ string: substr(a,b) = from a to a + b
- if( String.find(Start) == 0 ) return String.substr(Start.length());
- else return "";
-}
-
-// -- search for a certain argument and set cursor to position
-inline bool
-GetPot::search(const char* Option)
-{
- unsigned OldCursor = cursor;
- const std::string SearchTerm = prefix + Option;
-
- // (*) record requested arguments for later ufo detection
- __record_argument_request(SearchTerm);
-
- if( OldCursor >= argv.size() ) OldCursor = static_cast<unsigned int>(argv.size()) - 1;
- search_failed_f = true;
-
- // (*) first loop from cursor position until end
- unsigned c = cursor;
- for(; c < argv.size(); c++) {
- if( argv[c] == SearchTerm )
- { cursor = c; search_failed_f = false; return true; }
- }
- if( ! search_loop_f ) return false;
-
- // (*) second loop from 0 to old cursor position
- for(c = 1; c < OldCursor; c++) {
- if( argv[c] == SearchTerm )
- { cursor = c; search_failed_f = false; return true; }
- }
- // in case nothing is found the cursor stays where it was
- return false;
-}
-
-
-inline bool
-GetPot::search(unsigned No, const char* P, ...)
-{
- // (*) recording the requested arguments happens in subroutine 'search'
- if( No == 0 ) return false;
-
- // search for the first argument
- if( search(P) == true ) return true;
-
- // start interpreting variable argument list
- va_list ap;
- va_start(ap, P);
- unsigned i = 1;
- for(; i < No; ++i) {
- char* Opt = va_arg(ap, char *);
- if( search(Opt) == true ) break;
- }
-
- if( i < No ) {
- ++i;
- // loop was left before end of array --> hit but
- // make sure that the rest of the search terms is marked
- // as requested.
- for(; i < No; ++i) {
- char* Opt = va_arg(ap, char *);
- // (*) record requested arguments for later ufo detection
- __record_argument_request(Opt);
- }
- va_end(ap);
- return true;
- }
-
- va_end(ap);
- // loop was left normally --> no hit
- return false;
-}
-
-inline void
-GetPot::reset_cursor()
-{ search_failed_f = false; cursor = 0; }
-
-inline void
-GetPot::init_multiple_occurrence()
-{ disable_loop(); reset_cursor(); }
-///////////////////////////////////////////////////////////////////////////////
-// (*) direct access to command line arguments
-//.............................................................................
-//
-inline const std::string
-GetPot::operator[](unsigned idx) const
-{ return idx < argv.size() ? argv[idx] : ""; }
-
-inline int
-GetPot::get(unsigned Idx, int Default) const
-{
- if( Idx >= argv.size() ) return Default;
- return __convert_to_type(argv[Idx], Default);
-}
-
-inline double
-GetPot::get(unsigned Idx, const double& Default) const
-{
- if( Idx >= argv.size() ) return Default;
- return __convert_to_type(argv[Idx], Default);
-}
-
-inline const std::string
-GetPot::get(unsigned Idx, const char* Default) const
-{
- if( Idx >= argv.size() ) return Default;
- else return argv[Idx];
-}
-
-inline unsigned
-GetPot::size() const
-{ return static_cast<unsigned int>(argv.size()); }
-
-
-// -- next() function group
-inline int
-GetPot::next(int Default)
-{
- if( search_failed_f ) return Default;
- cursor++;
- if( cursor >= argv.size() )
- { cursor = static_cast<unsigned int>(argv.size()); return Default; }
-
- // (*) record requested argument for later ufo detection
- __record_argument_request(argv[cursor]);
-
- const std::string Remain = __get_remaining_string(argv[cursor], prefix);
-
- return Remain != "" ? __convert_to_type(Remain, Default) : Default;
-}
-
-inline double
-GetPot::next(const double& Default)
-{
- if( search_failed_f ) return Default;
- cursor++;
-
- if( cursor >= argv.size() )
- { cursor = static_cast<unsigned int>(argv.size()); return Default; }
-
- // (*) record requested argument for later ufo detection
- __record_argument_request(argv[cursor]);
-
- std::string Remain = __get_remaining_string(argv[cursor], prefix);
-
- return Remain != "" ? __convert_to_type(Remain, Default) : Default;
-}
-
-inline const std::string
-GetPot::next(const char* Default)
-{
- if( search_failed_f ) return Default;
- cursor++;
-
- if( cursor >= argv.size() )
- { cursor = static_cast<unsigned int>(argv.size()); return Default; }
-
- // (*) record requested argument for later ufo detection
- __record_argument_request(argv[cursor]);
-
- const std::string Remain = __get_remaining_string(argv[cursor], prefix);
-
- if( Remain == "" ) return Default;
-
-
- // (*) function returns a pointer to a char array (inside Remain)
- // this array will be deleted, though after this function call.
- // To ensure propper functioning, create a copy inside *this
- // object and only delete it, when *this is deleted.
- char* result = new char[Remain.length()+1];
- strncpy(result, Remain.c_str(), Remain.length()+1);
-
- // store the created string internally, delete if when object deleted
- __internal_string_container.push_back(result);
-
- return result;
-}
-
-// -- follow() function group
-// distinct option to be searched for
-inline int
-GetPot::follow(int Default, const char* Option)
-{
- // (*) record requested of argument is entirely handled in 'search()' and 'next()'
- if( search(Option) == false ) return Default;
- return next(Default);
-}
-
-inline double
-GetPot::follow(const double& Default, const char* Option)
-{
- // (*) record requested of argument is entirely handled in 'search()' and 'next()'
- if( search(Option) == false ) return Default;
- return next(Default);
-}
-
-inline const std::string
-GetPot::follow(const char* Default, const char* Option)
-{
- // (*) record requested of argument is entirely handled in 'search()' and 'next()'
- if( search(Option) == false ) return Default;
- return next(Default);
-}
-
-// -- second follow() function group
-// multiple option to be searched for
-inline int
-GetPot::follow(int Default, unsigned No, const char* P, ...)
-{
- // (*) record requested of argument is entirely handled in 'search()' and 'next()'
- if( No == 0 ) return Default;
- if( search(P) == true ) return next(Default);
-
- va_list ap;
- va_start(ap, P);
- unsigned i=1;
- for(; i<No; ++i) {
- char* Opt = va_arg(ap, char *);
- if( search(Opt) == true ) {
- va_end(ap);
- return next(Default);
- }
- }
- va_end(ap);
- return Default;
-}
-
-inline double
-GetPot::follow(const double& Default, unsigned No, const char* P, ...)
-{
- // (*) record requested of argument is entirely handled in 'search()' and 'next()'
- if( No == 0 ) return Default;
- if( search(P) == true ) return next(Default);
-
- va_list ap;
- va_start(ap, P);
- for(unsigned i=1; i<No; ++i) {
- char* Opt = va_arg(ap, char *);
- if( search(Opt) == true ) {
- va_end(ap);
- return next(Default);
- }
- }
- va_end(ap);
- return Default;
-}
-
-inline const std::string
-GetPot::follow(const char* Default, unsigned No, const char* P, ...)
-{
- // (*) record requested of argument is entirely handled in 'search()' and 'next()'
- if( No == 0 ) return Default;
- if( search(P) == true ) return next(Default);
-
- va_list ap;
- va_start(ap, P);
- unsigned i=1;
- for(; i<No; ++i) {
- char* Opt = va_arg(ap, char *);
- if( search(Opt) == true ) {
- va_end(ap);
- return next(Default);
- }
- }
- va_end(ap);
- return Default;
-}
-
-
-///////////////////////////////////////////////////////////////////////////////
-// (*) lists of nominus following an option
-//.............................................................................
-//
-inline std::vector<std::string>
-GetPot::nominus_followers(const char* Option)
-{
- std::vector<std::string> result_list;
- if( search(Option) == false ) return result_list;
- while( 1 + 1 == 2 ) {
- ++cursor;
- if( cursor >= argv.size() ) {
- cursor = argv.size() - 1;
- return result_list;
- }
- if( argv[cursor].length() >= 1 ) {
- if( argv[cursor][0] == '-' ) {
- return result_list;
- }
- // -- record for later ufo-detection
- __record_argument_request(argv[cursor]);
- // -- append to the result list
- result_list.push_back(argv[cursor]);
- }
- }
-}
-
-inline std::vector<std::string>
-GetPot::nominus_followers(unsigned No, ...)
-{
- std::vector<std::string> result_list;
- // (*) record requested of argument is entirely handled in 'search()'
- // and 'nominus_followers()'
- if( No == 0 ) return result_list;
-
- va_list ap;
- va_start(ap, No);
- for(unsigned i=0; i<No; ++i) {
- char* Option = va_arg(ap, char *);
- std::vector<std::string> tmp = nominus_followers(Option);
- result_list.insert(result_list.end(), tmp.begin(), tmp.end());
-
- // std::cerr << "option = '" << Option << "'" << std::endl;
- // std::cerr << "length = " << tmp.size() << std::endl;
- // std::cerr << "new result list = <";
- // for(std::vector<std::string>::const_iterator it = result_list.begin();
- // it != result_list.end(); ++it)
- // std::cerr << *it << ", ";
- // std::cerr << ">\n";
- }
- va_end(ap);
- return result_list;
-}
-
-
-///////////////////////////////////////////////////////////////////////////////
-// (*) directly connected options
-//.............................................................................
-//
-inline int
-GetPot::direct_follow(int Default, const char* Option)
-{
- const char* FollowStr = __match_starting_string(Option);
- if( FollowStr == 0x0 ) return Default;
-
- // (*) record requested of argument for later ufo-detection
- __record_argument_request(std::string(Option) + FollowStr);
-
- if( ++cursor >= static_cast<unsigned int>(argv.size()) ) cursor = static_cast<unsigned int>(argv.size());
- return __convert_to_type(FollowStr, Default);
-}
-
-inline double
-GetPot::direct_follow(const double& Default, const char* Option)
-{
- const char* FollowStr = __match_starting_string(Option);
- if( FollowStr == 0 ) return Default;
-
- // (*) record requested of argument for later ufo-detection
- __record_argument_request(std::string(Option) + FollowStr);
-
- if( ++cursor >= static_cast<unsigned int>(argv.size()) ) cursor = static_cast<unsigned int>(argv.size());
- return __convert_to_type(FollowStr, Default);
-}
-
-inline const std::string
-GetPot::direct_follow(const char* Default, const char* Option)
-{
- if( search_failed_f ) return Default;
- const char* FollowStr = __match_starting_string(Option);
- if( FollowStr == 0 ) return Default;
-
- // (*) record requested of argument for later ufo-detection
- if( FollowStr ) __record_argument_request(std::string(Option) + FollowStr);
-
- if( ++cursor >= static_cast<unsigned int>(argv.size()) ) cursor = static_cast<unsigned int>(argv.size());
- return std::string(FollowStr);
-}
-
-inline std::vector<std::string>
-GetPot::string_tails(const char* StartString)
-{
- std::vector<std::string> result;
- const unsigned N = static_cast<unsigned int>(strlen(StartString));
-
- std::vector<std::string>::iterator it = argv.begin();
-
- unsigned idx = 0;
- while( it != argv.end() ) {
- // (*) does start string match the given option?
- // NO -> goto next option
- if( strncmp(StartString, (*it).c_str(), N) != 0) { ++it; ++idx; continue; }
-
- // append the found tail to the result vector
- result.push_back((*it).substr(N));
-
- // adapt the nominus vector
- std::vector<unsigned>::iterator nit = idx_nominus.begin();
- for(; nit != idx_nominus.end(); ++nit) {
- if( *nit == idx ) {
- idx_nominus.erase(nit);
- for(; nit != idx_nominus.end(); ++nit) *nit -= 1;
- break;
- }
- }
-
- // erase the found option
- argv.erase(it);
-
- // 100% safe solution: set iterator back to the beginning.
- // (normally, 'it--' would be enough, but who knows how the
- // iterator is implemented and .erase() definitely invalidates
- // the current iterator position.
- if( argv.empty() ) break;
- it = argv.begin();
- }
- cursor = 0;
- nominus_cursor = -1;
- return result;
-}
-
-inline std::vector<int>
-GetPot::int_tails(const char* StartString, const int Default /* = -1 */)
-{
- std::vector<int> result;
- const unsigned N = static_cast<unsigned int>(strlen(StartString));
-
- std::vector<std::string>::iterator it = argv.begin();
-
- unsigned idx = 0;
- while( it != argv.end() ) {
- // (*) does start string match the given option?
- // NO -> goto next option
- if( strncmp(StartString, (*it).c_str(), N) != 0) { ++it; ++idx; continue; }
-
- // append the found tail to the result vector
- result.push_back(__convert_to_type((*it).substr(N), Default));
-
- // adapt the nominus vector
- std::vector<unsigned>::iterator nit = idx_nominus.begin();
- for(; nit != idx_nominus.end(); ++nit) {
- if( *nit == idx ) {
- idx_nominus.erase(nit);
- for(; nit != idx_nominus.end(); ++nit) *nit -= 1;
- break;
- }
- }
-
- // erase the found option
- argv.erase(it);
-
- // 100% safe solution: set iterator back to the beginning.
- // (normally, 'it--' would be enough, but who knows how the
- // iterator is implemented and .erase() definitely invalidates
- // the current iterator position.
- if( argv.empty() ) break;
- it = argv.begin();
- }
- cursor = 0;
- nominus_cursor = -1;
- return result;
-}
-
-inline std::vector<double>
-GetPot::double_tails(const char* StartString,
- const double Default /* = -1.0 */)
-{
- std::vector<double> result;
- const unsigned N = static_cast<unsigned int>(strlen(StartString));
-
- std::vector<std::string>::iterator it = argv.begin();
- unsigned idx = 0;
- while( it != argv.end() ) {
- // (*) does start string match the given option?
- // NO -> goto next option
- if( strncmp(StartString, (*it).c_str(), N) != 0) { ++it; ++idx; continue; }
-
- // append the found tail to the result vector
- result.push_back(__convert_to_type((*it).substr(N), Default));
-
- // adapt the nominus vector
- std::vector<unsigned>::iterator nit = idx_nominus.begin();
- for(; nit != idx_nominus.end(); ++nit) {
- if( *nit == idx ) {
- idx_nominus.erase(nit);
- for(; nit != idx_nominus.end(); ++nit) *nit -= 1;
- break;
- }
- }
-
- // erase the found option
- argv.erase(it);
-
- // 100% safe solution: set iterator back to the beginning.
- // (normally, 'it--' would be enough, but who knows how the
- // iterator is implemented and .erase() definitely invalidates
- // the current iterator position.
- if( argv.empty() ) break;
- it = argv.begin();
- }
- cursor = 0;
- nominus_cursor = -1;
- return result;
-}
-
-
-
-
-
-inline const char*
-GetPot::__match_starting_string(const char* StartString)
- // pointer to the place where the string after
- // the match inside the found argument starts.
- // 0 no argument matches the starting string.
-{
- const unsigned N = static_cast<unsigned int>(strlen(StartString));
- unsigned OldCursor = cursor;
-
- if( OldCursor >= static_cast<unsigned int>(argv.size()) ) OldCursor = static_cast<unsigned int>(argv.size()) - 1;
- search_failed_f = true;
-
- // (*) first loop from cursor position until end
- unsigned c = cursor;
- for(; c < argv.size(); c++) {
- if( strncmp(StartString, argv[c].c_str(), N) == 0)
- { cursor = c; search_failed_f = false; return &(argv[c].c_str()[N]); }
- }
-
- if( ! search_loop_f ) return false;
-
- // (*) second loop from 0 to old cursor position
- for(c = 1; c < OldCursor; c++) {
- if( strncmp(StartString, argv[c].c_str(), N) == 0)
- { cursor = c; search_failed_f = false; return &(argv[c].c_str()[N]); }
- }
- return 0;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// (*) search for flags
-//.............................................................................
-//
-inline bool
-GetPot::options_contain(const char* FlagList) const
-{
- // go through all arguments that start with a '-' (but not '--')
- std::string str;
- STRING_VECTOR::const_iterator it = argv.begin();
- for(; it != argv.end(); ++it) {
- str = __get_remaining_string(*it, prefix);
-
- if( str.length() >= 2 && str[0] == '-' && str[1] != '-' )
- if( __check_flags(str, FlagList) ) return true;
- }
- return false;
-}
-
-inline bool
-GetPot::argument_contains(unsigned Idx, const char* FlagList) const
-{
- if( Idx >= argv.size() ) return false;
-
- // (*) record requested of argument for later ufo-detection
- // an argument that is checked for flags is considered to be 'requested'
- ((GetPot*)this)->__record_argument_request(argv[Idx]);
-
- if( prefix == "" )
- // search argument for any flag in flag list
- return __check_flags(argv[Idx], FlagList);
-
- // if a prefix is set, then the argument index is the index
- // inside the 'namespace'
- // => only check list of arguments that start with prefix
- unsigned no_matches = 0;
- unsigned i=0;
- for(; i<argv.size(); ++i) {
- const std::string Remain = __get_remaining_string(argv[i], prefix);
- if( Remain != "") {
- no_matches += 1;
- if( no_matches == Idx)
- return __check_flags(Remain, FlagList);
- }
- }
- // no argument in this namespace
- return false;
-}
-
-inline bool
-GetPot::__check_flags(const std::string& Str, const char* FlagList) const
-{
- const char* p=FlagList;
- for(; *p != '\0' ; p++)
- if( Str.find(*p) != std::string::npos ) return true; // found something
- return false;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// (*) nominus arguments
-inline STRING_VECTOR
-GetPot::nominus_vector() const
- // return vector of nominus arguments
-{
- STRING_VECTOR nv;
- std::vector<unsigned>::const_iterator it = idx_nominus.begin();
- for(; it != idx_nominus.end(); ++it) {
- nv.push_back(argv[*it]);
-
- // (*) record for later ufo-detection
- // when a nominus vector is requested, the entire set of nominus arguments are
- // tagged as 'requested'
- ((GetPot*)this)->__record_argument_request(argv[*it]);
- }
- return nv;
-}
-
-inline std::string
-GetPot::next_nominus()
-{
- if( nominus_cursor < int(idx_nominus.size()) - 1 ) {
- const std::string Tmp = argv[idx_nominus[++nominus_cursor]];
-
- // (*) record for later ufo-detection
- __record_argument_request(Tmp);
-
- // -- cannot use the Tmp variable, since it is temporary and c_str() will return a pointer
- // to something that does no longer exist.
- return Tmp;
- }
- return std::string("");
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// (*) variables
-//.............................................................................
-//
-inline int
-GetPot::operator()(const char* VarName, int Default) const
-{
- // (*) recording of requested variables happens in '__find_variable()'
- const variable* sv = __find_variable(VarName);
- if( sv == 0 ) return Default;
- return __convert_to_type(sv->original, Default);
-}
-
-inline double
-GetPot::operator()(const char* VarName, const double& Default) const
-{
- // (*) recording of requested variables happens in '__find_variable()'
- const variable* sv = __find_variable(VarName);
- if( sv == 0 ) return Default;
- return __convert_to_type(sv->original, Default);
-}
-
-inline const std::string
-GetPot::operator()(const char* VarName, const char* Default) const
-{
- // (*) recording of requested variables happens in '__find_variable()'
- const variable* sv = __find_variable(VarName);
- if( sv == 0 ) return Default;
- // -- returning a c_str() pointer is OK here, since the variable remains existant,
- // while 'sv' of course is delete at the end of the function.
- return sv->original;
-}
-
-inline int
-GetPot::operator()(const char* VarName, int Default, unsigned Idx) const
-{
- // (*) recording of requested variables happens in '__find_variable()'
- const variable* sv = __find_variable(VarName);
- if( sv == 0 ) return Default;
- const std::string* element = sv->get_element(Idx);
- if( element == 0 ) return Default;
- return __convert_to_type(*element, Default);
-}
-
-inline double
-GetPot::operator()(const char* VarName, const double& Default, unsigned Idx) const
-{
- // (*) recording of requested variables happens in '__find_variable()'
- const variable* sv = __find_variable(VarName);
- if( sv == 0 ) return Default;
- const std::string* element = sv->get_element(Idx);
- if( element == 0 ) return Default;
- return __convert_to_type(*element, Default);
-}
-
-inline const std::string
-GetPot::operator()(const char* VarName, const char* Default, unsigned Idx) const
-{
- // (*) recording of requested variables happens in '__find_variable()'
- const variable* sv = __find_variable(VarName);
- if( sv == 0 ) return Default;
- const std::string* element = sv->get_element(Idx);
- if( element == 0 ) return Default;
- return *element;
-}
-
-inline void
-GetPot::__record_argument_request(const std::string& Name)
-{
- if( ! __request_recording_f ) return;
-
- // (*) record requested variable for later ufo detection
- _requested_arguments.push_back(Name);
-
- // (*) record considered section for ufo detection
- STRING_VECTOR STree = __get_section_tree(Name);
- victorate(std::string, STree, it)
- if( find(_requested_sections.begin(), _requested_sections.end(), *it) == _requested_sections.end() )
- if( section.length() != 0 ) _requested_sections.push_back(*it);
-}
-
-inline void
-GetPot::__record_variable_request(const std::string& Name)
-{
- if( ! __request_recording_f ) return;
-
- // (*) record requested variable for later ufo detection
- _requested_variables.push_back(Name);
-
- // (*) record considered section for ufo detection
- STRING_VECTOR STree = __get_section_tree(Name);
- victorate(std::string, STree, it)
- if( find(_requested_sections.begin(), _requested_sections.end(), *it) == _requested_sections.end() )
- if( section.length() != 0 ) _requested_sections.push_back(*it);
-}
-
-// (*) following functions are to be used from 'outside', after getpot has parsed its
-// arguments => append an argument in the argument vector that reflects the addition
-inline void
-GetPot::__set_variable(const char* VarName, const char* Value)
-{
- const GetPot::variable* Var = __find_variable(VarName);
- if( Var == 0 ) variables.push_back(variable(VarName, Value, _field_separator.c_str()));
- else ((GetPot::variable*)Var)->take(Value, _field_separator.c_str());
-}
-
-inline void
-GetPot::set(const char* VarName, const char* Value, const bool Requested /* = yes */)
-{
- const std::string Arg = prefix + std::string(VarName) + std::string("=") + std::string(Value);
- argv.push_back(Arg);
- __set_variable(VarName, Value);
-
- // if user does not specify the variable as 'not being requested' it will be
- // considered amongst the requested variables
- if( Requested ) __record_variable_request(Arg);
-}
-
-inline void
-GetPot::set(const char* VarName, const double& Value, const bool Requested /* = yes */)
-{ __set_variable(VarName, __double2string(Value).c_str()); }
-
-inline void
-GetPot::set(const char* VarName, const int Value, const bool Requested /* = yes */)
-{ __set_variable(VarName, __int2string(Value).c_str()); }
-
-
-inline unsigned
-GetPot::vector_variable_size(const char* VarName) const
-{
- const variable* sv = __find_variable(VarName);
- if( sv == 0 ) return 0;
- return static_cast<unsigned int>(sv->value.size());
-}
-
-inline STRING_VECTOR
-GetPot::get_variable_names() const
-{
- STRING_VECTOR result;
- std::vector<GetPot::variable>::const_iterator it = variables.begin();
- for(; it != variables.end(); ++it) {
- const std::string Tmp = __get_remaining_string((*it).name, prefix);
- if( Tmp != "" ) result.push_back(Tmp);
- }
- return result;
-}
-
-inline STRING_VECTOR
-GetPot::get_section_names() const
-{ return section_list; }
-
-inline const GetPot::variable*
-GetPot::__find_variable(const char* VarName) const
-{
- const std::string Name = prefix + VarName;
-
- // (*) record requested variable for later ufo detection
- ((GetPot*)this)->__record_variable_request(Name);
-
- std::vector<variable>::const_iterator it = variables.begin();
- for(; it != variables.end(); ++it) {
- if( (*it).name == Name ) return &(*it);
- }
- return 0;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// (*) ouput (basically for debugging reasons
-//.............................................................................
-//
-inline int
-GetPot::print() const
-{
- std::cout << "argc = " << static_cast<unsigned int>(argv.size()) << std::endl;
- STRING_VECTOR::const_iterator it = argv.begin();
- for(; it != argv.end(); ++it)
- std::cout << *it << std::endl;
- std::cout << std::endl;
- return 1;
-}
-
-// (*) dollar bracket expressions (DBEs) ------------------------------------
-//
-// 1) Entry Function: __DBE_expand_string()
-// Takes a string such as
-//
-// "${+ ${x} ${y}} Subject-${& ${section} ${subsection}}: ${title}"
-//
-// calls __DBE_expand() for each of the expressions
-//
-// ${+ ${x} ${y}}
-// ${& ${section} ${subsection}}
-// ${Title}
-//
-// and returns the string
-//
-// "4711 Subject-1.01: Mit den Clowns kamen die Schwaene"
-//
-// assuming that
-// x = "4699"
-// y = "12"
-// section = "1."
-// subsection = "01"
-// title = "Mit den Clowns kamen die Schwaene"
-//
-// 2) __DBE_expand():
-//
-// checks for the command, i.e. the 'sign' that follows '${'
-// divides the argument list into sub-expressions using
-// __DBE_get_expr_list()
-//
-// ${+ ${x} ${y}} -> "${x}" "${y}"
-// ${& ${section} ${subsection}} -> "${section}" "${subsection}"
-// ${Title} -> Nothing, variable expansion
-//
-// 3) __DBE_expression_list():
-//
-// builds a vector of unbracketed whitespace separated strings, i.e.
-//
-// " ${Number}.a ${: Das Marmorbild} AB-${& Author= ${Eichendorf}-1870}"
-//
-// is split into a vector
-//
-// [0] ${Number}.a
-// [1] ${: Das Marmorbild}
-// [2] AB-${& Author= ${Eichendorf}}-1870
-//
-// Each sub-expression is expanded using expand().
-//---------------------------------------------------------------------------
-inline std::string
-GetPot::__DBE_expand_string(const std::string str)
-{
- // Parses for closing operators '${ }' and expands them letting
- // white spaces and other letters as they are.
- std::string new_string = "";
- unsigned open_brackets = 0;
- unsigned first = 0;
- unsigned i = 0;
- for(; i<str.size(); ++i) {
- if( i < str.size() - 2 && str.substr(i, 2) == "${" ) {
- if( open_brackets == 0 ) first = i+2;
- open_brackets++;
- }
- else if( str[i] == '}' && open_brackets > 0) {
- open_brackets -= 1;
- if( open_brackets == 0 ) {
- const std::string Replacement = __DBE_expand(str.substr(first, i - first));
- new_string += Replacement;
- }
- }
- else if( open_brackets == 0 )
- new_string += str[i];
- }
- return new_string;
-}
-
-inline STRING_VECTOR
-GetPot::__DBE_get_expr_list(const std::string str_, const unsigned ExpectedNumber)
- // ensures that the resulting vector has the expected number
- // of arguments, but they may contain an error message
-{
- std::string str = str_;
- // Separates expressions by non-bracketed whitespaces, expands them
- // and puts them into a list.
-
- unsigned i=0;
- // (1) eat initial whitespaces
- for(; i < str.size(); ++i)
- if( ! isspace(str[i]) ) break;
-
- STRING_VECTOR expr_list;
- unsigned open_brackets = 0;
- std::vector<unsigned> start_idx;
- unsigned start_new_string = i;
- unsigned l = static_cast<unsigned int>(str.size());
-
- // (2) search for ${ } expressions ...
- while( i < l ) {
- const char letter = str[i];
- // whitespace -> end of expression
- if( isspace(letter) && open_brackets == 0) {
- expr_list.push_back(str.substr(start_new_string, i - start_new_string));
- bool no_breakout_f = true;
- for(++i; i < l ; ++i) {
- if( ! isspace(str[i]) )
- { no_breakout_f = false; start_new_string = i; break; }
- }
- if( no_breakout_f ) {
- // end of expression list
- if( expr_list.size() < ExpectedNumber ) {
- const std::string pre_tmp("<< ${ }: missing arguments>>");
- STRING_VECTOR tmp(ExpectedNumber - expr_list.size(), pre_tmp);
- expr_list.insert(expr_list.end(), tmp.begin(), tmp.end());
- }
- return expr_list;
- }
- }
-
- // dollar-bracket expression
- if( str.length() >= i+2 && str.substr(i, 2) == "${" ) {
- open_brackets++;
- start_idx.push_back(i+2);
- }
- else if( letter == '}' && open_brackets > 0) {
- int start = start_idx[start_idx.size()-1];
- start_idx.pop_back();
- const std::string Replacement = __DBE_expand(str.substr(start, i-start));
- if( start - 3 < (int)0)
- str = Replacement + str.substr(i+1);
- else
- str = str.substr(0, start-2) + Replacement + str.substr(i+1);
- l = static_cast<unsigned int>(str.size());
- i = start + static_cast<unsigned int>(Replacement.size()) - 3;
- open_brackets--;
- }
- ++i;
- }
-
- // end of expression list
- expr_list.push_back(str.substr(start_new_string, i-start_new_string));
-
- if( expr_list.size() < ExpectedNumber ) {
- const std::string pre_tmp("<< ${ }: missing arguments>>");
- STRING_VECTOR tmp(ExpectedNumber - expr_list.size(), pre_tmp);
- expr_list.insert(expr_list.end(), tmp.begin(), tmp.end());
- }
-
- return expr_list;
-}
-
-inline const GetPot::variable*
-GetPot::__DBE_get_variable(std::string VarName)
-{
- static GetPot::variable ev;
- std::string secure_Prefix = prefix;
-
- prefix = section;
- // (1) first search in currently active section
- const GetPot::variable* var = __find_variable(VarName.c_str());
- if( var != 0 ) { prefix = secure_Prefix; return var; }
-
- // (2) search in root name space
- prefix = "";
- var = __find_variable(VarName.c_str());
- if( var != 0 ) { prefix = secure_Prefix; return var; }
-
- prefix = secure_Prefix;
-
- // error occured => variable name == ""
- char* tmp = new char[VarName.length() + 25];
-#ifndef WIN32
- snprintf(tmp, (int)sizeof(char)*(VarName.length() + 25),
-#else
- _snprintf(tmp, sizeof(char)*(VarName.length() + 25),
-#endif
- "<<${ } variable '%s' undefined>>", VarName.c_str());
- ev.name = "";
- ev.original = std::string(tmp);
- delete [] tmp;
- return &ev;
-}
-
-inline std::string
-GetPot::__DBE_expand(const std::string expr)
-{
- // ${: } pure text
- if( expr[0] == ':' )
- return expr.substr(1);
-
- // ${& expr expr ... } text concatination
- else if( expr[0] == '&' ) {
- const STRING_VECTOR A = __DBE_get_expr_list(expr.substr(1), 1);
-
- STRING_VECTOR::const_iterator it = A.begin();
- std::string result = *it++;
- for(; it != A.end(); ++it) result += *it;
-
- return result;
- }
-
- // ${<-> expr expr expr} text replacement
- else if( expr.length() >= 3 && expr.substr(0, 3) == "<->" ) {
- STRING_VECTOR A = __DBE_get_expr_list(expr.substr(3), 3);
- std::string::size_type tmp = 0;
- const std::string::size_type L = A[1].length();
- while( (tmp = A[0].find(A[1])) != std::string::npos ) {
- A[0].replace(tmp, L, A[2]);
- }
- return A[0];
- }
- // ${+ ...}, ${- ...}, ${* ...}, ${/ ...} expressions
- else if( expr[0] == '+' ) {
- STRING_VECTOR A = __DBE_get_expr_list(expr.substr(1), 2);
- STRING_VECTOR::const_iterator it = A.begin();
- double result = __convert_to_type(*it++, 0.0);
- for(; it != A.end(); ++it)
- result += __convert_to_type(*it, 0.0);
-
- return __double2string(result);
- }
- else if( expr[0] == '-' ) {
- STRING_VECTOR A = __DBE_get_expr_list(expr.substr(1), 2);
- STRING_VECTOR::const_iterator it = A.begin();
- double result = __convert_to_type(*it++, 0.0);
- for(; it != A.end(); ++it)
- result -= __convert_to_type(*it, 0.0);
-
- return __double2string(result);
- }
- else if( expr[0] == '*' ) {
- STRING_VECTOR A = __DBE_get_expr_list(expr.substr(1), 2);
- STRING_VECTOR::const_iterator it = A.begin();
- double result = __convert_to_type(*it++, 0.0);
- for(; it != A.end(); ++it)
- result *= __convert_to_type(*it, 0.0);
-
- return __double2string(result);
- }
- else if( expr[0] == '/' ) {
-
- STRING_VECTOR A = __DBE_get_expr_list(expr.substr(1), 2);
- STRING_VECTOR::const_iterator it = A.begin();
- double result = __convert_to_type(*it++, 0.0);
- if( result == 0 ) return "0.0";
- for(; it != A.end(); ++it) {
- const double Q = __convert_to_type(*it, 0.0);
- if( Q == 0.0 ) return "0.0";
- result /= Q;
- }
- return __double2string(result);
- }
-
- // ${^ ... } power expressions
- else if( expr[0] == '^' ) {
- STRING_VECTOR A = __DBE_get_expr_list(expr.substr(1), 2);
- STRING_VECTOR::const_iterator it = A.begin();
- double result = __convert_to_type(*it++, 0.0);
- for(; it != A.end(); ++it)
- result = pow(result, __convert_to_type(*it, 0.0));
- return __double2string(result);
- }
-
- // ${== } ${<= } ${>= } comparisons (return the number of the first 'match'
- else if( expr.length() >= 2 &&
- ( expr.substr(0,2) == "==" || expr.substr(0,2) == ">=" ||
- expr.substr(0,2) == "<=" || expr[0] == '>' || expr[0] == '<')) {
- // differentiate between two and one sign operators
- unsigned op = 0;
- enum { EQ, GEQ, LEQ, GT, LT };
- if ( expr.substr(0, 2) == "==" ) op = EQ;
- else if ( expr.substr(0, 2) == ">=" ) op = GEQ;
- else if ( expr.substr(0, 2) == "<=" ) op = LEQ;
- else if ( expr[0] == '>' ) op = GT;
- else /* "<" */ op = LT;
-
- STRING_VECTOR a;
- if ( op == GT || op == LT ) a = __DBE_get_expr_list(expr.substr(1), 2);
- else a = __DBE_get_expr_list(expr.substr(2), 2);
-
- std::string x_orig = a[0];
- double x = __convert_to_type(x_orig, 1e37);
- unsigned i = 1;
-
- STRING_VECTOR::const_iterator y_orig = a.begin();
- for(y_orig++; y_orig != a.end(); y_orig++) {
- double y = __convert_to_type(*y_orig, 1e37);
-
- // set the strings as reference if one wasn't a number
- if ( x == 1e37 || y == 1e37 ) {
- // it's a string comparison
- if( (op == EQ && x_orig == *y_orig) || (op == GEQ && x_orig >= *y_orig) ||
- (op == LEQ && x_orig <= *y_orig) || (op == GT && x_orig > *y_orig) ||
- (op == LT && x_orig < *y_orig) )
- return __int2string(i);
- }
- else {
- // it's a number comparison
- if( (op == EQ && x == y) || (op == GEQ && x >= y) ||
- (op == LEQ && x <= y) || (op == GT && x > y) ||
- (op == LT && x < y) )
- return __int2string(i);
- }
- ++i;
- }
-
- // nothing fulfills the condition => return 0
- return "0";
- }
- // ${?? expr expr} select
- else if( expr.length() >= 2 && expr.substr(0, 2) == "??" ) {
- STRING_VECTOR a = __DBE_get_expr_list(expr.substr(2), 2);
- double x = __convert_to_type(a[0], 1e37);
- // last element is always the default argument
- if( x == 1e37 || x < 0 || x >= a.size() - 1 ) return a[a.size()-1];
-
- // round x to closest integer
- return a[int(x+0.5)];
- }
- // ${? expr expr expr} if then else conditions
- else if( expr[0] == '?' ) {
- STRING_VECTOR a = __DBE_get_expr_list(expr.substr(1), 2);
- if( __convert_to_type(a[0], 0.0) == 1.0 ) return a[1];
- else if( a.size() > 2 ) return a[2];
- }
- // ${! expr} maxro expansion
- else if( expr[0] == '!' ) {
- const GetPot::variable* Var = __DBE_get_variable(expr.substr(1));
- // error
- if( Var->name == "" ) return std::string(Var->original);
-
- const STRING_VECTOR A = __DBE_get_expr_list(Var->original, 2);
- return A[0];
- }
- // ${@: } - string subscription
- else if( expr.length() >= 2 && expr.substr(0,2) == "@:" ) {
- const STRING_VECTOR A = __DBE_get_expr_list(expr.substr(2), 2);
- double x = __convert_to_type(A[1], 1e37);
-
- // last element is always the default argument
- if( x == 1e37 || x < 0 || x >= A[0].size() - 1)
- return "<<1st index out of range>>";
-
- if( A.size() > 2 ) {
- double y = __convert_to_type(A[2], 1e37);
- if ( y != 1e37 && y > 0 && y <= A[0].size() - 1 && y > x )
- return A[0].substr(int(x+0.5), int(y+1.5) - int(x+0.5));
- else if( y == -1 )
- return A[0].substr(int(x+0.5));
- return "<<2nd index out of range>>";
- }
- else {
- char* tmp = new char[2];
- tmp[0] = A[0][int(x+0.5)]; tmp[1] = '\0';
- std::string result(tmp);
- delete [] tmp;
- return result;
- }
- }
- // ${@ } - vector subscription
- else if( expr[0] == '@' ) {
- STRING_VECTOR A = __DBE_get_expr_list(expr.substr(1), 2);
- const GetPot::variable* Var = __DBE_get_variable(A[0]);
- // error
- if( Var->name == "" ) {
- // make a copy of the string if an error occured
- // (since the error variable is a static variable inside get_variable())
- return std::string(Var->original);
- }
-
- double x = __convert_to_type(A[1], 1e37);
-
- // last element is always the default argument
- if (x == 1e37 || x < 0 || x >= Var->value.size() )
- return "<<1st index out of range>>";
-
- if ( A.size() > 2) {
- double y = __convert_to_type(A[2], 1e37);
- int begin = int(x+0.5);
- int end = 0;
- if ( y != 1e37 && y > 0 && y <= Var->value.size() && y > x)
- end = int(y+1.5);
- else if( y == -1 )
- end = static_cast<unsigned int>(Var->value.size());
- else
- return "<<2nd index out of range>>";
-
- std::string result = *(Var->get_element(begin));
- int i = begin+1;
- for(; i < end; ++i)
- result += std::string(" ") + *(Var->get_element(i));
- return result;
- }
- else
- return *(Var->get_element(int(x+0.5)));
- }
-
- const STRING_VECTOR A = __DBE_get_expr_list(expr, 1);
- const GetPot::variable* B = __DBE_get_variable(A[0]);
-
- // make a copy of the string if an error occured
- // (since the error variable is a static variable inside get_variable())
- if( B->name == "" ) return std::string(B->original);
- // (psuggs@pobox.com mentioned to me the warning MSVC++6.0 produces
- // with: else return B->original (thanks))
- return B->original;
-}
-
-
-///////////////////////////////////////////////////////////////////////////////
-// (*) unidentified flying objects
-//.............................................................................
-//
-inline bool
-GetPot::__search_string_vector(const STRING_VECTOR& VecStr, const std::string& Str) const
-{
- victorate(std::string, VecStr, itk) {
- if( *itk == Str ) return true;
- }
- return false;
-}
-
-inline STRING_VECTOR
-GetPot::unidentified_arguments(unsigned Number,
- const char* KnownArgument1, ...) const
-{
- STRING_VECTOR known_arguments;
-
- // (1) create a vector of known arguments
- if( Number == 0 ) return STRING_VECTOR();
-
- va_list ap;
- va_start(ap, KnownArgument1);
- known_arguments.push_back(std::string(KnownArgument1));
- unsigned i=1;
- for(; i<Number; ++i)
- known_arguments.push_back(std::string(va_arg(ap, char *)));
- va_end(ap);
-
- return unidentified_arguments(known_arguments);
-}
-
-inline STRING_VECTOR
-GetPot::unidentified_arguments() const
-{ return unidentified_arguments(_requested_arguments); }
-
-inline STRING_VECTOR
-GetPot::unidentified_arguments(const STRING_VECTOR& Knowns) const
-{
- STRING_VECTOR ufos;
- STRING_VECTOR::const_iterator it = argv.begin();
- ++it; // forget about argv[0] (application or filename)
- for(; it != argv.end(); ++it) {
- // -- argument belongs to prefixed section ?
- const std::string arg = __get_remaining_string(*it, prefix);
- if( arg == "" ) continue;
-
- // -- check if in list
- if( __search_string_vector(Knowns, arg) == false)
- ufos.push_back(*it);
- }
- return ufos;
-}
-
-inline STRING_VECTOR
-GetPot::unidentified_options(unsigned Number,
- const char* KnownOption1, ...) const
-{
- STRING_VECTOR known_options;
-
- // (1) create a vector of known arguments
- if( Number == 0 ) return STRING_VECTOR();
-
- va_list ap;
- va_start(ap, KnownOption1);
- known_options.push_back(std::string(KnownOption1));
- unsigned i=1;
- for(; i<Number; ++i)
- known_options.push_back(std::string(va_arg(ap, char *)));
- va_end(ap);
-
- return unidentified_options(known_options);
-}
-
-inline STRING_VECTOR
-GetPot::unidentified_options() const
-{
- // -- every option is an argument.
- // -- the set of requested arguments contains the set of requested options.
- // -- IF the set of requested arguments contains unrequested options,
- // THEN they were requested as 'follow' and 'next' arguments and not as real options.
- //
- // => it is not necessary to separate requested options from the list
- STRING_VECTOR option_list;
- victorate(std::string, _requested_arguments, it) {
- const std::string arg = *it;
- if( arg.length() == 0 ) continue;
- if( arg[0] == '-' ) option_list.push_back(arg);
- }
- return unidentified_options(option_list);
-}
-
-inline STRING_VECTOR
-GetPot::unidentified_options(const STRING_VECTOR& Knowns) const
-{
- STRING_VECTOR ufos;
- STRING_VECTOR::const_iterator it = argv.begin();
- ++it; // forget about argv[0] (application or filename)
- for(; it != argv.end(); ++it) {
- // -- argument belongs to prefixed section ?
- const std::string arg = __get_remaining_string(*it, prefix);
- if( arg == "" ) continue;
-
- // is argument really an option (starting with '-') ?
- if( arg.length() < 1 || arg[0] != '-' ) continue;
-
- if( __search_string_vector(Knowns, arg) == false)
- ufos.push_back(*it);
- }
-
- return ufos;
-}
-
-inline std::string
-GetPot::unidentified_flags(const char* KnownFlagList, int ArgumentNumber=-1) const
- // Two modes:
- // ArgumentNumber >= 0 check specific argument
- // ArgumentNumber == -1 check all options starting with one '-'
- // for flags
-{
- std::string ufos;
- STRING_VECTOR known_arguments;
- std::string KFL(KnownFlagList);
-
- // (2) iteration over '-' arguments (options)
- if( ArgumentNumber == -1 ) {
- STRING_VECTOR::const_iterator it = argv.begin();
- ++it; // forget about argv[0] (application or filename)
- for(; it != argv.end(); ++it) {
- // -- argument belongs to prefixed section ?
- const std::string arg = __get_remaining_string(*it, prefix);
- if( arg == "" ) continue;
-
- // -- does arguments start with '-' (but not '--')
- if ( arg.length() < 2 ) continue;
- else if( arg[0] != '-' ) continue;
- else if( arg[1] == '-' ) continue;
-
- // -- check out if flags inside option are contained in KnownFlagList
- const char* p=arg.c_str();
- p++; // skip starting minus
- for(; *p != '\0' ; p++)
- if( KFL.find(*p) == std::string::npos ) ufos += *p;
- }
- }
- // (1) check specific argument
- else {
- // -- only check arguments that start with prefix
- int no_matches = 0;
- unsigned i=1;
- for(; i<argv.size(); ++i) {
- const std::string Remain = __get_remaining_string(argv[i], prefix);
- if( Remain != "") {
- no_matches++;
- if( no_matches == ArgumentNumber) {
- // -- the right argument number inside the section is found
- // => check it for flags
- const char* p = Remain.c_str();
- p++; // skip starting minus
- for(; *p != '\0' ; p++)
- if( KFL.find(*p) == std::string::npos ) ufos += *p;
- return ufos;
- }
- }
- }
- }
- return ufos;
-}
-
-inline STRING_VECTOR
-GetPot::unidentified_variables(unsigned Number,
- const char* KnownVariable1, ...) const
-{
- STRING_VECTOR known_variables;
-
- // create vector of known arguments
- if( Number == 0 ) return STRING_VECTOR();
-
- va_list ap;
- va_start(ap, KnownVariable1);
- known_variables.push_back(std::string(KnownVariable1));
- unsigned i=1;
- for(; i<Number; ++i)
- known_variables.push_back(std::string(va_arg(ap, char *)));
- va_end(ap);
-
- return unidentified_variables(known_variables);
-}
-
-inline STRING_VECTOR
-GetPot::unidentified_variables(const STRING_VECTOR& Knowns) const
-{
- STRING_VECTOR ufos;
-
- victorate(GetPot::variable, variables, it) {
- // -- check if variable has specific prefix
- const std::string var_name = __get_remaining_string((*it).name, prefix);
- if( var_name == "" ) continue;
-
- // -- check if variable is known
- if( __search_string_vector(Knowns, var_name) == false)
- ufos.push_back((*it).name);
- }
- return ufos;
-}
-
-inline STRING_VECTOR
-GetPot::unidentified_variables() const
-{ return unidentified_variables(_requested_variables); }
-
-
-inline STRING_VECTOR
-GetPot::unidentified_sections(unsigned Number,
- const char* KnownSection1, ...) const
-{
- STRING_VECTOR known_sections;
-
- // (1) create a vector of known arguments
- if( Number == 0 ) return STRING_VECTOR();
-
- va_list ap;
- va_start(ap, KnownSection1);
- known_sections.push_back(std::string(KnownSection1));
- unsigned i=1;
- for(; i<Number; ++i) {
- std::string tmp = std::string(va_arg(ap, char *));
- if( tmp.length() == 0 ) continue;
- if( tmp[tmp.length()-1] != '/' ) tmp += '/';
- known_sections.push_back(tmp);
- }
- va_end(ap);
-
- return unidentified_sections(known_sections);
-}
-
-inline STRING_VECTOR
-GetPot::unidentified_sections() const
-{ return unidentified_sections(_requested_sections); }
-
-inline STRING_VECTOR
-GetPot::unidentified_sections(const STRING_VECTOR& Knowns) const
-{
- STRING_VECTOR ufos;
-
- victorate(std::string, section_list, it) {
- // -- check if section conform to prefix
- const std::string sec_name = __get_remaining_string(*it, prefix);
- if( sec_name == "" ) continue;
-
- // -- check if section is known
- if( __search_string_vector(Knowns, sec_name) == false )
- ufos.push_back(*it);
- }
-
- return ufos;
-}
-
-
-inline STRING_VECTOR
-GetPot::unidentified_nominuses(unsigned Number, const char* Known, ...) const
-{
- STRING_VECTOR known_nominuses;
-
- // create vector of known arguments
- if( Number == 0 ) return STRING_VECTOR();
-
- va_list ap;
- va_start(ap, Known);
- known_nominuses.push_back(std::string(Known));
- unsigned i=1;
- for(; i<Number; ++i) {
- std::string tmp = std::string(va_arg(ap, char *));
- if( tmp.length() == 0 ) continue;
- known_nominuses.push_back(tmp);
- }
- va_end(ap);
-
- return unidentified_nominuses(known_nominuses);
-}
-
-inline STRING_VECTOR
-GetPot::unidentified_nominuses() const {
- // -- every nominus is an argument.
- // -- the set of requested arguments contains the set of requested nominuss.
- // -- IF the set of requested arguments contains unrequested nominuss,
- // THEN they were requested as 'follow' and 'next' arguments and not as real nominuses.
- //
- // => it is not necessary to separate requested nominus from the list
-
- return unidentified_nominuses(_requested_arguments);
-}
-
-inline STRING_VECTOR
-GetPot::unidentified_nominuses(const STRING_VECTOR& Knowns) const
-{
- STRING_VECTOR ufos;
-
- // (2) iterate over all arguments
- STRING_VECTOR::const_iterator it = argv.begin();
- ++it; // forget about argv[0] (application or filename)
- for(; it != argv.end(); ++it) {
- // -- check if nominus part of prefix
- const std::string arg = __get_remaining_string(*it, prefix);
- if( arg == "" ) continue;
-
- if( arg.length() < 1 ) continue;
- // option ? --> not a nomius
- if( arg[0] == '-' ) continue;
- // section ? --> not a real nominus
- if( arg[0] == '[' && arg[arg.length()-1] == ']' ) continue;
- // variable definition ? --> not a real nominus
- bool continue_f = false;
- unsigned i=0;
- for(; i<arg.length() ; ++i)
- if( arg[i] == '=' ) { continue_f = true; break; }
- if( continue_f ) continue;
-
- // real nominuses are compared with the given list
- if( __search_string_vector(Knowns, arg) == false )
- ufos.push_back(*it);
- }
- return ufos;
-}
-
-
-///////////////////////////////////////////////////////////////////////////////
-// (*) variable class
-//.............................................................................
-//
-inline
-GetPot::variable::variable()
-{}
-
-inline
-GetPot::variable::variable(const variable& That)
-{
-#ifdef WIN32
- operator=(That);
-#else
- GetPot::variable::operator=(That);
-#endif
-}
-
-
-inline
-GetPot::variable::variable(const char* Name, const char* Value, const char* FieldSeparator)
- : name(Name)
-{
- // make a copy of the 'Value'
- take(Value, FieldSeparator);
-}
-
-inline const std::string*
-GetPot::variable::get_element(unsigned Idx) const
-{ if( Idx >= value.size() ) return 0; else return &(value[Idx]); }
-
-inline void
-GetPot::variable::take(const char* Value, const char* FieldSeparator)
-{
- original = std::string(Value);
-
- // separate string by white space delimiters using 'strtok'
- // thread safe usage of strtok (no static members)
- char* spt = 0;
- // make a copy of the 'Value'
- char* copy = new char[strlen(Value)+1];
- strcpy(copy, Value);
- char* follow_token = strtok_r(copy, FieldSeparator, &spt);
- if( value.size() != 0 ) value.erase(value.begin(), value.end());
- while(follow_token != 0) {
- value.push_back(std::string(follow_token));
- follow_token = strtok_r(NULL, FieldSeparator, &spt);
- }
-
- delete [] copy;
-}
-
-inline
-GetPot::variable::~variable()
-{}
-
-inline GetPot::variable&
-GetPot::variable::operator=(const GetPot::variable& That)
-{
- if( &That != this) {
- name = That.name;
- value = That.value;
- original = That.original;
- }
- return *this;
-}
-
-#undef victorate
-
-
-#endif // __include_guard_GETPOT_H__
-
-
-
diff --git a/utils/zenutils/libraries/getpot-c++-1.1.17/getpot/GetPot b/utils/zenutils/libraries/getpot-c++-1.1.18/getpot/GetPot
similarity index 62%
rename from utils/zenutils/libraries/getpot-c++-1.1.17/getpot/GetPot
rename to utils/zenutils/libraries/getpot-c++-1.1.18/getpot/GetPot
index 0663880..4c305f6 100644
--- a/utils/zenutils/libraries/getpot-c++-1.1.17/getpot/GetPot
+++ b/utils/zenutils/libraries/getpot-c++-1.1.18/getpot/GetPot
@@ -1,4 +1,4 @@
-// -*- c++ -*-
+// -*- c++ -*- vim: set syntax=cpp:
// GetPot Version $$Version$$ $$Date$$
//
// WEBSITE: http://getpot.sourceforge.net
@@ -23,7 +23,7 @@
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
// USA
//
-// (C) 2001-2005 Frank R. Schaefer <fschaef@users.sf.net>
+// (C) 2001-2007 Frank R. Schaefer <fschaef@users.sf.net>
//==========================================================================
#ifndef __include_guard_GETPOT_H__
@@ -43,6 +43,7 @@
#include <stdio.h>
#include <stdarg.h>
#include <assert.h>
+#include <string.h>
}
#include <cmath>
#include <string>
@@ -68,10 +69,10 @@
inline GetPot();
inline GetPot(const GetPot&);
inline GetPot(const int argc_, char** argv_,
- const char* FieldSeparator=0x0);
+ const char* FieldSeparator=0x0);
inline GetPot(const char* FileName,
- const char* CommentStart=0x0, const char* CommentEnd=0x0,
- const char* FieldSeparator=0x0);
+ const char* CommentStart=0x0, const char* CommentEnd=0x0,
+ const char* FieldSeparator=0x0);
inline ~GetPot();
inline GetPot& operator=(const GetPot&);
@@ -171,7 +172,7 @@
inline STRING_VECTOR unidentified_options() const;
inline std::string unidentified_flags(const char* Known,
- int ArgumentNumber /* =-1 */) const;
+ int ArgumentNumber /* =-1 */) const;
inline STRING_VECTOR unidentified_variables(unsigned Number, const char* Known, ...) const;
inline STRING_VECTOR unidentified_variables(const STRING_VECTOR& Knowns) const;
@@ -191,27 +192,27 @@
private:
// (*) Type Declaration ----------------------------------------------------
struct variable {
- //-----------
- // Variable to be specified on the command line or in input files.
- // (i.e. of the form var='12 312 341')
+ //-----------
+ // Variable to be specified on the command line or in input files.
+ // (i.e. of the form var='12 312 341')
- // -- constructors, destructors, assignment operator
- variable();
- variable(const variable&);
- variable(const char* Name, const char* Value, const char* FieldSeparator);
- ~variable();
- variable& operator=(const variable& That);
+ // -- constructors, destructors, assignment operator
+ variable();
+ variable(const variable&);
+ variable(const char* Name, const char* Value, const char* FieldSeparator);
+ ~variable();
+ variable& operator=(const variable& That);
- void take(const char* Value, const char* FieldSeparator);
+ void take(const char* Value, const char* FieldSeparator);
- // -- get a specific element in the string vector
- // (return 0 if not present)
- const std::string* get_element(unsigned Idx) const;
+ // -- get a specific element in the string vector
+ // (return 0 if not present)
+ const std::string* get_element(unsigned Idx) const;
- // -- data memebers
- std::string name; // identifier of variable
- STRING_VECTOR value; // value of variable stored in vector
- std::string original; // value of variable as given on command line
+ // -- data memebers
+ std::string name; // identifier of variable
+ STRING_VECTOR value; // value of variable stored in vector
+ std::string original; // value of variable as given on command line
};
// (*) member variables --------------------------------------------------------------
@@ -280,10 +281,10 @@
inline double __convert_to_type(const std::string& String, double Default) const;
// * prefix extraction
const std::string __get_remaining_string(const std::string& String,
- const std::string& Start) const;
+ const std::string& Start) const;
// * search for a specific string
inline bool __search_string_vector(const STRING_VECTOR& Vec,
- const std::string& Str) const;
+ const std::string& Str) const;
// -- helpers to parse input file
// create an argument vector based on data found in an input file, i.e.:
@@ -301,7 +302,7 @@
inline STRING_VECTOR __read_in_stream(std::istream& istr);
inline STRING_VECTOR __read_in_file(const char* FileName);
inline std::string __process_section_label(const std::string& Section,
- STRING_VECTOR& section_stack);
+ STRING_VECTOR& section_stack);
// -- dollar bracket expressions
std::string __DBE_expand_string(const std::string str);
@@ -310,47 +311,47 @@
STRING_VECTOR __DBE_get_expr_list(const std::string str, const unsigned ExpectedNumber);
std::string __double2string(const double& Value) const {
- // -- converts a double integer into a string
- char* tmp = new char[128];
+ // -- converts a double integer into a string
+ char* tmp = new char[128];
#ifndef WIN32
- snprintf(tmp, (int)sizeof(char)*128, "%e", Value);
+ snprintf(tmp, (int)sizeof(char)*128, "%e", Value);
#else
- _snprintf(tmp, sizeof(char)*128, "%e", Value);
+ _snprintf(tmp, sizeof(char)*128, "%e", Value);
#endif
- std::string result(tmp);
- delete [] tmp;
- return result;
+ std::string result(tmp);
+ delete [] tmp;
+ return result;
}
std::string __int2string(const int& Value) const {
- // -- converts an integer into a string
- char* tmp = new char[128];
+ // -- converts an integer into a string
+ char* tmp = new char[128];
#ifndef WIN32
- snprintf(tmp, (int)sizeof(char)*128, "%i", Value);
+ snprintf(tmp, (int)sizeof(char)*128, "%i", Value);
#else
- _snprintf(tmp, sizeof(char)*128, "%i", Value);
+ _snprintf(tmp, sizeof(char)*128, "%i", Value);
#endif
- std::string result(tmp);
- delete [] tmp;
- return result;
+ std::string result(tmp);
+ delete [] tmp;
+ return result;
}
STRING_VECTOR __get_section_tree(const std::string& FullPath) {
- // -- cuts a variable name into a tree of sub-sections. this is requested for recording
- // requested sections when dealing with 'ufo' detection.
- STRING_VECTOR result;
- const char* Start = FullPath.c_str();
+ // -- cuts a variable name into a tree of sub-sections. this is requested for recording
+ // requested sections when dealing with 'ufo' detection.
+ STRING_VECTOR result;
+ const char* Start = FullPath.c_str();
- for(char *p = (char*)Start; *p ; p++) {
- if( *p == '/' ) {
- *p = '\0'; // set terminating zero for convinience
- const std::string Section = Start;
- *p = '/'; // reset slash at place
- result.push_back(Section);
- }
- }
+ for(char *p = (char*)Start; *p ; p++) {
+ if( *p == '/' ) {
+ *p = '\0'; // set terminating zero for convinience
+ const std::string Section = Start;
+ *p = '/'; // reset slash at place
+ result.push_back(Section);
+ }
+ }
- return result;
+ return result;
}
};
@@ -389,7 +390,7 @@
inline
GetPot::GetPot(const int argc_, char ** argv_,
- const char* FieldSeparator /* =0x0 */)
+ const char* FieldSeparator /* =0x0 */)
// leave 'char**' non-const to honor less capable compilers ...
{
// TODO: Ponder over the problem when the argument list is of size = 0.
@@ -410,8 +411,8 @@
_apriori_argv.push_back(std::string(argv_[0]));
int i=1;
for(; i<argc_; ++i) {
- std::string tmp(argv_[i]); // recall the problem with temporaries,
- _apriori_argv.push_back(tmp); // reference counting in arguement lists ...
+ std::string tmp(argv_[i]); // recall the problem with temporaries,
+ _apriori_argv.push_back(tmp); // reference counting in arguement lists ...
}
__parse_argument_vector(_apriori_argv);
}
@@ -419,8 +420,8 @@
inline
GetPot::GetPot(const char* FileName,
- const char* CommentStart /* = 0x0 */, const char* CommentEnd /* = 0x0 */,
- const char* FieldSeparator/* = 0x0 */)
+ const char* CommentStart /* = 0x0 */, const char* CommentEnd /* = 0x0 */,
+ const char* FieldSeparator/* = 0x0 */)
{
__basic_initialization();
@@ -448,7 +449,7 @@
{
// may be some return strings had to be created, delete now !
victorate(char*, __internal_string_container, it)
- delete [] *it;
+ delete [] *it;
}
inline GetPot&
@@ -515,59 +516,59 @@
// -- loop over remaining arguments
unsigned i=1;
for(; it != ARGV.end(); ++it, ++i) {
- std::string arg = *it;
+ std::string arg = *it;
- if( arg.length() == 0 ) continue;
+ if( arg.length() == 0 ) continue;
- // -- [section] labels
- if( arg.length() > 1 && arg[0] == '[' && arg[arg.length()-1] == ']' ) {
+ // -- [section] labels
+ if( arg.length() > 1 && arg[0] == '[' && arg[arg.length()-1] == ']' ) {
- // (*) sections are considered 'requested arguments'
- if( __request_recording_f ) _requested_arguments.push_back(arg);
-
- const std::string Name = __DBE_expand_string(arg.substr(1, arg.length()-2));
- section = __process_section_label(Name, section_stack);
- // new section --> append to list of sections
- if( find(section_list.begin(), section_list.end(), section) == section_list.end() )
- if( section.length() != 0 ) section_list.push_back(section);
- argv.push_back(arg);
- }
- else {
- arg = section + __DBE_expand_string(arg);
- argv.push_back(arg);
- }
+ // (*) sections are considered 'requested arguments'
+ if( __request_recording_f ) _requested_arguments.push_back(arg);
+
+ const std::string Name = __DBE_expand_string(arg.substr(1, arg.length()-2));
+ section = __process_section_label(Name, section_stack);
+ // new section --> append to list of sections
+ if( find(section_list.begin(), section_list.end(), section) == section_list.end() )
+ if( section.length() != 0 ) section_list.push_back(section);
+ argv.push_back(arg);
+ }
+ else {
+ arg = section + __DBE_expand_string(arg);
+ argv.push_back(arg);
+ }
- // -- separate array for nominus arguments
- if( arg[0] != '-' ) idx_nominus.push_back(unsigned(i));
+ // -- separate array for nominus arguments
+ if( arg[0] != '-' ) idx_nominus.push_back(unsigned(i));
- // -- variables: does arg contain a '=' operator ?
- const char* p = arg.c_str();
- for(; *p ; p++) {
- if( *p == '=' ) {
- // (*) record for later ufo detection
- // arguments carriying variables are always treated as 'requested' arguments.
- // as a whole! That is 'x=4712' is considered a requested argument.
- //
- // unrequested variables have to be detected with the ufo-variable
- // detection routine.
- if( __request_recording_f ) _requested_arguments.push_back(arg);
+ // -- variables: does arg contain a '=' operator ?
+ const char* p = arg.c_str();
+ for(; *p ; p++) {
+ if( *p == '=' ) {
+ // (*) record for later ufo detection
+ // arguments carriying variables are always treated as 'requested' arguments.
+ // as a whole! That is 'x=4712' is considered a requested argument.
+ //
+ // unrequested variables have to be detected with the ufo-variable
+ // detection routine.
+ if( __request_recording_f ) _requested_arguments.push_back(arg);
- // set terminating 'zero' to treat first part as single string
- // => arg (from start to 'p') = Name of variable
- // p+1 (until terminating zero) = value of variable
- char* o = (char*)p++;
- *o = '\0'; // set temporary terminating zero
- // __set_variable(...)
- // calls __find_variable(...) which registers the search
- // temporarily disable this
- const bool tmp = __request_recording_f;
- __request_recording_f = false;
- __set_variable(arg.c_str(), p); // v-name = c_str() bis 'p', value = rest
- __request_recording_f = tmp;
- *o = '='; // reset the original '='
- break;
- }
- }
+ // set terminating 'zero' to treat first part as single string
+ // => arg (from start to 'p') = Name of variable
+ // p+1 (until terminating zero) = value of variable
+ char* o = (char*)p++;
+ *o = '\0'; // set temporary terminating zero
+ // __set_variable(...)
+ // calls __find_variable(...) which registers the search
+ // temporarily disable this
+ const bool tmp = __request_recording_f;
+ __request_recording_f = false;
+ __set_variable(arg.c_str(), p); // v-name = c_str() bis 'p', value = rest
+ __request_recording_f = tmp;
+ *o = '='; // reset the original '='
+ break;
+ }
+ }
}
}
@@ -586,10 +587,10 @@
{
STRING_VECTOR brute_tokens;
while(istr) {
- __skip_whitespace(istr);
- const std::string Token = __get_next_token(istr);
- if( Token.length() == 0 || Token[0] == EOF) break;
- brute_tokens.push_back(Token);
+ __skip_whitespace(istr);
+ const std::string Token = __get_next_token(istr);
+ if( Token.length() == 0 || Token[0] == EOF) break;
+ brute_tokens.push_back(Token);
}
// -- reduce expressions of token1'='token2 to a single
@@ -603,22 +604,22 @@
STRING_VECTOR arglist;
while( i1 < brute_tokens.size() ) {
- const std::string& SRef = brute_tokens[i1];
- // 1) concatinate 'abcdef' '=' 'efgasdef' to 'abcdef=efgasdef'
- // note: java.lang.String: substring(a,b) = from a to b-1
- // C++ string: substr(a,b) = from a to a + b
- if( i2 < brute_tokens.size() && brute_tokens[i2] == "=" ) {
- if( i3 >= brute_tokens.size() )
- arglist.push_back(brute_tokens[i1] + brute_tokens[i2]);
- else
- arglist.push_back(brute_tokens[i1] + brute_tokens[i2] + brute_tokens[i3]);
- i1 = i3+1; i2 = i3+2; i3 = i3+3;
- continue;
- }
- else {
- arglist.push_back(SRef);
- i1=i2; i2=i3; i3++;
- }
+ const std::string& SRef = brute_tokens[i1];
+ // 1) concatinate 'abcdef' '=' 'efgasdef' to 'abcdef=efgasdef'
+ // note: java.lang.String: substring(a,b) = from a to b-1
+ // C++ string: substr(a,b) = from a to a + b
+ if( i2 < brute_tokens.size() && brute_tokens[i2] == "=" ) {
+ if( i3 >= brute_tokens.size() )
+ arglist.push_back(brute_tokens[i1] + brute_tokens[i2]);
+ else
+ arglist.push_back(brute_tokens[i1] + brute_tokens[i2] + brute_tokens[i3]);
+ i1 = i3+1; i2 = i3+2; i3 = i3+3;
+ continue;
+ }
+ else {
+ arglist.push_back(SRef);
+ i1=i2; i2=i3; i3++;
+ }
}
return arglist;
}
@@ -629,45 +630,48 @@
{
int tmp = istr.get();
do {
- // -- search a non whitespace
- while( isspace(tmp) ) {
- tmp = istr.get();
- if( ! istr ) return;
- }
+ // -- search a non whitespace
+ while( isspace(tmp) ) {
+ tmp = istr.get();
+ if( ! istr ) return;
+ }
- // -- look if characters match the comment starter string
- const std::istream::pos_type Pos = istr.tellg();
- unsigned i=0;
- for(; i<_comment_start.length() ; ++i) {
- if( tmp != _comment_start[i] ) {
- istr.seekg(Pos);
- // -- one step more backwards, since 'tmp' already at non-whitespace
- istr.unget();
- return;
- }
- tmp = istr.get();
- if( ! istr ) { istr.unget(); return; }
- }
- // 'tmp' contains last character of _comment_starter
+ // -- look if characters match the comment starter string
+ unsigned i=0;
+ for(; i<_comment_start.length() ; ++i) {
+ if( tmp != _comment_start[i] ) {
+ // NOTE: Due to a 'strange behavior' in Microsoft's streaming lib we do
+ // a series of unget()s instead a quick seek. See
+ // http://sourceforge.net/tracker/index.php?func=detail&aid=1545239&group_id=31994&atid=403915
+ // for a detailed discussion.
- // -- comment starter found -> search for comment ender
- unsigned match_no=0;
- while(1+1 == 2) {
- tmp = istr.get();
- if( ! istr ) { istr.unget(); return; }
+ // -- one step more backwards, since 'tmp' already at non-whitespace
+ do istr.unget(); while( i-- != 0 );
+ return;
+ }
+ tmp = istr.get();
+ if( ! istr ) { istr.unget(); return; }
+ }
+ // 'tmp' contains last character of _comment_starter
- if( tmp == _comment_end[match_no] ) {
- match_no++;
- if( match_no == _comment_end.length() ) {
- istr.unget();
- break; // shuffle more whitespace, end of comment found
- }
- }
- else
- match_no = 0;
- }
+ // -- comment starter found -> search for comment ender
+ unsigned match_no=0;
+ while(1+1 == 2) {
+ tmp = istr.get();
+ if( ! istr ) { istr.unget(); return; }
- tmp = istr.get();
+ if( tmp == _comment_end[match_no] ) {
+ match_no++;
+ if( match_no == _comment_end.length() ) {
+ istr.unget();
+ break; // shuffle more whitespace, end of comment found
+ }
+ }
+ else
+ match_no = 0;
+ }
+
+ tmp = istr.get();
} while( istr );
istr.unget();
@@ -682,27 +686,27 @@
int tmp = 0;
int last_letter = 0;
while(1+1 == 2) {
- last_letter = tmp; tmp = istr.get();
- if( tmp == EOF
- || ((tmp == ' ' || tmp == '\t' || tmp == '\n') && last_letter != '\\') ) {
- return token;
- }
- else if( tmp == '\'' && last_letter != '\\' ) {
- // QUOTES: un-backslashed quotes => it's a string
- token += __get_string(istr);
- continue;
- }
- else if( tmp == '{' && last_letter == '$') {
- token += '{' + __get_until_closing_bracket(istr);
- continue;
- }
- else if( tmp == '$' && last_letter == '\\') {
- token += tmp; tmp = 0; // so that last_letter will become = 0, not '$';
- continue;
- }
- else if( tmp == '\\' && last_letter != '\\')
- continue; // don't append un-backslashed backslashes
- token += tmp;
+ last_letter = tmp; tmp = istr.get();
+ if( tmp == EOF
+ || ((tmp == ' ' || tmp == '\t' || tmp == '\n') && last_letter != '\\') ) {
+ return token;
+ }
+ else if( tmp == '\'' && last_letter != '\\' ) {
+ // QUOTES: un-backslashed quotes => it's a string
+ token += __get_string(istr);
+ continue;
+ }
+ else if( tmp == '{' && last_letter == '$') {
+ token += '{' + __get_until_closing_bracket(istr);
+ continue;
+ }
+ else if( tmp == '$' && last_letter == '\\') {
+ token += tmp; tmp = 0; // so that last_letter will become = 0, not '$';
+ continue;
+ }
+ else if( tmp == '\\' && last_letter != '\\')
+ continue; // don't append un-backslashed backslashes
+ token += tmp;
}
}
@@ -714,13 +718,13 @@
int tmp = 0;
int last_letter = 0;
while(1 + 1 == 2) {
- last_letter = tmp; tmp = istr.get();
- if( tmp == EOF) return str;
- // un-backslashed quotes => it's the end of the string
- else if( tmp == '\'' && last_letter != '\\') return str;
- else if( tmp == '\\' && last_letter != '\\') continue; // don't append
+ last_letter = tmp; tmp = istr.get();
+ if( tmp == EOF) return str;
+ // un-backslashed quotes => it's the end of the string
+ else if( tmp == '\'' && last_letter != '\\') return str;
+ else if( tmp == '\\' && last_letter != '\\') continue; // don't append
- str += tmp;
+ str += tmp;
}
}
@@ -733,62 +737,62 @@
int last_letter = 0;
int brackets = 1;
while(1 + 1 == 2) {
- last_letter = tmp; tmp = istr.get();
- if( tmp == EOF) return str;
- else if( tmp == '{' && last_letter == '$') brackets += 1;
- else if( tmp == '}') {
- brackets -= 1;
- // un-backslashed brackets => it's the end of the string
- if( brackets == 0) return str + '}';
- else if( tmp == '\\' && last_letter != '\\')
- continue; // do not append an unbackslashed backslash
- }
- str += tmp;
+ last_letter = tmp; tmp = istr.get();
+ if( tmp == EOF) return str;
+ else if( tmp == '{' && last_letter == '$') brackets += 1;
+ else if( tmp == '}') {
+ brackets -= 1;
+ // un-backslashed brackets => it's the end of the string
+ if( brackets == 0) return str + '}';
+ else if( tmp == '\\' && last_letter != '\\')
+ continue; // do not append an unbackslashed backslash
+ }
+ str += tmp;
}
}
inline std::string
GetPot::__process_section_label(const std::string& Section,
- STRING_VECTOR& section_stack)
+ STRING_VECTOR& section_stack)
{
std::string sname = Section;
// 1) subsection of actual section ('./' prefix)
if( sname.length() >= 2 && sname.substr(0, 2) == "./" ) {
- sname = sname.substr(2);
+ sname = sname.substr(2);
}
// 2) subsection of parent section ('../' prefix)
else if( sname.length() >= 3 && sname.substr(0, 3) == "../" ) {
- do {
- if( section_stack.end() != section_stack.begin() )
- section_stack.pop_back();
- sname = sname.substr(3);
- } while( sname.substr(0, 3) == "../" );
+ do {
+ if( section_stack.end() != section_stack.begin() )
+ section_stack.pop_back();
+ sname = sname.substr(3);
+ } while( sname.substr(0, 3) == "../" );
}
// 3) subsection of the root-section
else {
- section_stack.erase(section_stack.begin(), section_stack.end());
- // [] => back to root section
+ section_stack.erase(section_stack.begin(), section_stack.end());
+ // [] => back to root section
}
if( sname != "" ) {
- // parse section name for 'slashes'
- unsigned i=0;
- while( i < sname.length() ) {
- if( sname[i] == '/' ) {
- section_stack.push_back(sname.substr(0,i));
- if( i+1 < sname.length()-1 )
- sname = sname.substr(i+1);
- i = 0;
- }
- else
- ++i;
- }
- section_stack.push_back(sname);
+ // parse section name for 'slashes'
+ unsigned i=0;
+ while( i < sname.length() ) {
+ if( sname[i] == '/' ) {
+ section_stack.push_back(sname.substr(0,i));
+ if( i+1 < sname.length() )
+ sname = sname.substr(i+1);
+ i = 0;
+ }
+ else
+ ++i;
+ }
+ section_stack.push_back(sname);
}
std::string section = "";
if( section_stack.size() != 0 ) {
- victorate(std::string, section_stack, it)
- section += *it + "/";
+ victorate(std::string, section_stack, it)
+ section += *it + "/";
}
return section;
}
@@ -836,7 +840,7 @@
const std::string SearchTerm = prefix + Option;
// (*) record requested arguments for later ufo detection
- __record_argument_request(SearchTerm);
+ __record_argument_request(SearchTerm);
if( OldCursor >= argv.size() ) OldCursor = static_cast<unsigned int>(argv.size()) - 1;
search_failed_f = true;
@@ -844,15 +848,15 @@
// (*) first loop from cursor position until end
unsigned c = cursor;
for(; c < argv.size(); c++) {
- if( argv[c] == SearchTerm )
- { cursor = c; search_failed_f = false; return true; }
+ if( argv[c] == SearchTerm )
+ { cursor = c; search_failed_f = false; return true; }
}
if( ! search_loop_f ) return false;
// (*) second loop from 0 to old cursor position
for(c = 1; c < OldCursor; c++) {
- if( argv[c] == SearchTerm )
- { cursor = c; search_failed_f = false; return true; }
+ if( argv[c] == SearchTerm )
+ { cursor = c; search_failed_f = false; return true; }
}
// in case nothing is found the cursor stays where it was
return false;
@@ -873,22 +877,22 @@
va_start(ap, P);
unsigned i = 1;
for(; i < No; ++i) {
- char* Opt = va_arg(ap, char *);
- if( search(Opt) == true ) break;
+ char* Opt = va_arg(ap, char *);
+ if( search(Opt) == true ) break;
}
if( i < No ) {
- ++i;
- // loop was left before end of array --> hit but
- // make sure that the rest of the search terms is marked
- // as requested.
- for(; i < No; ++i) {
- char* Opt = va_arg(ap, char *);
- // (*) record requested arguments for later ufo detection
- __record_argument_request(Opt);
- }
- va_end(ap);
- return true;
+ ++i;
+ // loop was left before end of array --> hit but
+ // make sure that the rest of the search terms is marked
+ // as requested.
+ for(; i < No; ++i) {
+ char* Opt = va_arg(ap, char *);
+ // (*) record requested arguments for later ufo detection
+ __record_argument_request(Opt);
+ }
+ va_end(ap);
+ return true;
}
va_end(ap);
@@ -974,6 +978,8 @@
inline const std::string
GetPot::next(const char* Default)
{
+ using namespace std;
+
if( search_failed_f ) return Default;
cursor++;
@@ -1040,11 +1046,11 @@
va_start(ap, P);
unsigned i=1;
for(; i<No; ++i) {
- char* Opt = va_arg(ap, char *);
- if( search(Opt) == true ) {
- va_end(ap);
- return next(Default);
- }
+ char* Opt = va_arg(ap, char *);
+ if( search(Opt) == true ) {
+ va_end(ap);
+ return next(Default);
+ }
}
va_end(ap);
return Default;
@@ -1060,11 +1066,11 @@
va_list ap;
va_start(ap, P);
for(unsigned i=1; i<No; ++i) {
- char* Opt = va_arg(ap, char *);
- if( search(Opt) == true ) {
- va_end(ap);
- return next(Default);
- }
+ char* Opt = va_arg(ap, char *);
+ if( search(Opt) == true ) {
+ va_end(ap);
+ return next(Default);
+ }
}
va_end(ap);
return Default;
@@ -1081,11 +1087,11 @@
va_start(ap, P);
unsigned i=1;
for(; i<No; ++i) {
- char* Opt = va_arg(ap, char *);
- if( search(Opt) == true ) {
- va_end(ap);
- return next(Default);
- }
+ char* Opt = va_arg(ap, char *);
+ if( search(Opt) == true ) {
+ va_end(ap);
+ return next(Default);
+ }
}
va_end(ap);
return Default;
@@ -1102,20 +1108,20 @@
std::vector<std::string> result_list;
if( search(Option) == false ) return result_list;
while( 1 + 1 == 2 ) {
- ++cursor;
- if( cursor >= argv.size() ) {
- cursor = argv.size() - 1;
- return result_list;
- }
- if( argv[cursor].length() >= 1 ) {
- if( argv[cursor][0] == '-' ) {
- return result_list;
- }
- // -- record for later ufo-detection
- __record_argument_request(argv[cursor]);
- // -- append to the result list
- result_list.push_back(argv[cursor]);
- }
+ ++cursor;
+ if( cursor >= argv.size() ) {
+ cursor = argv.size() - 1;
+ return result_list;
+ }
+ if( argv[cursor].length() >= 1 ) {
+ if( argv[cursor][0] == '-' ) {
+ return result_list;
+ }
+ // -- record for later ufo-detection
+ __record_argument_request(argv[cursor]);
+ // -- append to the result list
+ result_list.push_back(argv[cursor]);
+ }
}
}
@@ -1130,17 +1136,17 @@
va_list ap;
va_start(ap, No);
for(unsigned i=0; i<No; ++i) {
- char* Option = va_arg(ap, char *);
- std::vector<std::string> tmp = nominus_followers(Option);
- result_list.insert(result_list.end(), tmp.begin(), tmp.end());
+ char* Option = va_arg(ap, char *);
+ std::vector<std::string> tmp = nominus_followers(Option);
+ result_list.insert(result_list.end(), tmp.begin(), tmp.end());
- // std::cerr << "option = '" << Option << "'" << std::endl;
- // std::cerr << "length = " << tmp.size() << std::endl;
- // std::cerr << "new result list = <";
- // for(std::vector<std::string>::const_iterator it = result_list.begin();
- // it != result_list.end(); ++it)
- // std::cerr << *it << ", ";
- // std::cerr << ">\n";
+ // std::cerr << "option = '" << Option << "'" << std::endl;
+ // std::cerr << "length = " << tmp.size() << std::endl;
+ // std::cerr << "new result list = <";
+ // for(std::vector<std::string>::const_iterator it = result_list.begin();
+ // it != result_list.end(); ++it)
+ // std::cerr << *it << ", ";
+ // std::cerr << ">\n";
}
va_end(ap);
return result_list;
@@ -1201,32 +1207,32 @@
unsigned idx = 0;
while( it != argv.end() ) {
- // (*) does start string match the given option?
- // NO -> goto next option
- if( strncmp(StartString, (*it).c_str(), N) != 0) { ++it; ++idx; continue; }
+ // (*) does start string match the given option?
+ // NO -> goto next option
+ if( strncmp(StartString, (*it).c_str(), N) != 0) { ++it; ++idx; continue; }
- // append the found tail to the result vector
- result.push_back((*it).substr(N));
-
- // adapt the nominus vector
- std::vector<unsigned>::iterator nit = idx_nominus.begin();
- for(; nit != idx_nominus.end(); ++nit) {
- if( *nit == idx ) {
- idx_nominus.erase(nit);
- for(; nit != idx_nominus.end(); ++nit) *nit -= 1;
- break;
- }
- }
-
- // erase the found option
- argv.erase(it);
+ // append the found tail to the result vector
+ result.push_back((*it).substr(N));
+
+ // adapt the nominus vector
+ std::vector<unsigned>::iterator nit = idx_nominus.begin();
+ for(; nit != idx_nominus.end(); ++nit) {
+ if( *nit == idx ) {
+ idx_nominus.erase(nit);
+ for(; nit != idx_nominus.end(); ++nit) *nit -= 1;
+ break;
+ }
+ }
+
+ // erase the found option
+ argv.erase(it);
- // 100% safe solution: set iterator back to the beginning.
- // (normally, 'it--' would be enough, but who knows how the
- // iterator is implemented and .erase() definitely invalidates
- // the current iterator position.
- if( argv.empty() ) break;
- it = argv.begin();
+ // 100% safe solution: set iterator back to the beginning.
+ // (normally, 'it--' would be enough, but who knows how the
+ // iterator is implemented and .erase() definitely invalidates
+ // the current iterator position.
+ if( argv.empty() ) break;
+ it = argv.begin();
}
cursor = 0;
nominus_cursor = -1;
@@ -1243,32 +1249,32 @@
unsigned idx = 0;
while( it != argv.end() ) {
- // (*) does start string match the given option?
- // NO -> goto next option
- if( strncmp(StartString, (*it).c_str(), N) != 0) { ++it; ++idx; continue; }
-
- // append the found tail to the result vector
- result.push_back(__convert_to_type((*it).substr(N), Default));
+ // (*) does start string match the given option?
+ // NO -> goto next option
+ if( strncmp(StartString, (*it).c_str(), N) != 0) { ++it; ++idx; continue; }
+
+ // append the found tail to the result vector
+ result.push_back(__convert_to_type((*it).substr(N), Default));
- // adapt the nominus vector
- std::vector<unsigned>::iterator nit = idx_nominus.begin();
- for(; nit != idx_nominus.end(); ++nit) {
- if( *nit == idx ) {
- idx_nominus.erase(nit);
- for(; nit != idx_nominus.end(); ++nit) *nit -= 1;
- break;
- }
- }
+ // adapt the nominus vector
+ std::vector<unsigned>::iterator nit = idx_nominus.begin();
+ for(; nit != idx_nominus.end(); ++nit) {
+ if( *nit == idx ) {
+ idx_nominus.erase(nit);
+ for(; nit != idx_nominus.end(); ++nit) *nit -= 1;
+ break;
+ }
+ }
- // erase the found option
- argv.erase(it);
-
- // 100% safe solution: set iterator back to the beginning.
- // (normally, 'it--' would be enough, but who knows how the
- // iterator is implemented and .erase() definitely invalidates
- // the current iterator position.
- if( argv.empty() ) break;
- it = argv.begin();
+ // erase the found option
+ argv.erase(it);
+
+ // 100% safe solution: set iterator back to the beginning.
+ // (normally, 'it--' would be enough, but who knows how the
+ // iterator is implemented and .erase() definitely invalidates
+ // the current iterator position.
+ if( argv.empty() ) break;
+ it = argv.begin();
}
cursor = 0;
nominus_cursor = -1;
@@ -1277,7 +1283,7 @@
inline std::vector<double>
GetPot::double_tails(const char* StartString,
- const double Default /* = -1.0 */)
+ const double Default /* = -1.0 */)
{
std::vector<double> result;
const unsigned N = static_cast<unsigned int>(strlen(StartString));
@@ -1285,32 +1291,32 @@
std::vector<std::string>::iterator it = argv.begin();
unsigned idx = 0;
while( it != argv.end() ) {
- // (*) does start string match the given option?
- // NO -> goto next option
- if( strncmp(StartString, (*it).c_str(), N) != 0) { ++it; ++idx; continue; }
-
- // append the found tail to the result vector
- result.push_back(__convert_to_type((*it).substr(N), Default));
+ // (*) does start string match the given option?
+ // NO -> goto next option
+ if( strncmp(StartString, (*it).c_str(), N) != 0) { ++it; ++idx; continue; }
+
+ // append the found tail to the result vector
+ result.push_back(__convert_to_type((*it).substr(N), Default));
- // adapt the nominus vector
- std::vector<unsigned>::iterator nit = idx_nominus.begin();
- for(; nit != idx_nominus.end(); ++nit) {
- if( *nit == idx ) {
- idx_nominus.erase(nit);
- for(; nit != idx_nominus.end(); ++nit) *nit -= 1;
- break;
- }
- }
+ // adapt the nominus vector
+ std::vector<unsigned>::iterator nit = idx_nominus.begin();
+ for(; nit != idx_nominus.end(); ++nit) {
+ if( *nit == idx ) {
+ idx_nominus.erase(nit);
+ for(; nit != idx_nominus.end(); ++nit) *nit -= 1;
+ break;
+ }
+ }
- // erase the found option
- argv.erase(it);
-
- // 100% safe solution: set iterator back to the beginning.
- // (normally, 'it--' would be enough, but who knows how the
- // iterator is implemented and .erase() definitely invalidates
- // the current iterator position.
- if( argv.empty() ) break;
- it = argv.begin();
+ // erase the found option
+ argv.erase(it);
+
+ // 100% safe solution: set iterator back to the beginning.
+ // (normally, 'it--' would be enough, but who knows how the
+ // iterator is implemented and .erase() definitely invalidates
+ // the current iterator position.
+ if( argv.empty() ) break;
+ it = argv.begin();
}
cursor = 0;
nominus_cursor = -1;
@@ -1336,16 +1342,16 @@
// (*) first loop from cursor position until end
unsigned c = cursor;
for(; c < argv.size(); c++) {
- if( strncmp(StartString, argv[c].c_str(), N) == 0)
- { cursor = c; search_failed_f = false; return &(argv[c].c_str()[N]); }
+ if( strncmp(StartString, argv[c].c_str(), N) == 0)
+ { cursor = c; search_failed_f = false; return &(argv[c].c_str()[N]); }
}
if( ! search_loop_f ) return false;
// (*) second loop from 0 to old cursor position
for(c = 1; c < OldCursor; c++) {
- if( strncmp(StartString, argv[c].c_str(), N) == 0)
- { cursor = c; search_failed_f = false; return &(argv[c].c_str()[N]); }
+ if( strncmp(StartString, argv[c].c_str(), N) == 0)
+ { cursor = c; search_failed_f = false; return &(argv[c].c_str()[N]); }
}
return 0;
}
@@ -1361,10 +1367,10 @@
std::string str;
STRING_VECTOR::const_iterator it = argv.begin();
for(; it != argv.end(); ++it) {
- str = __get_remaining_string(*it, prefix);
+ str = __get_remaining_string(*it, prefix);
- if( str.length() >= 2 && str[0] == '-' && str[1] != '-' )
- if( __check_flags(str, FlagList) ) return true;
+ if( str.length() >= 2 && str[0] == '-' && str[1] != '-' )
+ if( __check_flags(str, FlagList) ) return true;
}
return false;
}
@@ -1379,8 +1385,8 @@
((GetPot*)this)->__record_argument_request(argv[Idx]);
if( prefix == "" )
- // search argument for any flag in flag list
- return __check_flags(argv[Idx], FlagList);
+ // search argument for any flag in flag list
+ return __check_flags(argv[Idx], FlagList);
// if a prefix is set, then the argument index is the index
// inside the 'namespace'
@@ -1388,12 +1394,12 @@
unsigned no_matches = 0;
unsigned i=0;
for(; i<argv.size(); ++i) {
- const std::string Remain = __get_remaining_string(argv[i], prefix);
- if( Remain != "") {
- no_matches += 1;
- if( no_matches == Idx)
- return __check_flags(Remain, FlagList);
- }
+ const std::string Remain = __get_remaining_string(argv[i], prefix);
+ if( Remain != "") {
+ no_matches += 1;
+ if( no_matches == Idx)
+ return __check_flags(Remain, FlagList);
+ }
}
// no argument in this namespace
return false;
@@ -1404,7 +1410,7 @@
{
const char* p=FlagList;
for(; *p != '\0' ; p++)
- if( Str.find(*p) != std::string::npos ) return true; // found something
+ if( Str.find(*p) != std::string::npos ) return true; // found something
return false;
}
@@ -1417,12 +1423,12 @@
STRING_VECTOR nv;
std::vector<unsigned>::const_iterator it = idx_nominus.begin();
for(; it != idx_nominus.end(); ++it) {
- nv.push_back(argv[*it]);
+ nv.push_back(argv[*it]);
- // (*) record for later ufo-detection
- // when a nominus vector is requested, the entire set of nominus arguments are
- // tagged as 'requested'
- ((GetPot*)this)->__record_argument_request(argv[*it]);
+ // (*) record for later ufo-detection
+ // when a nominus vector is requested, the entire set of nominus arguments are
+ // tagged as 'requested'
+ ((GetPot*)this)->__record_argument_request(argv[*it]);
}
return nv;
}
@@ -1431,14 +1437,14 @@
GetPot::next_nominus()
{
if( nominus_cursor < int(idx_nominus.size()) - 1 ) {
- const std::string Tmp = argv[idx_nominus[++nominus_cursor]];
+ const std::string Tmp = argv[idx_nominus[++nominus_cursor]];
- // (*) record for later ufo-detection
- __record_argument_request(Tmp);
+ // (*) record for later ufo-detection
+ __record_argument_request(Tmp);
- // -- cannot use the Tmp variable, since it is temporary and c_str() will return a pointer
- // to something that does no longer exist.
- return Tmp;
+ // -- cannot use the Tmp variable, since it is temporary and c_str() will return a pointer
+ // to something that does no longer exist.
+ return Tmp;
}
return std::string("");
}
@@ -1520,8 +1526,8 @@
// (*) record considered section for ufo detection
STRING_VECTOR STree = __get_section_tree(Name);
victorate(std::string, STree, it)
- if( find(_requested_sections.begin(), _requested_sections.end(), *it) == _requested_sections.end() )
- if( section.length() != 0 ) _requested_sections.push_back(*it);
+ if( find(_requested_sections.begin(), _requested_sections.end(), *it) == _requested_sections.end() )
+ if( section.length() != 0 ) _requested_sections.push_back(*it);
}
inline void
@@ -1535,8 +1541,8 @@
// (*) record considered section for ufo detection
STRING_VECTOR STree = __get_section_tree(Name);
victorate(std::string, STree, it)
- if( find(_requested_sections.begin(), _requested_sections.end(), *it) == _requested_sections.end() )
- if( section.length() != 0 ) _requested_sections.push_back(*it);
+ if( find(_requested_sections.begin(), _requested_sections.end(), *it) == _requested_sections.end() )
+ if( section.length() != 0 ) _requested_sections.push_back(*it);
}
// (*) following functions are to be used from 'outside', after getpot has parsed its
@@ -1584,8 +1590,8 @@
STRING_VECTOR result;
std::vector<GetPot::variable>::const_iterator it = variables.begin();
for(; it != variables.end(); ++it) {
- const std::string Tmp = __get_remaining_string((*it).name, prefix);
- if( Tmp != "" ) result.push_back(Tmp);
+ const std::string Tmp = __get_remaining_string((*it).name, prefix);
+ if( Tmp != "" ) result.push_back(Tmp);
}
return result;
}
@@ -1604,7 +1610,7 @@
std::vector<variable>::const_iterator it = variables.begin();
for(; it != variables.end(); ++it) {
- if( (*it).name == Name ) return &(*it);
+ if( (*it).name == Name ) return &(*it);
}
return 0;
}
@@ -1619,7 +1625,7 @@
std::cout << "argc = " << static_cast<unsigned int>(argv.size()) << std::endl;
STRING_VECTOR::const_iterator it = argv.begin();
for(; it != argv.end(); ++it)
- std::cout << *it << std::endl;
+ std::cout << *it << std::endl;
std::cout << std::endl;
return 1;
}
@@ -1682,19 +1688,19 @@
unsigned first = 0;
unsigned i = 0;
for(; i<str.size(); ++i) {
- if( i < str.size() - 2 && str.substr(i, 2) == "${" ) {
- if( open_brackets == 0 ) first = i+2;
- open_brackets++;
- }
- else if( str[i] == '}' && open_brackets > 0) {
- open_brackets -= 1;
- if( open_brackets == 0 ) {
- const std::string Replacement = __DBE_expand(str.substr(first, i - first));
- new_string += Replacement;
- }
- }
- else if( open_brackets == 0 )
- new_string += str[i];
+ if( i < str.size() - 2 && str.substr(i, 2) == "${" ) {
+ if( open_brackets == 0 ) first = i+2;
+ open_brackets++;
+ }
+ else if( str[i] == '}' && open_brackets > 0) {
+ open_brackets -= 1;
+ if( open_brackets == 0 ) {
+ const std::string Replacement = __DBE_expand(str.substr(first, i - first));
+ new_string += Replacement;
+ }
+ }
+ else if( open_brackets == 0 )
+ new_string += str[i];
}
return new_string;
}
@@ -1711,7 +1717,7 @@
unsigned i=0;
// (1) eat initial whitespaces
for(; i < str.size(); ++i)
- if( ! isspace(str[i]) ) break;
+ if( ! isspace(str[i]) ) break;
STRING_VECTOR expr_list;
unsigned open_brackets = 0;
@@ -1721,53 +1727,53 @@
// (2) search for ${ } expressions ...
while( i < l ) {
- const char letter = str[i];
- // whitespace -> end of expression
- if( isspace(letter) && open_brackets == 0) {
- expr_list.push_back(str.substr(start_new_string, i - start_new_string));
- bool no_breakout_f = true;
- for(++i; i < l ; ++i) {
- if( ! isspace(str[i]) )
- { no_breakout_f = false; start_new_string = i; break; }
- }
- if( no_breakout_f ) {
- // end of expression list
- if( expr_list.size() < ExpectedNumber ) {
- const std::string pre_tmp("<< ${ }: missing arguments>>");
- STRING_VECTOR tmp(ExpectedNumber - expr_list.size(), pre_tmp);
- expr_list.insert(expr_list.end(), tmp.begin(), tmp.end());
- }
- return expr_list;
- }
- }
+ const char letter = str[i];
+ // whitespace -> end of expression
+ if( isspace(letter) && open_brackets == 0) {
+ expr_list.push_back(str.substr(start_new_string, i - start_new_string));
+ bool no_breakout_f = true;
+ for(++i; i < l ; ++i) {
+ if( ! isspace(str[i]) )
+ { no_breakout_f = false; start_new_string = i; break; }
+ }
+ if( no_breakout_f ) {
+ // end of expression list
+ if( expr_list.size() < ExpectedNumber ) {
+ const std::string pre_tmp("<< ${ }: missing arguments>>");
+ STRING_VECTOR tmp(ExpectedNumber - expr_list.size(), pre_tmp);
+ expr_list.insert(expr_list.end(), tmp.begin(), tmp.end());
+ }
+ return expr_list;
+ }
+ }
- // dollar-bracket expression
- if( str.length() >= i+2 && str.substr(i, 2) == "${" ) {
- open_brackets++;
- start_idx.push_back(i+2);
- }
- else if( letter == '}' && open_brackets > 0) {
- int start = start_idx[start_idx.size()-1];
- start_idx.pop_back();
- const std::string Replacement = __DBE_expand(str.substr(start, i-start));
- if( start - 3 < (int)0)
- str = Replacement + str.substr(i+1);
- else
- str = str.substr(0, start-2) + Replacement + str.substr(i+1);
- l = static_cast<unsigned int>(str.size());
- i = start + static_cast<unsigned int>(Replacement.size()) - 3;
- open_brackets--;
- }
- ++i;
+ // dollar-bracket expression
+ if( str.length() >= i+2 && str.substr(i, 2) == "${" ) {
+ open_brackets++;
+ start_idx.push_back(i+2);
+ }
+ else if( letter == '}' && open_brackets > 0) {
+ int start = start_idx[start_idx.size()-1];
+ start_idx.pop_back();
+ const std::string Replacement = __DBE_expand(str.substr(start, i-start));
+ if( start - 3 < (int)0)
+ str = Replacement + str.substr(i+1);
+ else
+ str = str.substr(0, start-2) + Replacement + str.substr(i+1);
+ l = static_cast<unsigned int>(str.size());
+ i = start + static_cast<unsigned int>(Replacement.size()) - 3;
+ open_brackets--;
+ }
+ ++i;
}
// end of expression list
expr_list.push_back(str.substr(start_new_string, i-start_new_string));
if( expr_list.size() < ExpectedNumber ) {
- const std::string pre_tmp("<< ${ }: missing arguments>>");
- STRING_VECTOR tmp(ExpectedNumber - expr_list.size(), pre_tmp);
- expr_list.insert(expr_list.end(), tmp.begin(), tmp.end());
+ const std::string pre_tmp("<< ${ }: missing arguments>>");
+ STRING_VECTOR tmp(ExpectedNumber - expr_list.size(), pre_tmp);
+ expr_list.insert(expr_list.end(), tmp.begin(), tmp.end());
}
return expr_list;
@@ -1798,7 +1804,7 @@
#else
_snprintf(tmp, sizeof(char)*(VarName.length() + 25),
#endif
- "<<${ } variable '%s' undefined>>", VarName.c_str());
+ "<<${ } variable '%s' undefined>>", VarName.c_str());
ev.name = "";
ev.original = std::string(tmp);
delete [] tmp;
@@ -1810,213 +1816,213 @@
{
// ${: } pure text
if( expr[0] == ':' )
- return expr.substr(1);
+ return expr.substr(1);
// ${& expr expr ... } text concatination
else if( expr[0] == '&' ) {
- const STRING_VECTOR A = __DBE_get_expr_list(expr.substr(1), 1);
+ const STRING_VECTOR A = __DBE_get_expr_list(expr.substr(1), 1);
- STRING_VECTOR::const_iterator it = A.begin();
- std::string result = *it++;
- for(; it != A.end(); ++it) result += *it;
+ STRING_VECTOR::const_iterator it = A.begin();
+ std::string result = *it++;
+ for(; it != A.end(); ++it) result += *it;
- return result;
+ return result;
}
// ${<-> expr expr expr} text replacement
else if( expr.length() >= 3 && expr.substr(0, 3) == "<->" ) {
- STRING_VECTOR A = __DBE_get_expr_list(expr.substr(3), 3);
- std::string::size_type tmp = 0;
- const std::string::size_type L = A[1].length();
- while( (tmp = A[0].find(A[1])) != std::string::npos ) {
- A[0].replace(tmp, L, A[2]);
- }
- return A[0];
+ STRING_VECTOR A = __DBE_get_expr_list(expr.substr(3), 3);
+ std::string::size_type tmp = 0;
+ const std::string::size_type L = A[1].length();
+ while( (tmp = A[0].find(A[1])) != std::string::npos ) {
+ A[0].replace(tmp, L, A[2]);
+ }
+ return A[0];
}
// ${+ ...}, ${- ...}, ${* ...}, ${/ ...} expressions
else if( expr[0] == '+' ) {
- STRING_VECTOR A = __DBE_get_expr_list(expr.substr(1), 2);
- STRING_VECTOR::const_iterator it = A.begin();
- double result = __convert_to_type(*it++, 0.0);
- for(; it != A.end(); ++it)
- result += __convert_to_type(*it, 0.0);
+ STRING_VECTOR A = __DBE_get_expr_list(expr.substr(1), 2);
+ STRING_VECTOR::const_iterator it = A.begin();
+ double result = __convert_to_type(*it++, 0.0);
+ for(; it != A.end(); ++it)
+ result += __convert_to_type(*it, 0.0);
- return __double2string(result);
+ return __double2string(result);
}
else if( expr[0] == '-' ) {
- STRING_VECTOR A = __DBE_get_expr_list(expr.substr(1), 2);
- STRING_VECTOR::const_iterator it = A.begin();
- double result = __convert_to_type(*it++, 0.0);
- for(; it != A.end(); ++it)
- result -= __convert_to_type(*it, 0.0);
+ STRING_VECTOR A = __DBE_get_expr_list(expr.substr(1), 2);
+ STRING_VECTOR::const_iterator it = A.begin();
+ double result = __convert_to_type(*it++, 0.0);
+ for(; it != A.end(); ++it)
+ result -= __convert_to_type(*it, 0.0);
- return __double2string(result);
+ return __double2string(result);
}
else if( expr[0] == '*' ) {
- STRING_VECTOR A = __DBE_get_expr_list(expr.substr(1), 2);
- STRING_VECTOR::const_iterator it = A.begin();
- double result = __convert_to_type(*it++, 0.0);
- for(; it != A.end(); ++it)
- result *= __convert_to_type(*it, 0.0);
+ STRING_VECTOR A = __DBE_get_expr_list(expr.substr(1), 2);
+ STRING_VECTOR::const_iterator it = A.begin();
+ double result = __convert_to_type(*it++, 0.0);
+ for(; it != A.end(); ++it)
+ result *= __convert_to_type(*it, 0.0);
- return __double2string(result);
+ return __double2string(result);
}
else if( expr[0] == '/' ) {
- STRING_VECTOR A = __DBE_get_expr_list(expr.substr(1), 2);
- STRING_VECTOR::const_iterator it = A.begin();
- double result = __convert_to_type(*it++, 0.0);
- if( result == 0 ) return "0.0";
- for(; it != A.end(); ++it) {
- const double Q = __convert_to_type(*it, 0.0);
- if( Q == 0.0 ) return "0.0";
- result /= Q;
- }
- return __double2string(result);
+ STRING_VECTOR A = __DBE_get_expr_list(expr.substr(1), 2);
+ STRING_VECTOR::const_iterator it = A.begin();
+ double result = __convert_to_type(*it++, 0.0);
+ if( result == 0 ) return "0.0";
+ for(; it != A.end(); ++it) {
+ const double Q = __convert_to_type(*it, 0.0);
+ if( Q == 0.0 ) return "0.0";
+ result /= Q;
+ }
+ return __double2string(result);
}
// ${^ ... } power expressions
else if( expr[0] == '^' ) {
- STRING_VECTOR A = __DBE_get_expr_list(expr.substr(1), 2);
- STRING_VECTOR::const_iterator it = A.begin();
- double result = __convert_to_type(*it++, 0.0);
- for(; it != A.end(); ++it)
- result = pow(result, __convert_to_type(*it, 0.0));
- return __double2string(result);
+ STRING_VECTOR A = __DBE_get_expr_list(expr.substr(1), 2);
+ STRING_VECTOR::const_iterator it = A.begin();
+ double result = __convert_to_type(*it++, 0.0);
+ for(; it != A.end(); ++it)
+ result = pow(result, __convert_to_type(*it, 0.0));
+ return __double2string(result);
}
// ${== } ${<= } ${>= } comparisons (return the number of the first 'match'
else if( expr.length() >= 2 &&
- ( expr.substr(0,2) == "==" || expr.substr(0,2) == ">=" ||
- expr.substr(0,2) == "<=" || expr[0] == '>' || expr[0] == '<')) {
- // differentiate between two and one sign operators
- unsigned op = 0;
- enum { EQ, GEQ, LEQ, GT, LT };
- if ( expr.substr(0, 2) == "==" ) op = EQ;
- else if ( expr.substr(0, 2) == ">=" ) op = GEQ;
- else if ( expr.substr(0, 2) == "<=" ) op = LEQ;
- else if ( expr[0] == '>' ) op = GT;
- else /* "<" */ op = LT;
+ ( expr.substr(0,2) == "==" || expr.substr(0,2) == ">=" ||
+ expr.substr(0,2) == "<=" || expr[0] == '>' || expr[0] == '<')) {
+ // differentiate between two and one sign operators
+ unsigned op = 0;
+ enum { EQ, GEQ, LEQ, GT, LT };
+ if ( expr.substr(0, 2) == "==" ) op = EQ;
+ else if ( expr.substr(0, 2) == ">=" ) op = GEQ;
+ else if ( expr.substr(0, 2) == "<=" ) op = LEQ;
+ else if ( expr[0] == '>' ) op = GT;
+ else /* "<" */ op = LT;
- STRING_VECTOR a;
- if ( op == GT || op == LT ) a = __DBE_get_expr_list(expr.substr(1), 2);
- else a = __DBE_get_expr_list(expr.substr(2), 2);
+ STRING_VECTOR a;
+ if ( op == GT || op == LT ) a = __DBE_get_expr_list(expr.substr(1), 2);
+ else a = __DBE_get_expr_list(expr.substr(2), 2);
- std::string x_orig = a[0];
- double x = __convert_to_type(x_orig, 1e37);
- unsigned i = 1;
+ std::string x_orig = a[0];
+ double x = __convert_to_type(x_orig, 1e37);
+ unsigned i = 1;
- STRING_VECTOR::const_iterator y_orig = a.begin();
- for(y_orig++; y_orig != a.end(); y_orig++) {
- double y = __convert_to_type(*y_orig, 1e37);
+ STRING_VECTOR::const_iterator y_orig = a.begin();
+ for(y_orig++; y_orig != a.end(); y_orig++) {
+ double y = __convert_to_type(*y_orig, 1e37);
- // set the strings as reference if one wasn't a number
- if ( x == 1e37 || y == 1e37 ) {
- // it's a string comparison
- if( (op == EQ && x_orig == *y_orig) || (op == GEQ && x_orig >= *y_orig) ||
- (op == LEQ && x_orig <= *y_orig) || (op == GT && x_orig > *y_orig) ||
- (op == LT && x_orig < *y_orig) )
- return __int2string(i);
- }
- else {
- // it's a number comparison
- if( (op == EQ && x == y) || (op == GEQ && x >= y) ||
- (op == LEQ && x <= y) || (op == GT && x > y) ||
- (op == LT && x < y) )
- return __int2string(i);
- }
- ++i;
- }
+ // set the strings as reference if one wasn't a number
+ if ( x == 1e37 || y == 1e37 ) {
+ // it's a string comparison
+ if( (op == EQ && x_orig == *y_orig) || (op == GEQ && x_orig >= *y_orig) ||
+ (op == LEQ && x_orig <= *y_orig) || (op == GT && x_orig > *y_orig) ||
+ (op == LT && x_orig < *y_orig) )
+ return __int2string(i);
+ }
+ else {
+ // it's a number comparison
+ if( (op == EQ && x == y) || (op == GEQ && x >= y) ||
+ (op == LEQ && x <= y) || (op == GT && x > y) ||
+ (op == LT && x < y) )
+ return __int2string(i);
+ }
+ ++i;
+ }
- // nothing fulfills the condition => return 0
- return "0";
+ // nothing fulfills the condition => return 0
+ return "0";
}
// ${?? expr expr} select
else if( expr.length() >= 2 && expr.substr(0, 2) == "??" ) {
- STRING_VECTOR a = __DBE_get_expr_list(expr.substr(2), 2);
- double x = __convert_to_type(a[0], 1e37);
- // last element is always the default argument
- if( x == 1e37 || x < 0 || x >= a.size() - 1 ) return a[a.size()-1];
+ STRING_VECTOR a = __DBE_get_expr_list(expr.substr(2), 2);
+ double x = __convert_to_type(a[0], 1e37);
+ // last element is always the default argument
+ if( x == 1e37 || x < 0 || x >= a.size() - 1 ) return a[a.size()-1];
- // round x to closest integer
- return a[int(x+0.5)];
+ // round x to closest integer
+ return a[int(x+0.5)];
}
// ${? expr expr expr} if then else conditions
else if( expr[0] == '?' ) {
- STRING_VECTOR a = __DBE_get_expr_list(expr.substr(1), 2);
- if( __convert_to_type(a[0], 0.0) == 1.0 ) return a[1];
- else if( a.size() > 2 ) return a[2];
+ STRING_VECTOR a = __DBE_get_expr_list(expr.substr(1), 2);
+ if( __convert_to_type(a[0], 0.0) == 1.0 ) return a[1];
+ else if( a.size() > 2 ) return a[2];
}
// ${! expr} maxro expansion
else if( expr[0] == '!' ) {
- const GetPot::variable* Var = __DBE_get_variable(expr.substr(1));
- // error
- if( Var->name == "" ) return std::string(Var->original);
+ const GetPot::variable* Var = __DBE_get_variable(expr.substr(1));
+ // error
+ if( Var->name == "" ) return std::string(Var->original);
- const STRING_VECTOR A = __DBE_get_expr_list(Var->original, 2);
- return A[0];
+ const STRING_VECTOR A = __DBE_get_expr_list(Var->original, 2);
+ return A[0];
}
// ${@: } - string subscription
else if( expr.length() >= 2 && expr.substr(0,2) == "@:" ) {
- const STRING_VECTOR A = __DBE_get_expr_list(expr.substr(2), 2);
- double x = __convert_to_type(A[1], 1e37);
+ const STRING_VECTOR A = __DBE_get_expr_list(expr.substr(2), 2);
+ double x = __convert_to_type(A[1], 1e37);
- // last element is always the default argument
- if( x == 1e37 || x < 0 || x >= A[0].size() - 1)
- return "<<1st index out of range>>";
+ // last element is always the default argument
+ if( x == 1e37 || x < 0 || x >= A[0].size() - 1)
+ return "<<1st index out of range>>";
- if( A.size() > 2 ) {
- double y = __convert_to_type(A[2], 1e37);
- if ( y != 1e37 && y > 0 && y <= A[0].size() - 1 && y > x )
- return A[0].substr(int(x+0.5), int(y+1.5) - int(x+0.5));
- else if( y == -1 )
- return A[0].substr(int(x+0.5));
- return "<<2nd index out of range>>";
- }
- else {
- char* tmp = new char[2];
- tmp[0] = A[0][int(x+0.5)]; tmp[1] = '\0';
- std::string result(tmp);
- delete [] tmp;
- return result;
- }
+ if( A.size() > 2 ) {
+ double y = __convert_to_type(A[2], 1e37);
+ if ( y != 1e37 && y > 0 && y <= A[0].size() - 1 && y > x )
+ return A[0].substr(int(x+0.5), int(y+1.5) - int(x+0.5));
+ else if( y == -1 )
+ return A[0].substr(int(x+0.5));
+ return "<<2nd index out of range>>";
+ }
+ else {
+ char* tmp = new char[2];
+ tmp[0] = A[0][int(x+0.5)]; tmp[1] = '\0';
+ std::string result(tmp);
+ delete [] tmp;
+ return result;
+ }
}
// ${@ } - vector subscription
else if( expr[0] == '@' ) {
- STRING_VECTOR A = __DBE_get_expr_list(expr.substr(1), 2);
- const GetPot::variable* Var = __DBE_get_variable(A[0]);
- // error
- if( Var->name == "" ) {
- // make a copy of the string if an error occured
- // (since the error variable is a static variable inside get_variable())
- return std::string(Var->original);
- }
+ STRING_VECTOR A = __DBE_get_expr_list(expr.substr(1), 2);
+ const GetPot::variable* Var = __DBE_get_variable(A[0]);
+ // error
+ if( Var->name == "" ) {
+ // make a copy of the string if an error occured
+ // (since the error variable is a static variable inside get_variable())
+ return std::string(Var->original);
+ }
- double x = __convert_to_type(A[1], 1e37);
+ double x = __convert_to_type(A[1], 1e37);
- // last element is always the default argument
- if (x == 1e37 || x < 0 || x >= Var->value.size() )
- return "<<1st index out of range>>";
+ // last element is always the default argument
+ if (x == 1e37 || x < 0 || x >= Var->value.size() )
+ return "<<1st index out of range>>";
- if ( A.size() > 2) {
- double y = __convert_to_type(A[2], 1e37);
- int begin = int(x+0.5);
- int end = 0;
- if ( y != 1e37 && y > 0 && y <= Var->value.size() && y > x)
- end = int(y+1.5);
- else if( y == -1 )
- end = static_cast<unsigned int>(Var->value.size());
- else
- return "<<2nd index out of range>>";
+ if ( A.size() > 2) {
+ double y = __convert_to_type(A[2], 1e37);
+ int begin = int(x+0.5);
+ int end = 0;
+ if ( y != 1e37 && y > 0 && y <= Var->value.size() && y > x)
+ end = int(y+1.5);
+ else if( y == -1 )
+ end = static_cast<unsigned int>(Var->value.size());
+ else
+ return "<<2nd index out of range>>";
- std::string result = *(Var->get_element(begin));
- int i = begin+1;
- for(; i < end; ++i)
- result += std::string(" ") + *(Var->get_element(i));
- return result;
- }
- else
- return *(Var->get_element(int(x+0.5)));
+ std::string result = *(Var->get_element(begin));
+ int i = begin+1;
+ for(; i < end; ++i)
+ result += std::string(" ") + *(Var->get_element(i));
+ return result;
+ }
+ else
+ return *(Var->get_element(int(x+0.5)));
}
const STRING_VECTOR A = __DBE_get_expr_list(expr, 1);
@@ -2039,14 +2045,14 @@
GetPot::__search_string_vector(const STRING_VECTOR& VecStr, const std::string& Str) const
{
victorate(std::string, VecStr, itk) {
- if( *itk == Str ) return true;
+ if( *itk == Str ) return true;
}
return false;
}
inline STRING_VECTOR
GetPot::unidentified_arguments(unsigned Number,
- const char* KnownArgument1, ...) const
+ const char* KnownArgument1, ...) const
{
STRING_VECTOR known_arguments;
@@ -2058,7 +2064,7 @@
known_arguments.push_back(std::string(KnownArgument1));
unsigned i=1;
for(; i<Number; ++i)
- known_arguments.push_back(std::string(va_arg(ap, char *)));
+ known_arguments.push_back(std::string(va_arg(ap, char *)));
va_end(ap);
return unidentified_arguments(known_arguments);
@@ -2075,20 +2081,20 @@
STRING_VECTOR::const_iterator it = argv.begin();
++it; // forget about argv[0] (application or filename)
for(; it != argv.end(); ++it) {
- // -- argument belongs to prefixed section ?
- const std::string arg = __get_remaining_string(*it, prefix);
- if( arg == "" ) continue;
+ // -- argument belongs to prefixed section ?
+ const std::string arg = __get_remaining_string(*it, prefix);
+ if( arg == "" ) continue;
- // -- check if in list
- if( __search_string_vector(Knowns, arg) == false)
- ufos.push_back(*it);
+ // -- check if in list
+ if( __search_string_vector(Knowns, arg) == false)
+ ufos.push_back(*it);
}
return ufos;
}
inline STRING_VECTOR
GetPot::unidentified_options(unsigned Number,
- const char* KnownOption1, ...) const
+ const char* KnownOption1, ...) const
{
STRING_VECTOR known_options;
@@ -2100,7 +2106,7 @@
known_options.push_back(std::string(KnownOption1));
unsigned i=1;
for(; i<Number; ++i)
- known_options.push_back(std::string(va_arg(ap, char *)));
+ known_options.push_back(std::string(va_arg(ap, char *)));
va_end(ap);
return unidentified_options(known_options);
@@ -2117,10 +2123,10 @@
// => it is not necessary to separate requested options from the list
STRING_VECTOR option_list;
victorate(std::string, _requested_arguments, it) {
- const std::string arg = *it;
- if( arg.length() == 0 ) continue;
- if( arg[0] == '-' ) option_list.push_back(arg);
- }
+ const std::string arg = *it;
+ if( arg.length() == 0 ) continue;
+ if( arg[0] == '-' ) option_list.push_back(arg);
+ }
return unidentified_options(option_list);
}
@@ -2131,15 +2137,15 @@
STRING_VECTOR::const_iterator it = argv.begin();
++it; // forget about argv[0] (application or filename)
for(; it != argv.end(); ++it) {
- // -- argument belongs to prefixed section ?
- const std::string arg = __get_remaining_string(*it, prefix);
- if( arg == "" ) continue;
+ // -- argument belongs to prefixed section ?
+ const std::string arg = __get_remaining_string(*it, prefix);
+ if( arg == "" ) continue;
- // is argument really an option (starting with '-') ?
- if( arg.length() < 1 || arg[0] != '-' ) continue;
+ // is argument really an option (starting with '-') ?
+ if( arg.length() < 1 || arg[0] != '-' ) continue;
- if( __search_string_vector(Knowns, arg) == false)
- ufos.push_back(*it);
+ if( __search_string_vector(Knowns, arg) == false)
+ ufos.push_back(*it);
}
return ufos;
@@ -2158,52 +2164,52 @@
// (2) iteration over '-' arguments (options)
if( ArgumentNumber == -1 ) {
- STRING_VECTOR::const_iterator it = argv.begin();
- ++it; // forget about argv[0] (application or filename)
- for(; it != argv.end(); ++it) {
- // -- argument belongs to prefixed section ?
- const std::string arg = __get_remaining_string(*it, prefix);
- if( arg == "" ) continue;
+ STRING_VECTOR::const_iterator it = argv.begin();
+ ++it; // forget about argv[0] (application or filename)
+ for(; it != argv.end(); ++it) {
+ // -- argument belongs to prefixed section ?
+ const std::string arg = __get_remaining_string(*it, prefix);
+ if( arg == "" ) continue;
- // -- does arguments start with '-' (but not '--')
- if ( arg.length() < 2 ) continue;
- else if( arg[0] != '-' ) continue;
- else if( arg[1] == '-' ) continue;
+ // -- does arguments start with '-' (but not '--')
+ if ( arg.length() < 2 ) continue;
+ else if( arg[0] != '-' ) continue;
+ else if( arg[1] == '-' ) continue;
- // -- check out if flags inside option are contained in KnownFlagList
- const char* p=arg.c_str();
- p++; // skip starting minus
- for(; *p != '\0' ; p++)
- if( KFL.find(*p) == std::string::npos ) ufos += *p;
- }
+ // -- check out if flags inside option are contained in KnownFlagList
+ const char* p=arg.c_str();
+ p++; // skip starting minus
+ for(; *p != '\0' ; p++)
+ if( KFL.find(*p) == std::string::npos ) ufos += *p;
+ }
}
// (1) check specific argument
else {
- // -- only check arguments that start with prefix
- int no_matches = 0;
- unsigned i=1;
- for(; i<argv.size(); ++i) {
- const std::string Remain = __get_remaining_string(argv[i], prefix);
- if( Remain != "") {
- no_matches++;
- if( no_matches == ArgumentNumber) {
- // -- the right argument number inside the section is found
- // => check it for flags
- const char* p = Remain.c_str();
- p++; // skip starting minus
- for(; *p != '\0' ; p++)
- if( KFL.find(*p) == std::string::npos ) ufos += *p;
- return ufos;
- }
- }
- }
+ // -- only check arguments that start with prefix
+ int no_matches = 0;
+ unsigned i=1;
+ for(; i<argv.size(); ++i) {
+ const std::string Remain = __get_remaining_string(argv[i], prefix);
+ if( Remain != "") {
+ no_matches++;
+ if( no_matches == ArgumentNumber) {
+ // -- the right argument number inside the section is found
+ // => check it for flags
+ const char* p = Remain.c_str();
+ p++; // skip starting minus
+ for(; *p != '\0' ; p++)
+ if( KFL.find(*p) == std::string::npos ) ufos += *p;
+ return ufos;
+ }
+ }
+ }
}
return ufos;
}
inline STRING_VECTOR
GetPot::unidentified_variables(unsigned Number,
- const char* KnownVariable1, ...) const
+ const char* KnownVariable1, ...) const
{
STRING_VECTOR known_variables;
@@ -2215,7 +2221,7 @@
known_variables.push_back(std::string(KnownVariable1));
unsigned i=1;
for(; i<Number; ++i)
- known_variables.push_back(std::string(va_arg(ap, char *)));
+ known_variables.push_back(std::string(va_arg(ap, char *)));
va_end(ap);
return unidentified_variables(known_variables);
@@ -2227,13 +2233,13 @@
STRING_VECTOR ufos;
victorate(GetPot::variable, variables, it) {
- // -- check if variable has specific prefix
- const std::string var_name = __get_remaining_string((*it).name, prefix);
- if( var_name == "" ) continue;
+ // -- check if variable has specific prefix
+ const std::string var_name = __get_remaining_string((*it).name, prefix);
+ if( var_name == "" ) continue;
- // -- check if variable is known
- if( __search_string_vector(Knowns, var_name) == false)
- ufos.push_back((*it).name);
+ // -- check if variable is known
+ if( __search_string_vector(Knowns, var_name) == false)
+ ufos.push_back((*it).name);
}
return ufos;
}
@@ -2245,7 +2251,7 @@
inline STRING_VECTOR
GetPot::unidentified_sections(unsigned Number,
- const char* KnownSection1, ...) const
+ const char* KnownSection1, ...) const
{
STRING_VECTOR known_sections;
@@ -2257,10 +2263,10 @@
known_sections.push_back(std::string(KnownSection1));
unsigned i=1;
for(; i<Number; ++i) {
- std::string tmp = std::string(va_arg(ap, char *));
- if( tmp.length() == 0 ) continue;
- if( tmp[tmp.length()-1] != '/' ) tmp += '/';
- known_sections.push_back(tmp);
+ std::string tmp = std::string(va_arg(ap, char *));
+ if( tmp.length() == 0 ) continue;
+ if( tmp[tmp.length()-1] != '/' ) tmp += '/';
+ known_sections.push_back(tmp);
}
va_end(ap);
@@ -2277,13 +2283,13 @@
STRING_VECTOR ufos;
victorate(std::string, section_list, it) {
- // -- check if section conform to prefix
- const std::string sec_name = __get_remaining_string(*it, prefix);
- if( sec_name == "" ) continue;
+ // -- check if section conform to prefix
+ const std::string sec_name = __get_remaining_string(*it, prefix);
+ if( sec_name == "" ) continue;
- // -- check if section is known
- if( __search_string_vector(Knowns, sec_name) == false )
- ufos.push_back(*it);
+ // -- check if section is known
+ if( __search_string_vector(Knowns, sec_name) == false )
+ ufos.push_back(*it);
}
return ufos;
@@ -2303,9 +2309,9 @@
known_nominuses.push_back(std::string(Known));
unsigned i=1;
for(; i<Number; ++i) {
- std::string tmp = std::string(va_arg(ap, char *));
- if( tmp.length() == 0 ) continue;
- known_nominuses.push_back(tmp);
+ std::string tmp = std::string(va_arg(ap, char *));
+ if( tmp.length() == 0 ) continue;
+ known_nominuses.push_back(tmp);
}
va_end(ap);
@@ -2333,25 +2339,25 @@
STRING_VECTOR::const_iterator it = argv.begin();
++it; // forget about argv[0] (application or filename)
for(; it != argv.end(); ++it) {
- // -- check if nominus part of prefix
- const std::string arg = __get_remaining_string(*it, prefix);
- if( arg == "" ) continue;
+ // -- check if nominus part of prefix
+ const std::string arg = __get_remaining_string(*it, prefix);
+ if( arg == "" ) continue;
- if( arg.length() < 1 ) continue;
- // option ? --> not a nomius
- if( arg[0] == '-' ) continue;
- // section ? --> not a real nominus
- if( arg[0] == '[' && arg[arg.length()-1] == ']' ) continue;
- // variable definition ? --> not a real nominus
- bool continue_f = false;
- unsigned i=0;
- for(; i<arg.length() ; ++i)
- if( arg[i] == '=' ) { continue_f = true; break; }
- if( continue_f ) continue;
+ if( arg.length() < 1 ) continue;
+ // option ? --> not a nomius
+ if( arg[0] == '-' ) continue;
+ // section ? --> not a real nominus
+ if( arg[0] == '[' && arg[arg.length()-1] == ']' ) continue;
+ // variable definition ? --> not a real nominus
+ bool continue_f = false;
+ unsigned i=0;
+ for(; i<arg.length() ; ++i)
+ if( arg[i] == '=' ) { continue_f = true; break; }
+ if( continue_f ) continue;
- // real nominuses are compared with the given list
- if( __search_string_vector(Knowns, arg) == false )
- ufos.push_back(*it);
+ // real nominuses are compared with the given list
+ if( __search_string_vector(Knowns, arg) == false )
+ ufos.push_back(*it);
}
return ufos;
}
@@ -2391,6 +2397,8 @@
inline void
GetPot::variable::take(const char* Value, const char* FieldSeparator)
{
+ using namespace std;
+
original = std::string(Value);
// separate string by white space delimiters using 'strtok'
@@ -2402,8 +2410,8 @@
char* follow_token = strtok_r(copy, FieldSeparator, &spt);
if( value.size() != 0 ) value.erase(value.begin(), value.end());
while(follow_token != 0) {
- value.push_back(std::string(follow_token));
- follow_token = strtok_r(NULL, FieldSeparator, &spt);
+ value.push_back(std::string(follow_token));
+ follow_token = strtok_r(NULL, FieldSeparator, &spt);
}
delete [] copy;
@@ -2417,9 +2425,9 @@
GetPot::variable::operator=(const GetPot::variable& That)
{
if( &That != this) {
- name = That.name;
- value = That.value;
- original = That.original;
+ name = That.name;
+ value = That.value;
+ original = That.original;
}
return *this;
}
@@ -2430,4 +2438,3 @@
#endif // __include_guard_GETPOT_H__
-
diff --git a/utils/zenutils/libraries/getpot-c++-1.1.17/getpot/LPGL.txt b/utils/zenutils/libraries/getpot-c++-1.1.18/getpot/LPGL.txt
similarity index 98%
rename from utils/zenutils/libraries/getpot-c++-1.1.17/getpot/LPGL.txt
rename to utils/zenutils/libraries/getpot-c++-1.1.18/getpot/LPGL.txt
index b1e3f5a..81cab28 100644
--- a/utils/zenutils/libraries/getpot-c++-1.1.17/getpot/LPGL.txt
+++ b/utils/zenutils/libraries/getpot-c++-1.1.18/getpot/LPGL.txt
@@ -1,5 +1,5 @@
- GNU LESSER GENERAL PUBLIC LICENSE
- Version 2.1, February 1999
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@@ -10,7 +10,7 @@
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
- Preamble
+ Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
@@ -112,7 +112,7 @@
former contains code derived from the library, whereas the latter must
be combined with the library in order to run.
- GNU LESSER GENERAL PUBLIC LICENSE
+ GNU LESSER GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other
@@ -432,7 +432,7 @@
of all derivatives of our free software and of promoting the sharing
and reuse of software generally.
- NO WARRANTY
+ NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
@@ -455,7 +455,7 @@
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.
- END OF TERMS AND CONDITIONS
+ END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries
@@ -501,4 +501,3 @@
That's all there is to it!
-
diff --git a/utils/zenutils/libraries/getpot-c++-1.1.17/getpot/README b/utils/zenutils/libraries/getpot-c++-1.1.18/getpot/README
similarity index 86%
rename from utils/zenutils/libraries/getpot-c++-1.1.17/getpot/README
rename to utils/zenutils/libraries/getpot-c++-1.1.18/getpot/README
index 3d55352..b80a0cc 100644
--- a/utils/zenutils/libraries/getpot-c++-1.1.17/getpot/README
+++ b/utils/zenutils/libraries/getpot-c++-1.1.18/getpot/README
@@ -5,10 +5,10 @@
---------- new features, that are not documented yet.
E.g.: -- automated ufo detection
- -- arbitrary comment delimiters
- -- arbitrary vector field separators
- -- tails, i.e. easy access to all tails
- of options such as '-L' or '-I'.
+ -- arbitrary comment delimiters
+ -- arbitrary vector field separators
+ -- tails, i.e. easy access to all tails
+ of options such as '-L' or '-I'.
Please, refere to the example/ directory
for usage descriptions.
@@ -47,4 +47,3 @@
Juli 2005,
Frank R. Schaefer
-
diff --git a/utils/zenutils/libraries/pelib-0.9/pelib/PeHeader.h b/utils/zenutils/libraries/pelib-0.9/pelib/PeHeader.h
index d5c1748..22c4133 100644
--- a/utils/zenutils/libraries/pelib-0.9/pelib/PeHeader.h
+++ b/utils/zenutils/libraries/pelib-0.9/pelib/PeHeader.h
@@ -14,6 +14,7 @@
#define PEHEADER_H
#include "PeLibAux.h"
+#include <string.h>
namespace PeLib
{
diff --git a/utils/zenutils/source/firmware_extract/main.cpp b/utils/zenutils/source/firmware_extract/main.cpp
index bcd77af..1f31cc8 100644
--- a/utils/zenutils/source/firmware_extract/main.cpp
+++ b/utils/zenutils/source/firmware_extract/main.cpp
@@ -18,7 +18,7 @@
#include <iostream>
#include <ctime>
-#include <getpot/getpot.hpp>
+#include <getpot/GetPot>
#include <utils.h>
#include <firmware.h>
diff --git a/utils/zenutils/source/firmware_make/main.cpp b/utils/zenutils/source/firmware_make/main.cpp
index 35d036e..29d0d20 100644
--- a/utils/zenutils/source/firmware_make/main.cpp
+++ b/utils/zenutils/source/firmware_make/main.cpp
@@ -18,7 +18,7 @@
#include <iostream>
#include <sstream>
-#include <getpot/getpot.hpp>
+#include <getpot/GetPot>
#include <file.h>
#include <firmware.h>
#include <utils.h>
diff --git a/utils/zenutils/source/update_extract/main.cpp b/utils/zenutils/source/update_extract/main.cpp
index 4891329..6c7b5b1 100644
--- a/utils/zenutils/source/update_extract/main.cpp
+++ b/utils/zenutils/source/update_extract/main.cpp
@@ -19,7 +19,7 @@
#include <iostream>
#include <iomanip>
#include <ctime>
-#include <getpot/getpot.hpp>
+#include <getpot/GetPot>
#include <file.h>
#include <updater.h>
#include <utils.h>
diff --git a/utils/zenutils/source/update_patch/main.cpp b/utils/zenutils/source/update_patch/main.cpp
index 5467694..8e8d1ac 100644
--- a/utils/zenutils/source/update_patch/main.cpp
+++ b/utils/zenutils/source/update_patch/main.cpp
@@ -19,7 +19,7 @@
#include <iostream>
#include <iomanip>
#include <cstdio>
-#include <getpot/getpot.hpp>
+#include <getpot/GetPot>
#include <file.h>
#include <updater.h>
#include <utils.h>
diff --git a/utils/zenutils/source/zen_crypt/main.cpp b/utils/zenutils/source/zen_crypt/main.cpp
index 29f0a84..f379c8e 100644
--- a/utils/zenutils/source/zen_crypt/main.cpp
+++ b/utils/zenutils/source/zen_crypt/main.cpp
@@ -17,7 +17,7 @@
*/
#include <iostream>
-#include <getpot/getpot.hpp>
+#include <getpot/GetPot>
#include <cenc.h>
#include <crypt.h>
#include <file.h>