Add automatic completion generation subcommand.
Adds a built-in "completion" subcommand that generates shell completion scripts. This should be called after creating the parser but before parsing arguments.
#ifndef FLAGS_H
#define FLAGS_H
#include <errno.h>
#include <inttypes.h>
#include <limits.h>
#include <stdarg.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef enum {
FLAG_OK = 0,
FLAG_ERROR_ALLOCATION,
FLAG_ERROR_UNKNOWN_FLAG,
FLAG_ERROR_MISSING_VALUE,
FLAG_ERROR_INVALID_NUMBER,
FLAG_ERROR_VALIDATION,
FLAG_ERROR_REQUIRED_MISSING,
FLAG_ERROR_UNKNOWN_SUBCOMMAND,
FLAG_ERROR_INVALID_ARGUMENT
typedef enum {
TYPE_BOOL,
TYPE_CHAR,
TYPE_STRING,
TYPE_INT8,
TYPE_UINT8,
TYPE_INT16,
TYPE_UINT16,
TYPE_INT32,
TYPE_UINT32,
TYPE_INT64,
TYPE_UINT64,
TYPE_SIZE_T,
TYPE_FLOAT,
TYPE_DOUBLE
typedef struct Flag Flag;
typedef struct FlagParser FlagParser;
typedef bool (*
FlagValidator)(
const void* value,
const char** error_out);
void flag_add_completion_cmd(FlagParser* fp);
Flag*
flag_add(FlagParser* parser,
FlagDataType type,
const char* name,
char short_name,
const char* desc,
void* value_ptr, bool required);
#define flag_bool(parser, name, short_name, desc, value) \
flag_add(parser, TYPE_BOOL, name, short_name, desc, value, false)
#define flag_char(parser, name, short_name, desc, value) \
flag_add(parser, TYPE_CHAR, name, short_name, desc, value, false)
#define flag_string(parser, name, short_name, desc, value) \
flag_add(parser, TYPE_STRING, name, short_name, desc, value, false)
#define flag_int(parser, name, short_name, desc, value) \
flag_add(parser, TYPE_INT32, name, short_name, desc, value, false)
#define flag_int8(parser, name, short_name, desc, value) \
flag_add(parser, TYPE_INT8, name, short_name, desc, value, false)
#define flag_int16(parser, name, short_name, desc, value) \
flag_add(parser, TYPE_INT16, name, short_name, desc, value, false)
#define flag_int32(parser, name, short_name, desc, value) \
flag_add(parser, TYPE_INT32, name, short_name, desc, value, false)
#define flag_int64(parser, name, short_name, desc, value) \
flag_add(parser, TYPE_INT64, name, short_name, desc, value, false)
#define flag_uint8(parser, name, short_name, desc, value) \
flag_add(parser, TYPE_UINT8, name, short_name, desc, value, false)
#define flag_uint16(parser, name, short_name, desc, value) \
flag_add(parser, TYPE_UINT16, name, short_name, desc, value, false)
#define flag_uint32(parser, name, short_name, desc, value) \
flag_add(parser, TYPE_UINT32, name, short_name, desc, value, false)
#define flag_uint64(parser, name, short_name, desc, value) \
flag_add(parser, TYPE_UINT64, name, short_name, desc, value, false)
#define flag_size_t(parser, name, short_name, desc, value) \
flag_add(parser, TYPE_SIZE_T, name, short_name, desc, value, false)
#define flag_float(parser, name, short_name, desc, value) \
flag_add(parser, TYPE_FLOAT, name, short_name, desc, value, false)
#define flag_double(parser, name, short_name, desc, value) \
flag_add(parser, TYPE_DOUBLE, name, short_name, desc, value, false)
#define flag_req_bool(parser, name, short_name, desc, value) \
flag_add(parser, TYPE_BOOL, name, short_name, desc, value, true)
#define flag_req_char(parser, name, short_name, desc, value) \
flag_add(parser, TYPE_CHAR, name, short_name, desc, value, true)
#define flag_req_string(parser, name, short_name, desc, value) \
flag_add(parser, TYPE_STRING, name, short_name, desc, value, true)
#define flag_req_int(parser, name, short_name, desc, value) \
flag_add(parser, TYPE_INT32, name, short_name, desc, value, true)
#define flag_req_uint(parser, name, short_name, desc, value) \
flag_add(parser, TYPE_UINT32, name, short_name, desc, value, true)
#define flag_req_int8(parser, name, short_name, desc, value) \
flag_add(parser, TYPE_INT8, name, short_name, desc, value, true)
#define flag_req_uint8(parser, name, short_name, desc, value) \
flag_add(parser, TYPE_UINT8, name, short_name, desc, value, true)
#define flag_req_int16(parser, name, short_name, desc, value) \
flag_add(parser, TYPE_INT16, name, short_name, desc, value, true)
#define flag_req_uint16(parser, name, short_name, desc, value) \
flag_add(parser, TYPE_UINT16, name, short_name, desc, value, true)
#define flag_req_int32(parser, name, short_name, desc, value) \
flag_add(parser, TYPE_INT32, name, short_name, desc, value, true)
#define flag_req_uint32(parser, name, short_name, desc, value) \
flag_add(parser, TYPE_UINT32, name, short_name, desc, value, true)
#define flag_req_int64(parser, name, short_name, desc, value) \
flag_add(parser, TYPE_INT64, name, short_name, desc, value, true)
#define flag_req_uint64(parser, name, short_name, desc, value) \
flag_add(parser, TYPE_UINT64, name, short_name, desc, value, true)
#define flag_req_size_t(parser, name, short_name, desc, value) \
flag_add(parser, TYPE_SIZE_T, name, short_name, desc, value, true)
#define flag_req_float(parser, name, short_name, desc, value) \
flag_add(parser, TYPE_FLOAT, name, short_name, desc, value, true)
#define flag_req_double(parser, name, short_name, desc, value) \
flag_add(parser, TYPE_DOUBLE, name, short_name, desc, value, true)
FlagParser*
flag_add_subcommand(FlagParser* parser,
const char* name,
const char* desc,
void (*handler)(
void* data));
#ifdef __cplusplus
}
#endif
#endif
High-performance C string with Small String Optimization (SSO).
bool flag_invoke_subcommand(FlagParser *parser, void(*pre_invoke)(void *user_data), void *user_data)
void flag_parser_set_footer(FlagParser *parser, const char *footer)
void flag_parser_free(FlagParser *parser)
Flag * flag_add(FlagParser *parser, FlagDataType type, const char *name, char short_name, const char *desc, void *value_ptr, bool required)
bool flag_is_present(FlagParser *parser, const char *flag_name)
FlagParser * flag_add_subcommand(FlagParser *parser, const char *name, const char *desc, void(*handler)(void *data))
const char * flag_positional_at(FlagParser *parser, int index)
FlagStatus flag_parse_and_invoke(FlagParser *parser, int argc, char **argv, void *user_data)
const char * flag_status_str(FlagStatus status)
const char * flag_get_error(FlagParser *parser)
FlagParser * flag_active_subcommand(FlagParser *parser)
bool(* FlagValidator)(const void *value, const char **error_out)
void flag_set_validator(Flag *flag, FlagValidator validator)
int flag_positional_count(FlagParser *parser)
void flag_print_usage(FlagParser *parser)
void flag_set_pre_invoke(FlagParser *parser, void(*pre_invoke)(void *user_data))