diff options
author | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2019-01-22 05:03:54 +0200 |
---|---|---|
committer | Niklas Söderlund <niklas.soderlund@ragnatech.se> | 2019-01-22 14:04:09 +0100 |
commit | f5e48ebf447ec15ba653fa3524e9b9de8e5eb736 (patch) | |
tree | 8b0b926612198fffa218e77a6d557f539aafc44f /src/cam/options.h | |
parent | fba3d0460750fb4123d66f55315dbd9b34cc3d90 (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.h | 62 |
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__ */ |