/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield * * This library is open source and may be redistributed and/or modified under * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or * (at your option) any later version. The full license is in LICENSE file * included with this distribution, and on the openscenegraph.org website. * * 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 * OpenSceneGraph Public License for more details. */ #ifndef OSG_ARGUMENTPARSER #define OSG_ARGUMENTPARSER 1 #include #include #include #include #include #include namespace osg { class OSG_EXPORT ArgumentParser { public: class OSG_EXPORT Parameter { public: enum ParameterType { BOOL_PARAMETER, FLOAT_PARAMETER, DOUBLE_PARAMETER, INT_PARAMETER, UNSIGNED_INT_PARAMETER, STRING_PARAMETER }; union ValueUnion { bool* _bool; float* _float; double* _double; int* _int; unsigned int* _uint; std::string* _string; }; Parameter(bool& value) { _type = BOOL_PARAMETER; _value._bool = &value; } Parameter(float& value) { _type = FLOAT_PARAMETER; _value._float = &value; } Parameter(double& value) { _type = DOUBLE_PARAMETER; _value._double = &value; } Parameter(int& value) { _type = INT_PARAMETER; _value._int = &value; } Parameter(unsigned int& value) { _type = UNSIGNED_INT_PARAMETER; _value._uint = &value; } Parameter(std::string& value) { _type = STRING_PARAMETER; _value._string = &value; } Parameter(const Parameter& param) { _type = param._type; _value = param._value; } Parameter& operator = (const Parameter& param) { _type = param._type; _value = param._value; return *this; } bool valid(const char* str) const; bool assign(const char* str); protected: ParameterType _type; ValueUnion _value; }; /** Return true if the specified string is an option in the form * -option or --option. */ static bool isOption(const char* str); /** Return true if string is non-NULL and not an option in the form * -option or --option. */ static bool isString(const char* str); /** Return true if specified parameter is a number. */ static bool isNumber(const char* str); /** Return true if specified parameter is a bool. */ static bool isBool(const char* str); public: ArgumentParser(int* argc,char **argv); void setApplicationUsage(ApplicationUsage* usage) { _usage = usage; } ApplicationUsage* getApplicationUsage() { return _usage.get(); } const ApplicationUsage* getApplicationUsage() const { return _usage.get(); } /** Return the argument count. */ int& argc() { return *_argc; } /** Return the argument array. */ char** argv() { return _argv; } /** Return the char* argument at the specified position. */ char* operator [] (int pos) { return _argv[pos]; } /** Return the const char* argument at the specified position. */ const char* operator [] (int pos) const { return _argv[pos]; } /** Return the application name, as specified by argv[0] */ std::string getApplicationName() const; /** Return the position of an occurrence of a string in the argument list. * Return -1 if no string is found. */ int find(const std::string& str) const; /** Return true if the specified parameter is an option in the form of * -option or --option. */ bool isOption(int pos) const; /** Return true if the specified parameter is a string not in * the form of an option. */ bool isString(int pos) const; /** Return true if the specified parameter is a number. */ bool isNumber(int pos) const; bool containsOptions() const; /** Remove one or more arguments from the argv argument list, * and decrement the argc respectively. */ void remove(int pos,int num=1); /** Return true if the specified argument matches the given string. */ bool match(int pos, const std::string& str) const; /** Search for an occurrence of a string in the argument list. If found, * remove that occurrence and return true. Otherwise, return false. */ bool read(const std::string& str); bool read(const std::string& str, Parameter value1); bool read(const std::string& str, Parameter value1, Parameter value2); bool read(const std::string& str, Parameter value1, Parameter value2, Parameter value3); bool read(const std::string& str, Parameter value1, Parameter value2, Parameter value3, Parameter value4); bool read(const std::string& str, Parameter value1, Parameter value2, Parameter value3, Parameter value4, Parameter value5); bool read(const std::string& str, Parameter value1, Parameter value2, Parameter value3, Parameter value4, Parameter value5, Parameter value6); bool read(const std::string& str, Parameter value1, Parameter value2, Parameter value3, Parameter value4, Parameter value5, Parameter value6, Parameter value7); bool read(const std::string& str, Parameter value1, Parameter value2, Parameter value3, Parameter value4, Parameter value5, Parameter value6, Parameter value7, Parameter value8); /** If the argument value at the specified position matches the given string, * and subsequent parameters are also matched, then set the parameter values, * remove the arguments from the list, and return true. Otherwise, return false. */ bool read(int pos, const std::string& str); bool read(int pos, const std::string& str, Parameter value1); bool read(int pos, const std::string& str, Parameter value1, Parameter value2); bool read(int pos, const std::string& str, Parameter value1, Parameter value2, Parameter value3); bool read(int pos, const std::string& str, Parameter value1, Parameter value2, Parameter value3, Parameter value4); bool read(int pos, const std::string& str, Parameter value1, Parameter value2, Parameter value3, Parameter value4, Parameter value5); bool read(int pos, const std::string& str, Parameter value1, Parameter value2, Parameter value3, Parameter value4, Parameter value5, Parameter value6); bool read(int pos, const std::string& str, Parameter value1, Parameter value2, Parameter value3, Parameter value4, Parameter value5, Parameter value6, Parameter value7); bool read(int pos, const std::string& str, Parameter value1, Parameter value2, Parameter value3, Parameter value4, Parameter value5, Parameter value6, Parameter value7, Parameter value8); enum ErrorSeverity { BENIGN = 0, CRITICAL = 1 }; typedef std::map ErrorMessageMap; /** Return the error flag, true if an error has occurred when reading arguments. */ bool errors(ErrorSeverity severity=BENIGN) const; /** Report an error message by adding to the ErrorMessageMap. */ void reportError(const std::string& message,ErrorSeverity severity=CRITICAL); /** For each remaining option, report it as unrecognized. */ void reportRemainingOptionsAsUnrecognized(ErrorSeverity severity=BENIGN); /** Return the error message, if any has occurred. */ ErrorMessageMap& getErrorMessageMap() { return _errorMessageMap; } /** Return the error message, if any has occurred. */ const ErrorMessageMap& getErrorMessageMap() const { return _errorMessageMap; } /** Write error messages to the given ostream, if at or above the given severity. */ void writeErrorMessages(std::ostream& output,ErrorSeverity sevrity=BENIGN); /** This convenience method handles help requests on the command line. * Return the type(s) of help requested. The return value of this * function is suitable for passing into getApplicationUsage()->write(). * If ApplicationUsage::NO_HELP is returned then no help commandline option * was found on the command line. */ ApplicationUsage::Type readHelpType(); protected: int* _argc; char** _argv; ErrorMessageMap _errorMessageMap; ref_ptr _usage; }; } #endif