You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
110 lines
3.5 KiB
110 lines
3.5 KiB
/*
|
|
* Copyright(C) 1999-2022 National Technology & Engineering Solutions
|
|
* of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with
|
|
* NTESS, the U.S. Government retains certain rights in this software.
|
|
*
|
|
* See packages/seacas/LICENSE for details
|
|
*/
|
|
/* S Manoharan. Advanced Computer Research Institute. Lyon. France */
|
|
#pragma once
|
|
|
|
#include <cstdlib>
|
|
#include <iostream>
|
|
|
|
/** \brief A database of program command line and environment variable options and methods for
|
|
* manipulating them.
|
|
*
|
|
* A collection of long command line option names for a program that uses the Ioss library.
|
|
*/
|
|
class GetLongOption
|
|
{
|
|
public:
|
|
enum OptType { NoValue, OptionalValue, MandatoryValue };
|
|
|
|
private:
|
|
struct Cell
|
|
{
|
|
const char *option{nullptr}; // option name
|
|
OptType type{NoValue}; // option type
|
|
const char *description{nullptr}; // a description of option
|
|
const char *value{nullptr}; // value of option (string)
|
|
const char *opt_value{
|
|
nullptr}; // If optional value and value not entered, assign opt_value to value
|
|
Cell *next{nullptr}; // pointer to the next cell
|
|
bool extra_line{false}; // True if `usage()` should output extra line at end of entry
|
|
|
|
Cell() = default;
|
|
};
|
|
|
|
private:
|
|
Cell *table{nullptr}; // option table
|
|
const char *ustring{nullptr}; // usage message
|
|
char *pname{nullptr}; // program basename
|
|
Cell *last{nullptr}; // last entry in option table
|
|
char optmarker; // option marker
|
|
bool options_parsed{false}; // parsed options, cannot enroll anymore options
|
|
|
|
private:
|
|
int setcell(Cell *c, char *valtoken, char *nexttoken, const char *name);
|
|
|
|
public:
|
|
explicit GetLongOption(char optmark = '-');
|
|
GetLongOption(const GetLongOption &) = delete;
|
|
GetLongOption &operator=(const GetLongOption &) = delete;
|
|
|
|
~GetLongOption();
|
|
|
|
static char *basename(char *pathname);
|
|
|
|
int parse(int argc, char *const *argv);
|
|
int parse(char *str, char *p);
|
|
|
|
bool enroll(const char *opt, OptType t, const char *desc, const char *val,
|
|
const char *optval = nullptr, bool extra_line = false);
|
|
const char *retrieve(const char *opt) const;
|
|
const char *program_name() const;
|
|
|
|
void usage(std::ostream &outfile = std::cout) const;
|
|
|
|
/** \brief Set the program usage string.
|
|
*
|
|
* The program usage string should define the command line
|
|
* syntax for program options and arguments and contain
|
|
* other helpful usage text.
|
|
* \param[in] str The usage string.
|
|
*/
|
|
void usage(const char *str) { ustring = str; }
|
|
|
|
template <class INT, typename std::enable_if<std::is_integral<INT>::value, INT>::type * = nullptr>
|
|
INT get_option_value(const char *option_txt, INT default_value)
|
|
{
|
|
INT value = default_value;
|
|
const char *temp = retrieve(option_txt);
|
|
if (temp != nullptr) {
|
|
value = std::strtol(temp, nullptr, 10);
|
|
}
|
|
return value;
|
|
}
|
|
|
|
template <class DBL,
|
|
typename std::enable_if<std::is_floating_point<DBL>::value, DBL>::type * = nullptr>
|
|
DBL get_option_value(const char *option_txt, DBL default_value)
|
|
{
|
|
DBL value = default_value;
|
|
const char *temp = retrieve(option_txt);
|
|
if (temp != nullptr) {
|
|
value = std::strtod(temp, nullptr);
|
|
}
|
|
return value;
|
|
}
|
|
|
|
std::string get_option_value(const char *option_txt, const std::string &default_value)
|
|
{
|
|
auto value = default_value;
|
|
const char *temp = retrieve(option_txt);
|
|
if (temp != nullptr) {
|
|
value = temp;
|
|
}
|
|
return value;
|
|
}
|
|
};
|
|
|