From f5e48ebf447ec15ba653fa3524e9b9de8e5eb736 Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Tue, 22 Jan 2019 05:03:54 +0200 Subject: cam: Extract option parser to separate file MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit And turn it into an OptionsParser object. Signed-off-by: Laurent Pinchart Reviewed-by: Niklas Söderlund Signed-off-by: Niklas Söderlund --- src/cam/options.h | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 src/cam/options.h (limited to 'src/cam/options.h') 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 +#include +#include + +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 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