$search
00001 #ifndef UTILMM_COMMANDLINE_HH 00002 #define UTILMM_COMMANDLINE_HH 00003 00004 #include <string> 00005 #include <vector> 00006 #include <list> 00007 // #include <getopt.h> 00008 #include <iosfwd> 00009 00010 namespace utilmm 00011 { 00012 class config_set; 00013 00014 class bad_syntax : public std::exception 00015 { 00016 public: 00017 ~bad_syntax() throw() {} 00018 00019 std::string source, error; 00020 bad_syntax(std::string const& source_, std::string const& error_ = "") 00021 : source(source_), error(error_) {} 00022 char const* what() const throw() { return error.c_str(); } 00023 }; 00024 00025 class commandline_error : public std::exception 00026 { 00027 public: 00028 ~commandline_error() throw() {} 00029 std::string error; 00030 commandline_error(std::string const& error_) 00031 : error(error_) {} 00032 char const* what() const throw() { return error.c_str(); } 00033 }; 00034 00039 class cmdline_option 00040 { 00041 public: 00047 enum ArgumentType 00048 { 00049 None = 0, 00050 Optional = 1, 00051 00052 IntArgument = 2, 00053 BoolArgument = 4, 00054 StringArgument = 8, 00055 00056 DefaultValue = 16 00057 }; 00058 00059 public: 00064 cmdline_option(const std::string& description); 00065 ~cmdline_option(); 00066 00067 bool isMultiple() const; 00068 bool isRequired() const; 00069 std::string getConfigKey() const; 00070 std::string getLong() const; 00071 std::string getShort() const; 00072 std::string getHelp() const; 00073 00074 int getArgumentFlags() const; 00075 00076 bool hasArgument() const; 00077 bool isArgumentOptional() const; 00078 00079 bool hasDefaultValue() const; 00080 std::string getDefaultValue() const; 00081 00085 bool checkArgument(const std::string& value) const; 00086 00087 private: 00088 bool m_multiple; 00089 bool m_required; 00090 std::string m_config, m_long, m_short, m_help; 00091 00092 int m_argument_flags; 00093 std::string m_default; 00094 }; 00095 00165 class command_line 00166 { 00167 private: 00168 typedef std::vector<cmdline_option> Options; 00169 00170 public: 00174 command_line(const char* options[]); 00175 00177 command_line(const std::list<std::string>& description); 00178 00179 ~command_line(); 00180 00188 void parse(int argc, char const* const argv[], config_set& config); 00189 00195 std::list<std::string> remaining() const; 00196 00198 void setBanner(std::string const& banner); 00199 00201 void usage(std::ostream& out) const; 00202 00203 private: 00204 void add_argument(config_set& config, cmdline_option const& optdesc, std::string const& value); 00205 int option_match(config_set& config, cmdline_option const& opt, int argc, char const* const* argv, int i); 00206 00207 std::string m_banner; 00208 Options m_options; 00209 std::list<std::string> m_remaining; 00210 }; 00211 00212 std::ostream& operator << (std::ostream& stream, utilmm::command_line const& cmdline) 00213 { 00214 cmdline.usage(stream); 00215 return stream; 00216 } 00217 } 00218 00219 #endif 00220