summaryrefslogtreecommitdiff
path: root/src/cam/options.h
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2019-01-22 05:03:54 +0200
committerNiklas Söderlund <niklas.soderlund@ragnatech.se>2019-01-22 14:04:09 +0100
commitf5e48ebf447ec15ba653fa3524e9b9de8e5eb736 (patch)
tree8b0b926612198fffa218e77a6d557f539aafc44f /src/cam/options.h
parentfba3d0460750fb4123d66f55315dbd9b34cc3d90 (diff)
cam: Extract option parser to separate file
And turn it into an OptionsParser object. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Diffstat (limited to 'src/cam/options.h')
-rw-r--r--src/cam/options.h62
1 files changed, 62 insertions, 0 deletions
diff --git a/src/cam/options.h b/src/cam/options.h
new file mode 100644
index 00000000..88336dfe
--- /dev/null
+++ b/src/cam/options.h
@@ -0,0 +1,62 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (C) 2019, Google Inc.
+ *
+ * options.h - cam - Options parsing
+ */
+#ifndef __CAM_OPTIONS_H__
+#define __CAM_OPTIONS_H__
+
+#include <ctype.h>
+#include <map>
+#include <vector>
+
+class OptionsParser
+{
+public:
+ enum OptionArgument {
+ ArgumentNone,
+ ArgumentRequired,
+ ArgumentOptional,
+ };
+
+ class Options {
+ public:
+ Options();
+ Options(Options &&other);
+ Options &operator=(Options &&other);
+
+ bool valid() const;
+ bool isSet(int opt) const;
+ const std::string &operator[](int opt) const;
+
+ private:
+ friend class OptionsParser;
+ std::map<int, std::string> values_;
+ void clear();
+ };
+
+ void addOption(int opt, const char *help, const char *name = nullptr,
+ OptionArgument argument = ArgumentNone,
+ const char *argumentName = nullptr);
+
+ Options parse(int argc, char *argv[]);
+ void usage();
+
+private:
+ struct Option {
+ int opt;
+ const char *name;
+ OptionArgument argument;
+ const char *argumentName;
+ const char *help;
+
+ bool hasShortOption() const { return isalnum(opt); }
+ bool hasLongOption() const { return name != nullptr; }
+ };
+
+ std::vector<Option> options_;
+ std::map<unsigned int, Option *> optionsMap_;
+};
+
+#endif /* __CAM_OPTIONS_H__ */