summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/program_options/example/regex.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/program_options/example/regex.cpp')
-rw-r--r--src/boost/libs/program_options/example/regex.cpp101
1 files changed, 101 insertions, 0 deletions
diff --git a/src/boost/libs/program_options/example/regex.cpp b/src/boost/libs/program_options/example/regex.cpp
new file mode 100644
index 00000000..df98f77a
--- /dev/null
+++ b/src/boost/libs/program_options/example/regex.cpp
@@ -0,0 +1,101 @@
+// Copyright Vladimir Prus 2002-2004.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+// This example shows how a user-defined class can be parsed using
+// specific mechanism -- not the iostream operations used by default.
+//
+// A new class 'magic_number' is defined and the 'validate' method is overloaded
+// to validate the values of that class using Boost.Regex.
+// To test, run
+//
+// regex -m 123-456
+// regex -m 123-4567
+//
+// The first invocation should output:
+//
+// The magic is "456"
+//
+// and the second invocation should issue an error message.
+
+#include <boost/program_options.hpp>
+#include <boost/regex.hpp>
+
+using namespace boost;
+using namespace boost::program_options;
+
+#include <iostream>
+using namespace std;
+
+/* Define a completely non-sensical class. */
+struct magic_number {
+public:
+ magic_number(int n) : n(n) {}
+ int n;
+};
+
+/* Overload the 'validate' function for the user-defined class.
+ It makes sure that value is of form XXX-XXX
+ where X are digits and converts the second group to an integer.
+ This has no practical meaning, meant only to show how
+ regex can be used to validate values.
+*/
+void validate(boost::any& v,
+ const std::vector<std::string>& values,
+ magic_number*, int)
+{
+ static regex r("\\d\\d\\d-(\\d\\d\\d)");
+
+ using namespace boost::program_options;
+
+ // Make sure no previous assignment to 'a' was made.
+ validators::check_first_occurrence(v);
+ // Extract the first string from 'values'. If there is more than
+ // one string, it's an error, and exception will be thrown.
+ const string& s = validators::get_single_string(values);
+
+ // Do regex match and convert the interesting part to
+ // int.
+ smatch match;
+ if (regex_match(s, match, r)) {
+ v = any(magic_number(lexical_cast<int>(match[1])));
+ } else {
+ throw validation_error(validation_error::invalid_option_value);
+ }
+}
+
+
+int main(int ac, char* av[])
+{
+ try {
+ options_description desc("Allowed options");
+ desc.add_options()
+ ("help", "produce a help screen")
+ ("version,v", "print the version number")
+ ("magic,m", value<magic_number>(),
+ "magic value (in NNN-NNN format)")
+ ;
+
+ variables_map vm;
+ store(parse_command_line(ac, av, desc), vm);
+
+ if (vm.count("help")) {
+ cout << "Usage: regex [options]\n";
+ cout << desc;
+ return 0;
+ }
+ if (vm.count("version")) {
+ cout << "Version 1.\n";
+ return 0;
+ }
+ if (vm.count("magic")) {
+ cout << "The magic is \""
+ << vm["magic"].as<magic_number>().n << "\"\n";
+ }
+ }
+ catch(std::exception& e)
+ {
+ cout << e.what() << "\n";
+ }
+}