summaryrefslogtreecommitdiff
path: root/src/option-parser.h
diff options
context:
space:
mode:
authorBen Smith <binjimin@gmail.com>2017-06-14 01:07:48 -0700
committerGitHub <noreply@github.com>2017-06-14 01:07:48 -0700
commit0b789eaa02755a0082f454090f8bbae7f1418e12 (patch)
treea3b6114daa4bbd164a678bacd26ba04b0f87e858 /src/option-parser.h
parent013802ca01035365e2459c70f0508481393ac075 (diff)
downloadwabt-0b789eaa02755a0082f454090f8bbae7f1418e12.tar.gz
wabt-0b789eaa02755a0082f454090f8bbae7f1418e12.tar.bz2
wabt-0b789eaa02755a0082f454090f8bbae7f1418e12.zip
Make OptionParser into C++ class (#497)
Added a new feature where you can specify how many arguments are allowed. It is an error to provide too many or too few. Also add "help" tests for all of the other tools.
Diffstat (limited to 'src/option-parser.h')
-rw-r--r--src/option-parser.h104
1 files changed, 70 insertions, 34 deletions
diff --git a/src/option-parser.h b/src/option-parser.h
index 9406748d..883e5f30 100644
--- a/src/option-parser.h
+++ b/src/option-parser.h
@@ -17,47 +17,83 @@
#ifndef WABT_OPTION_PARSER_H_
#define WABT_OPTION_PARSER_H_
+#include <functional>
+#include <string>
+#include <vector>
+
#include "common.h"
namespace wabt {
-enum class HasArgument {
- No = 0,
- Yes = 1,
-};
+class OptionParser {
+ public:
+ enum class HasArgument { No, Yes };
+ enum class ArgumentCount { One, OneOrMore };
-struct Option;
-struct OptionParser;
-typedef void (*OptionCallback)(struct OptionParser*,
- struct Option*,
- const char* argument);
-typedef void (*ArgumentCallback)(struct OptionParser*, const char* argument);
-typedef void (*OptionErrorCallback)(struct OptionParser*, const char* message);
-
-struct Option {
- int id;
- char short_name;
- const char* long_name;
- const char* metavar;
- HasArgument has_argument;
- const char* help;
-};
+ struct Option;
+ typedef std::function<void(const char*)> Callback;
+ typedef std::function<void()> NullCallback;
-struct OptionParser {
- const char* description;
- Option* options;
- int num_options;
- OptionCallback on_option;
- ArgumentCallback on_argument;
- OptionErrorCallback on_error;
- void* user_data;
-
- /* cached after call to parse_options */
- char* argv0;
-};
+ struct Option {
+ Option(char short_name,
+ const std::string& long_name,
+ const std::string& metavar,
+ HasArgument has_argument,
+ const std::string& help,
+ const Callback&);
+
+ char short_name;
+ std::string long_name;
+ std::string metavar;
+ bool has_argument;
+ std::string help;
+ Callback callback;
+ };
+
+ struct Argument {
+ Argument(const std::string& name, ArgumentCount, const Callback&);
+
+ std::string name;
+ ArgumentCount count;
+ Callback callback;
+ int handled_count = 0;
+ };
-void parse_options(OptionParser* parser, int argc, char** argv);
-void print_help(OptionParser* parser, const char* program_name);
+ explicit OptionParser(const char* program_name, const char* description);
+
+ void AddOption(const Option&);
+ void AddArgument(const std::string& name, ArgumentCount, const Callback&);
+ void SetErrorCallback(const Callback&);
+ void Parse(int argc, char* argv[]);
+ void PrintHelp();
+
+ // Helper functions.
+ void AddOption(char short_name,
+ const char* long_name,
+ const char* help,
+ const NullCallback&);
+ void AddOption(const char* long_name, const char* help, const NullCallback&);
+ void AddOption(char short_name,
+ const char* long_name,
+ const char* metavar,
+ const char* help,
+ const Callback&);
+ void AddHelpOption();
+
+ private:
+ static int Match(const char* s, const std::string& full, bool has_argument);
+ void WABT_PRINTF_FORMAT(2, 3) Errorf(const char* format, ...);
+ void HandleArgument(size_t* arg_index, const char* arg_value);
+
+ // Print the error and exit(1).
+ void DefaultError(const std::string&);
+
+ std::string program_name_;
+ std::string description_;
+ std::vector<Option> options_;
+ std::vector<Argument> arguments_;
+ Callback on_error_;
+};
} // namespace wabt