aboutsummaryrefslogtreecommitdiffstats
path: root/src/cli/getopt.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/cli/getopt.cpp')
-rw-r--r--src/cli/getopt.cpp53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/cli/getopt.cpp b/src/cli/getopt.cpp
new file mode 100644
index 000000000..7b7e14932
--- /dev/null
+++ b/src/cli/getopt.cpp
@@ -0,0 +1,53 @@
+/*
+* (C) 2009 Jack Lloyd
+*
+* Botan is released under the Simplified BSD License (see license.txt)
+*/
+
+#include "getopt.h"
+#include <iostream>
+
+void OptionParser::parse(const std::vector<std::string> &args)
+ {
+ const std::string appname = args[0];
+
+ // ship first, args[0] is the app name
+ for(size_t j = 1; j != args.size(); j++)
+ {
+ std::string arg = args[j];
+
+ if(arg == "help" || arg == "--help" || arg == "-h")
+ return help(std::cout, appname);
+
+ if(arg.size() > 2 && arg[0] == '-' && arg[1] == '-')
+ {
+ const std::string opt_name = arg.substr(0, arg.find('='));
+
+ arg = arg.substr(2);
+
+ std::string::size_type mark = arg.find('=');
+ OptionFlag opt = find_option(arg.substr(0, mark));
+
+ if(opt.takes_arg())
+ {
+ if(mark == std::string::npos)
+ throw std::runtime_error("Option " + opt_name +
+ " requires an argument");
+
+ std::string name = arg.substr(0, mark);
+ std::string value = arg.substr(mark+1);
+
+ options[name] = value;
+ }
+ else
+ {
+ if(mark != std::string::npos)
+ throw std::runtime_error("Option " + opt_name + " does not take an argument");
+
+ options[arg] = "";
+ }
+ }
+ else
+ leftover.push_back(arg);
+ }
+ }