A header only c++ library for parsing command line arguments and generating usage/help output; Brett Robinson (2018).
npm install parg.cxxsh
$ npm i parg.cxx
`
And then include parg.hh as follows:
`cxx
// main.cxx
#include
int main() { / ... / }
`
Finally, compile while adding the path node_modules/parg.cxx to your compiler's include paths.
`bash
$ clang++ -std=c++17 -I./node_modules/parg.cxx main.cxx # or, use g++
$ g++ -std=c++17 -I./node_modules/parg.cxx main.cxx
`
You may also use a simpler approach with the cpoach tool, which automatically adds the necessary include paths of all the installed dependencies for your project.
`bash
$ cpoach clang++ -std=c++17 main.cxx # or, use g++
$ cpoach g++ -std=c++17 main.cxx
`
Usage
Let's write a program that will accept the flags for help and version info, a string option called file, and an integer option called num.
`cpp
#include
#include
#include
int main(int argc, char *argv[])
{
// create the parg object
OB::Parg pg {argc, argv};
// set the program name and version
pg.name("app").version("0.1.0 (00.00.0000)");
// set a brief description of the program
pg.description("an example of parg");
// set the usage info
pg.usage("[-v|-h]");
// set the author
pg.author("octobanana");
// add help and version flags
// default value for flags is false
// flags and options can have either a long and short name, a long name, or a short name.
// pg.set(, );
// pg.set(, ); where long is more than one char
// pg.set(, ); where short is one char
pg.set("help,h", "print the help output");
pg.set("version,v", "print the program version");
// add file option
// pg.set(, , , );
pg.set("file,f", "config.cfg", "string", "the file to read from");
// add num option
pg.set("num,n", "8", "int", "an integer value");
// parse the arguments
// if status > 0, no arguments were found
// if status = 0, parsing was successful
// if status < 0, an error occurred while parsing
int status {pg.parse()};
if (status < 0)
{
// handle parsing error
std::cout << pg.help() << "\n";
std::cout << "Error: " << pg.error() << "\n";
return 1;
}
// flags and options are accessed with their long name
// or short if they don't have a long name
if (pg.get("help"))
{
// handle -h and --help
std::cout << pg.help();
return 0;
}
if (pg.get("version"))
{
// handle -v and --version
std::cout << pg.name() << " v" << pg.version() << "\n";
return 0;
}
// check to see if the file option was found
// if it wasn't found, the default parameter given will be returned with pg.get("file");
if (pg.find("file"))
{
std::string file {pg.get("file")};
std::cout << "file: " << file << "\n";
}
else
{
std::cout << "using default file: " << pg.get("file") << "\n";
}
// print out the num value
int num {pg.get("num")};
std::cout << "num: " << num << "\n";
return 0;
}
`
Running it with the -h flag will output:
`bash
app -h
app:
an example of parg
Usage:
app [-v|-h]
Flags:
-h, --help
print the help output
-v, --version
print the program version
Options:
-f, --file=
the file to read from
-n, --num=
an integer value
Author:
octobanana
`
Examples
See the __examples__ directory.
Compile and run each example with:
`bash
mkdir -p build
cd build
cmake -DCMAKE_BUILD_TYPE=Debug ../
make
./app
``