Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/607011/getopt-cpp
A sleek and slender C++'ish alternative to getopt and getopt_long
https://github.com/607011/getopt-cpp
command-line cplusplus cplusplus-11 getopt getopt-long parsing
Last synced: 26 days ago
JSON representation
A sleek and slender C++'ish alternative to getopt and getopt_long
- Host: GitHub
- URL: https://github.com/607011/getopt-cpp
- Owner: 607011
- License: mit
- Created: 2023-05-02T14:06:50.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2024-06-21T07:52:09.000Z (5 months ago)
- Last Synced: 2024-09-30T00:01:42.137Z (about 1 month ago)
- Topics: command-line, cplusplus, cplusplus-11, getopt, getopt-long, parsing
- Language: C++
- Homepage:
- Size: 24.4 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# getopt++
**A sleek and slender C++'ish alternative to getopt and getopt_long**
This library is header-only. Just `#include` [getopt.hpp](https://github.com/607011/getopt-cpp/blob/main/include/getopt.hpp) and you're done.
The `reg()` method registers a handler for a list of command-line switches. If `argparser` finds one of the switches, it calls the handler with the argument, if the switch requires an argument (`argparser::required_argument`), otherwise it calls the handler with an empty string.
If `argparser` finds command-line parameters without a switch, these can be queried as so-called positional arguments. Handlers for positionals are registered with the `pos()` method.
Using `info()` and `help()` you can improve the help output.
## Example
```cpp
#include
#include// this is the getopt++ specific include directive
#includeint main(int argc, char *argv[])
{
// variables modified by command-line switches
unsigned long num_threads = 1;
int verbosity = 0;
std::string input_file;
std::string output_file;// definition of command-line switches
using argparser = argparser::argparser;
argparser opt(argc, argv);
opt
.info("getopt++ demo", argv[0])
// register command-line switches that execute
// the built-in help display
.help({"-?", "--help"}, "Display this help")
// register command-line switches that modify
// a variable according to the argument given
.reg({"-t", "--threads"},
"NUM_THREADS", // will be used in help to illustrate the argument
argparser::required_argument,
"Set number of threads", // will be displayed in help
[&num_threads](std::string const &arg)
{
num_threads = std::stoul(arg);
})
// register command-line switch that doesn't
// expect an argument, i.e. to increase the
// level of verbosity
.reg({"-v"},
argparser::no_argument,
"Increase verbosity of output",
[&verbosity](std::string const &)
{
++verbosity;
})
// register positional arguments
.pos("INPUT_FILE", // will be used in help to illustrate the argument
"Set file to read", // will be displayed in help
[&input_file](std::string const &arg)
{ input_file = arg; })
.pos("OUTPUT_FILE", // will be used in help to illustrate the argument
"Set file to write", // will be displayed in help
[&output_file](std::string const &arg)
{ output_file = arg; });
try
{
// parse command-line and execute handlers accordingly
opt();
}
// user requested help, help was shown,
// everything's fine, so exit smoothly
catch (::argparser::help_requested_exception const &)
{
return EXIT_SUCCESS;
}
// handle cases where a required argument was not given
catch (::argparser::argument_required_exception const &e)
{
std::cerr << "\u001b[31;1mERROR: " << e.what() << "\u001b[0m\n";
return EXIT_FAILURE;
}
// handle cases where an unknown switch was given
catch (::argparser::unknown_option_exception const &e)
{
std::cerr << "\u001b[31;1mERROR: " << e.what() << "\u001b[0m\n";
opt.display_help();
return EXIT_FAILURE;
}
// handle all other exceptions
catch (std::exception const &e)
{
std::cerr << "\u001b[31;1mERROR: " << e.what() << "\u001b[0m\n";
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
```## More examples
- [txtz](https://github.com/607011/txtz/blob/main/src/mapbuilder.cpp)
- [sudoku++](https://github.com/607011/sudokuplusplus/blob/main/src/main.cpp)
- [hibpdl++](https://github.com/607011/hibpdl/blob/main/src/main.cpp)
- [dirb++](https://github.com/607011/dirbplusplus/blob/main/src/main.cpp)