123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367 |
- #ifndef CCAN_OPT_H
- #define CCAN_OPT_H
- #include <ccan/compiler/compiler.h>
- #include <ccan/typesafe_cb/typesafe_cb.h>
- #include <stdbool.h>
- #include <stdlib.h>
- struct opt_table;
- #define OPT_WITHOUT_ARG(names, cb, arg, desc) \
- { (names), OPT_CB_NOARG((cb), (arg)), { (arg) }, (desc) }
- #define OPT_WITH_ARG(name, cb, show, arg, desc) \
- { (name), OPT_CB_ARG((cb), (show), (arg)), { (arg) }, (desc) }
- #define OPT_WITH_CBARG(name, cb, show, arg, desc) \
- { (name), OPT_CB_WITHARG((cb), (show), (arg)), { (arg) }, (desc) }
- #define OPT_SUBTABLE(table, desc) \
- { (const char *)(table), OPT_SUBTABLE, \
- sizeof(_check_is_entry(table)) ? NULL : NULL, NULL, NULL, \
- { NULL }, (desc) }
- #define OPT_ENDTABLE { NULL, OPT_END, NULL, NULL, NULL, { NULL }, NULL }
- void opt_register_table(const struct opt_table *table, const char *desc);
- #define opt_register_noarg(names, cb, arg, desc) \
- _opt_register((names), OPT_CB_NOARG((cb), (arg)), (arg), (desc))
- #define opt_register_arg(names, cb, show, arg, desc) \
- _opt_register((names), OPT_CB_ARG((cb), (show), (arg)), (arg), (desc))
- bool opt_parse(int *argc, char *argv[], void (*errlog)(const char *fmt, ...));
- void opt_free_table(void);
- void opt_log_stderr(const char *fmt, ...);
- void opt_log_stderr_exit(const char *fmt, ...);
- char *opt_invalid_argument(const char *arg);
- char *opt_usage(const char *argv0, const char *extra);
- extern const char opt_hidden[];
- #define OPT_SHOW_LEN 80
- char *opt_set_bool(bool *b);
- char *opt_set_false(bool *b);
- char *opt_set_bool_arg(const char *arg, bool *b);
- void opt_show_bool(char buf[OPT_SHOW_LEN], const bool *b);
- char *opt_set_invbool(bool *b);
- void opt_show_invbool(char buf[OPT_SHOW_LEN], const bool *b);
- char *opt_set_invbool_arg(const char *arg, bool *b);
- char *opt_set_charp(const char *arg, char **p);
- void opt_show_charp(char buf[OPT_SHOW_LEN], char *const *p);
- char *opt_set_intval(const char *arg, int *i);
- void opt_show_intval(char buf[OPT_SHOW_LEN], const int *i);
- char *opt_set_floatval(const char *arg, float *f);
- void opt_show_floatval(char buf[OPT_SHOW_LEN], const float *f);
- char *opt_set_uintval(const char *arg, unsigned int *ui);
- void opt_show_uintval(char buf[OPT_SHOW_LEN], const unsigned int *ui);
- char *opt_set_longval(const char *arg, long *l);
- void opt_show_longval(char buf[OPT_SHOW_LEN], const long *l);
- char *opt_set_ulongval(const char *arg, unsigned long *ul);
- void opt_show_ulongval(char buf[OPT_SHOW_LEN], const unsigned long *ul);
- char *opt_inc_intval(int *i);
- char *opt_version_and_exit(const char *version);
- char *opt_usage_and_exit(const char *extra);
- enum opt_type {
- OPT_NOARG = 1,
- OPT_HASARG = 2,
- OPT_PROCESSARG = 4,
- OPT_SUBTABLE = 8,
- OPT_END = 16,
- };
- struct opt_table {
- const char *names;
- enum opt_type type;
- char *(*cb)(void *arg);
- char *(*cb_arg)(const char *optarg, void *arg);
- void (*show)(char buf[OPT_SHOW_LEN], const void *arg);
- union {
- const void *carg;
- void *arg;
- size_t tlen;
- } u;
- const char *desc;
- };
- #define OPT_CB_NOARG(cb, arg) \
- OPT_NOARG, \
- typesafe_cb_cast3(char *(*)(void *), \
- char *(*)(typeof(*(arg))*), \
- char *(*)(const typeof(*(arg))*), \
- char *(*)(const void *), (cb)), \
- NULL, NULL
- #define OPT_CB_ARG(cb, show, arg) \
- OPT_HASARG, NULL, \
- typesafe_cb_cast3(char *(*)(const char *,void *), \
- char *(*)(const char *, typeof(*(arg))*), \
- char *(*)(const char *, const typeof(*(arg))*), \
- char *(*)(const char *, const void *), \
- (cb)), \
- typesafe_cb_cast(void (*)(char buf[], const void *), \
- void (*)(char buf[], const typeof(*(arg))*), (show))
- #define OPT_CB_WITHARG(cb, show, arg) \
- OPT_PROCESSARG, NULL, \
- typesafe_cb_cast3(char *(*)(const char *,void *), \
- char *(*)(const char *, typeof(*(arg))*), \
- char *(*)(const char *, const typeof(*(arg))*), \
- char *(*)(const char *, const void *), \
- (cb)), \
- typesafe_cb_cast(void (*)(char buf[], const void *), \
- void (*)(char buf[], const typeof(*(arg))*), (show))
- void _opt_register(const char *names, enum opt_type type,
- char *(*cb)(void *arg),
- char *(*cb_arg)(const char *optarg, void *arg),
- void (*show)(char buf[OPT_SHOW_LEN], const void *arg),
- const void *arg, const char *desc);
- static inline int _check_is_entry(struct opt_table *e UNUSED) { return 0; }
- #endif
|