diff options
author | Karl Berry <karl@freefriends.org> | 2017-01-31 18:37:40 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2017-01-31 18:37:40 +0000 |
commit | 4c245316c293169ee655c8e2f922b4bee454f9bc (patch) | |
tree | 2d3b72165f3e7e1298df8dad8b52f119a42228dc /Build/source/texk/dvisvgm/dvisvgm-src/src/CLOption.hpp | |
parent | 54a2f67f996dceca3c89276dea798f746b3cacaf (diff) |
import original dvisvgm-2.1
git-svn-id: svn://tug.org/texlive/trunk@43102 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/dvisvgm/dvisvgm-src/src/CLOption.hpp')
-rw-r--r-- | Build/source/texk/dvisvgm/dvisvgm-src/src/CLOption.hpp | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/CLOption.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/CLOption.hpp new file mode 100644 index 00000000000..3e1efe84043 --- /dev/null +++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/CLOption.hpp @@ -0,0 +1,198 @@ +/************************************************************************* +** CLOption.hpp ** +** ** +** This file is part of dvisvgm -- a fast DVI to SVG converter ** +** Copyright (C) 2005-2017 Martin Gieseking <martin.gieseking@uos.de> ** +** ** +** This program is free software; you can redistribute it and/or ** +** modify it under the terms of the GNU General Public License as ** +** published by the Free Software Foundation; either version 3 of ** +** the License, or (at your option) any later version. ** +** ** +** This program is distributed in the hope that it will be useful, but ** +** WITHOUT ANY WARRANTY; without even the implied warranty of ** +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** +** GNU General Public License for more details. ** +** ** +** You should have received a copy of the GNU General Public License ** +** along with this program; if not, see <http://www.gnu.org/licenses/>. ** +*************************************************************************/ + +#ifndef CL_OPTION_HPP +#define CL_OPTION_HPP + +#include <iomanip> +#include <sstream> +#include <string> + +namespace CL { + +class Option +{ + friend class CommandLine; + public: + enum class ArgMode {NONE, OPTIONAL, REQUIRED}; + + public: + Option (const char *longname, char shortname, const char *summary) + : _shortName(shortname), _longName(longname), _summary(summary), _given(false) {} + + virtual ~Option () = default; + virtual std::string typeString () const {return "";} + virtual ArgMode argMode () const {return ArgMode::NONE;} + virtual bool given () const {return _given;} + virtual char shortName () const {return _shortName;} + virtual std::string longName () const {return _longName;} + virtual std::string summary () const {return _summary;} + virtual std::string argName () const {return "";} + virtual std::string valueString () const {return "";} + + virtual std::string helpline () const { + std::string line; + if (_shortName != '\0') + line = std::string("-") + _shortName + ", "; + else + line = " "; + line += "--" + std::string(_longName); + if (!argName().empty()) { + if (argMode() == ArgMode::OPTIONAL) + line += '['; + line += '='; + line += argName(); + if (argMode() == ArgMode::OPTIONAL) + line += ']'; + } + if (_summary) { + line += '\t'; + line += _summary; + } + if (argMode() != ArgMode::NONE && !valueString().empty()) + line += std::string(" [") + valueString() + "]"; + return line; + } + + protected: + virtual bool parse (std::istream &is, bool longopt) { + if (is.eof()) + return given(argMode() != ArgMode::REQUIRED); + if (argMode() == ArgMode::OPTIONAL && is.peek() == ' ') + return given(false); + if (longopt && is.get() != '=') + return given(false); + return given(parseValue(is)); + } + + virtual bool parseValue (std::istream &is) { + return is.peek() == EOF || argMode() == ArgMode::NONE; + } + + bool given (bool val) {return _given = val;} + + private: + char _shortName; + const char *_longName; + const char*_summary; + bool _given; +}; + + +template <typename T> +constexpr const char* typeString () {return "unknown";} + +template<> constexpr const char* typeString<bool> () {return "boolean";} +template<> constexpr const char* typeString<int> () {return "integer";} +template<> constexpr const char* typeString<unsigned> () {return "non-negative integer";} +template<> constexpr const char* typeString<double> () {return "floating point";} +template<> constexpr const char* typeString<std::string> () {return "string";} + +template <typename T> +inline T parseValue (std::istream &is) { + T value; + is >> value; + return value; +} + +template<> +inline std::string parseValue (std::istream &is) { + is >> std::ws; + std::string str; + std::getline(is, str); + return str; +} + + +template <typename T, Option::ArgMode mode> +class TypedOption : public Option +{ + public: + TypedOption (const char *longName, char shortName, const char *argName, T val, const char *summary) + : Option(longName, shortName, summary), _argName(argName), _value(val) {} + + TypedOption (const char *longName, char shortName, const char *argName, const char *summary) + : Option(longName, shortName, summary), _argName(argName), _value() {} + + T value () const {return _value;} + std::string typeString () const override {return CL::typeString<T>();} + std::string argName() const override {return _argName ? _argName : "";} + + std::string valueString () const override { + std::ostringstream oss; + oss << _value; + return oss.str(); + } + + ArgMode argMode () const override {return mode;} + + protected: + bool parseValue (std::istream &is) override { + T value = CL::parseValue<T>(is); + if (!is.fail()) + _value = std::move(value); + return !is.fail() || (argMode() == ArgMode::OPTIONAL && is.eof()); + } + + private: + const char *_argName; + T _value; +}; + + +template <Option::ArgMode mode> +class TypedOption<bool, mode> : public Option +{ + public: + TypedOption (const char *longName, char shortName, const char *argName, bool val, const char *summary) + : Option(longName, shortName, summary), _argName(argName), _value(val) {} + + TypedOption (const char *longName, char shortName, const char *argName, const char *summary) + : Option(longName, shortName, summary), _argName(argName), _value(false) {} + + bool value () const {return _value;} + std::string valueString () const override {return _value ? "yes" : "no";} + ArgMode argMode () const override {return mode;} + std::string typeString () const override {return CL::typeString<bool>();} + std::string argName() const override {return _argName ? _argName : "";} + + protected: + bool parseValue (std::istream &is) override { + std::string str; + is >> str; + if (is.fail()) + return argMode() != ArgMode::REQUIRED; + if (str == "yes" || str == "y" || str == "true" || str == "1") + _value = true; + else if (str == "no" || str == "n" || str == "false" || str == "0") + _value = false; + else + return false; + return true; + } + + private: + const char *_argName; + bool _value; +}; + +} // namespace CL + +#endif |