/** * Copyright (C) 2012-2015 Yecheng Fu * All rights reserved. * * Use of this source code is governed by a MIT-style license that can be found * in the LICENSE file. */ #ifndef ARGPARSE_H #define ARGPARSE_H /* For c++ compatibility */ #ifdef __cplusplus extern "C" { #endif #include #define ARGPARSE_HELP_DONE -1 #define ARGPARSE_ERROR -2 struct argparse; struct argparse_option; typedef int argparse_callback(struct argparse* self, const struct argparse_option* option); enum argparse_flag { ARGPARSE_STOP_AT_NON_OPTION = 1 << 0, ARGPARSE_IGNORE_UNKNOWN_ARGS = 1 << 1, }; enum argparse_option_type { /* special */ ARGPARSE_OPT_END, ARGPARSE_OPT_GROUP, /* options with no arguments */ ARGPARSE_OPT_BOOLEAN, ARGPARSE_OPT_BIT, /* options with arguments (optional or required) */ ARGPARSE_OPT_INTEGER, ARGPARSE_OPT_FLOAT, ARGPARSE_OPT_STRING, }; enum argparse_option_flags { OPT_NONEG = 1, /* disable negation */ }; /** * argparse option * * `type`: * holds the type of the option, you must have an ARGPARSE_OPT_END last in your * array. * * `short_name`: * the character to use as a short option name, '\0' if none. * * `long_name`: * the long option name, without the leading dash, NULL if none. * * `value`: * stores pointer to the value to be filled. * * `help`: * the short help message associated to what the option does. * Must never be NULL (except for ARGPARSE_OPT_END). * * `callback`: * function is called when corresponding argument is parsed. * * `data`: * associated data. Callbacks can use it like they want. * * `flags`: * option flags. */ struct argparse_option { enum argparse_option_type type; const char short_name; const char* long_name; void* value; const char* help; argparse_callback* callback; intptr_t data; int flags; }; /** * argpparse */ struct argparse { // user supplied const struct argparse_option* options; const char* const* usages; int flags; const char* description; // a description after usage const char* epilog; // a description at the end // internal context int argc; const char** argv; const char** out; int cpidx; const char* optvalue; // current option value }; // built-in callbacks int argparse_help_cb(struct argparse* self, const struct argparse_option* option); int argparse_help_cb_no_exit(struct argparse* self, const struct argparse_option* option); // built-in option macros #define OPT_END() \ { \ ARGPARSE_OPT_END, 0, NULL, NULL, 0, NULL, 0, 0 \ } #define OPT_BOOLEAN(...) \ { \ ARGPARSE_OPT_BOOLEAN, __VA_ARGS__ \ } #define OPT_BIT(...) \ { \ ARGPARSE_OPT_BIT, __VA_ARGS__ \ } #define OPT_INTEGER(...) \ { \ ARGPARSE_OPT_INTEGER, __VA_ARGS__ \ } #define OPT_FLOAT(...) \ { \ ARGPARSE_OPT_FLOAT, __VA_ARGS__ \ } #define OPT_STRING(...) \ { \ ARGPARSE_OPT_STRING, __VA_ARGS__ \ } #define OPT_GROUP(h) \ { \ ARGPARSE_OPT_GROUP, 0, NULL, NULL, h, NULL, 0, 0 \ } #define OPT_HELP(flag) OPT_BOOLEAN('h', "help", flag, \ "show this help message and exit", \ argparse_help_cb, 0, OPT_NONEG) int argparse_init(struct argparse* self, struct argparse_option* options, const char* const* usages, int flags); void argparse_describe(struct argparse* self, const char* description, const char* epilog); int argparse_parse(struct argparse* self, int argc, const char** argv); void argparse_usage(struct argparse* self); #ifdef __cplusplus } #endif #endif