[![Travis Build](https://img.shields.io/travis/com/likle/cargs/master?label=Linux%2C%20macOS%20%26%20FreeBSD)](https://app.travis-ci.com/github/likle/cargs) [![Appveyor Build](https://img.shields.io/appveyor/ci/likle/cargs/master.svg?label=Windows)](https://ci.appveyor.com/project/likle/cargs) [![codecov](https://img.shields.io/codecov/c/github/likle/cargs/master.svg?label=Coverage)](https://codecov.io/gh/likle/cargs) [![Language Grade: C/C++](https://img.shields.io/lgtm/grade/cpp/g/likle/cargs.svg?label=Code%20Quality)](https://lgtm.com/projects/g/likle/cargs/context:cpp) # libcargs - command line argument library for C/C++ This is a lighweight C command line argument library. It is currently compiled and tested under **Windows**, **MacOS** and **Linux**. ## Features Please have a look at the **[reference](https://likle.github.io/cargs/reference/)** for detailed information. Some features this library includes: * **cross-platform** on windows, linux and macOS * **simple interface** - just one header * **one simple loop** - to iterate over the arguments * **automatic help output** - showing all options available * **long and short options** - giving users alternatives * **option values** - for options which are more than just flags ## Building **[Building](https://likle.github.io/cargs/build.html)**, **[embedding](https://likle.github.io/cargs/embed.html)** and **[testing](https://likle.github.io/cargs/build.html)** instructions are available in the documentation (it's very easy). ## Docs All the documentation is available in the **[the github page](https://likle.github.io/cargs/)** of this repository. ## Example ```c #include #include #include /** * This is the main configuration of all options available. */ static struct cag_option options[] = { {.identifier = 's', .access_letters = "s", .access_name = NULL, .value_name = NULL, .description = "Simple flag"}, {.identifier = 'm', .access_letters = "mMoO", .access_name = NULL, .value_name = NULL, .description = "Multiple access letters"}, {.identifier = 'l', .access_letters = NULL, .access_name = "long", .value_name = NULL, .description = "Long parameter name"}, {.identifier = 'k', .access_letters = "k", .access_name = "key", .value_name = "VALUE", .description = "Parameter value"}, {.identifier = 'h', .access_letters = "h", .access_name = "help", .description = "Shows the command help"}}; /** * This is a custom project configuration structure where you can store the * parsed information. */ struct demo_configuration { bool simple_flag; bool multiple_flag; bool long_flag; const char *key; }; int main(int argc, char *argv[]) { char identifier; const char *value; cag_option_context context; struct demo_configuration config = {false, false, false, NULL}; /** * Now we just prepare the context and iterate over all options. Simple! */ cag_option_prepare(&context, options, CAG_ARRAY_SIZE(options), argc, argv); while (cag_option_fetch(&context)) { identifier = cag_option_get(&context); switch (identifier) { case 's': config.simple_flag = true; break; case 'm': config.multiple_flag = true; break; case 'l': config.long_flag = true; break; case 'k': value = cag_option_get_value(&context); config.key = value; break; case 'h': printf("Usage: cargsdemo [OPTION]...\n"); printf("Demonstrates the cargs library.\n\n"); cag_option_print(options, CAG_ARRAY_SIZE(options), stdout); printf("\nNote that all formatting is done by cargs.\n"); return EXIT_SUCCESS; } } printf("simple_flag: %i, multiple_flag: %i, long_flag: %i, key: %s\n", config.simple_flag, config.multiple_flag, config.long_flag, config.key ? config.key : "-"); return EXIT_SUCCESS; } ``` ### Example output ```console foo@bar:~$ ./cargsdemo simple_flag: 0, multiple_flag: 0, long_flag: 0, key: - ``` ```console foo@bar:~$ ./cargsdemo -k=test -sm --long simple_flag: 1, multiple_flag: 1, long_flag: 1, key: test ``` ```console foo@bar:~$ ./cargsdemo --help Usage: cargsdemo [OPTION]... Demonstrates the cargs library. -s Simple flag -m, -M, -o, -O Multiple access letters --long Long parameter name -k, --key=VALUE Parameter value -h, --help Shows the command help Note that all formatting is done by cargs. ```