123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- #ifndef ARGPARSE_H
- #define ARGPARSE_H
- /**
- * Command-line arguments parsing library.
- *
- * 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.
- *
- * Reserved namespaces:
- * argparse
- * OPT
- * Author: Yecheng Fu <cofyc.jackson@gmail.com>
- */
- #include <assert.h>
- #include <math.h>
- #include <stdint.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #ifdef __cplusplus
- extern "C" {
- #endif
- struct argparse;
- struct argparse_option;
- typedef int argparse_callback(struct argparse *this_,
- const struct argparse_option *option);
- enum argparse_flag {
- ARGPARSE_STOP_AT_NON_OPTION = 1,
- };
- enum argparse_option_type {
- /* special */
- ARGPARSE_OPT_END,
- /* options with no arguments */
- ARGPARSE_OPT_BOOLEAN,
- ARGPARSE_OPT_BIT,
- /* options with arguments (optional or required) */
- ARGPARSE_OPT_INTEGER,
- ARGPARSE_OPT_STRING,
- };
- enum argparse_option_flags {
- OPT_NONEG = 1, /* Negation disabled. */
- };
- /*
- * Argparse option struct.
- *
- * `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 *usage;
- int flags;
- // internal context
- int argc;
- const char **argv;
- const char **out;
- int cpidx;
- const char *optvalue; // current option value
- };
- // builtin callbacks
- int argparse_help_cb(struct argparse *this_,
- const struct argparse_option *option);
- // builtin option macros
- #define OPT_END() { ARGPARSE_OPT_END, 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_STRING(...) { ARGPARSE_OPT_STRING, __VA_ARGS__ }
- #define OPT_HELP() OPT_BOOLEAN('h', "help", 0, "Show this help message and exit", argparse_help_cb)
- int argparse_init(struct argparse *this_, struct argparse_option *options,
- const char *usage, int flags);
- int argparse_parse(struct argparse *this_, int argc, const char **argv);
- void argparse_usage(struct argparse *this_);
- #ifdef __cplusplus
- }
- #endif
- #endif
|