# argparse [![Build Status](https://travis-ci.org/cofyc/argparse.png)](https://travis-ci.org/cofyc/argparse) argparse - A command line arguments parsing library in C (compatible with C++). ## Description This module is inspired by parse-options.c (git) and python's argparse module. Arguments parsing is common task in cli program, but traditional `getopt` libraries are not easy to use. This library provides high-level arguments parsing solutions. The program defines what arguments it requires, and `argparse` will figure out how to parse those out of `argc` and `argv`, it also automatically generates help and usage messages and issues errors when users give the program invalid arguments. ## Features - handles both optional and positional arguments - produces highly informative usage messages - issues errors when given invalid arguments There are basically three types of options: - boolean options - options with mandatory argument - options with optional argument There are basically two forms of options: - short option consist of one dash (`-`) and one alphanumeric character. - long option begin with two dashes (`--`) and some alphanumeric characters. Short options may be bundled, e.g. `-a -b` can be specified as `-ab`. Options are case-sensitive. Options and non-option arguments can clearly be separated using the `--` option. ## Examples ```c #include "argparse.h" static const char *const usage[] = { "test_argparse [options] [[--] args]", "test_argparse [options]", NULL, }; #define PERM_READ (1<<0) #define PERM_WRITE (1<<1) #define PERM_EXEC (1<<2) int main(int argc, const char **argv) { int force = 0; int test = 0; int num = 0; const char *path = NULL; int perms = 0; struct argparse_option options[] = { OPT_HELP(), OPT_GROUP("Basic options"), OPT_BOOLEAN('f', "force", &force, "force to do"), OPT_BOOLEAN('t', "test", &test, "test only"), OPT_STRING('p', "path", &path, "path to read"), OPT_INTEGER('n', "num", &num, "selected num"), OPT_GROUP("Bits options"), OPT_BIT(0, "read", &perms, "read perm", NULL, PERM_READ, OPT_NONEG), OPT_BIT(0, "write", &perms, "write perm", NULL, PERM_WRITE), OPT_BIT(0, "exec", &perms, "exec perm", NULL, PERM_EXEC), OPT_END(), }; struct argparse argparse; argparse_init(&argparse, options, usage, 0); argparse_describe(&argparse, "\nA brief description of what the program does and how it works.", "\nAdditional description of the program after the description of the arguments."); argc = argparse_parse(&argparse, argc, argv); if (force != 0) printf("force: %d\n", force); if (test != 0) printf("test: %d\n", test); if (path != NULL) printf("path: %s\n", path); if (num != 0) printf("num: %d\n", num); if (argc != 0) { printf("argc: %d\n", argc); int i; for (i = 0; i < argc; i++) { printf("argv[%d]: %s\n", i, *(argv + i)); } } if (perms) { printf("perms: %d\n", perms); } return 0; } ```