diff --git a/argparse/argparse.c b/argparse/argparse.c index 82bdc7d3d0d398f249e8234ce0965c548339feb3..2d75c4a3bb56a78ee38a61a2732cce055178579c 100644 --- a/argparse/argparse.c +++ b/argparse/argparse.c @@ -5,404 +5,374 @@ * Use of this source code is governed by a MIT-style license that can be found * in the LICENSE file. */ +#include "argparse.h" +#include <assert.h> +#include <errno.h> #include <stdio.h> #include <stdlib.h> #include <string.h> -#include <assert.h> -#include <errno.h> -#include "argparse.h" #define OPT_UNSET 1 -#define OPT_LONG (1 << 1) +#define OPT_LONG (1 << 1) -static const char * -prefix_skip(const char *str, const char *prefix) -{ - size_t len = strlen(prefix); - return strncmp(str, prefix, len) ? NULL : str + len; +static const char *prefix_skip(const char *str, const char *prefix) { + size_t len = strlen(prefix); + return strncmp(str, prefix, len) ? NULL : str + len; } -static int -prefix_cmp(const char *str, const char *prefix) -{ - for (;; str++, prefix++) - if (!*prefix) { - return 0; - } else if (*str != *prefix) { - return (unsigned char)*prefix - (unsigned char)*str; - } +static int prefix_cmp(const char *str, const char *prefix) { + for (;; str++, prefix++) + if (!*prefix) { + return 0; + } else if (*str != *prefix) { + return (unsigned char)*prefix - (unsigned char)*str; + } } -static void -argparse_error(struct argparse *self, const struct argparse_option *opt, - const char *reason, int flags) -{ - (void)self; - if (flags & OPT_LONG) { - fprintf(stderr, "error: option `--%s` %s\n", opt->long_name, reason); - } else { - fprintf(stderr, "error: option `-%c` %s\n", opt->short_name, reason); - } - exit(1); +static void argparse_error(struct argparse *self, + const struct argparse_option *opt, + const char *reason, int flags) { + (void)self; + if (flags & OPT_LONG) { + fprintf(stderr, "error: option `--%s` %s\n", opt->long_name, reason); + } else { + fprintf(stderr, "error: option `-%c` %s\n", opt->short_name, reason); + } + exit(1); } -static int -argparse_getvalue(struct argparse *self, const struct argparse_option *opt, - int flags) -{ - const char *s = NULL; - if (!opt->value) - goto skipped; - switch (opt->type) { +static int argparse_getvalue(struct argparse *self, + const struct argparse_option *opt, int flags) { + const char *s = NULL; + if (!opt->value) goto skipped; + switch (opt->type) { case ARGPARSE_OPT_BOOLEAN: - if (flags & OPT_UNSET) { - *(int *)opt->value = *(int *)opt->value - 1; - } else { - *(int *)opt->value = *(int *)opt->value + 1; - } - if (*(int *)opt->value < 0) { - *(int *)opt->value = 0; - } - break; + if (flags & OPT_UNSET) { + *(int *)opt->value = *(int *)opt->value - 1; + } else { + *(int *)opt->value = *(int *)opt->value + 1; + } + if (*(int *)opt->value < 0) { + *(int *)opt->value = 0; + } + break; case ARGPARSE_OPT_BIT: - if (flags & OPT_UNSET) { - *(int *)opt->value &= ~opt->data; - } else { - *(int *)opt->value |= opt->data; - } - break; + if (flags & OPT_UNSET) { + *(int *)opt->value &= ~opt->data; + } else { + *(int *)opt->value |= opt->data; + } + break; case ARGPARSE_OPT_STRING: - if (self->optvalue) { - *(const char **)opt->value = self->optvalue; - self->optvalue = NULL; - } else if (self->argc > 1) { - self->argc--; - *(const char **)opt->value = *++self->argv; - } else { - argparse_error(self, opt, "requires a value", flags); - } - break; + if (self->optvalue) { + *(const char **)opt->value = self->optvalue; + self->optvalue = NULL; + } else if (self->argc > 1) { + self->argc--; + *(const char **)opt->value = *++self->argv; + } else { + argparse_error(self, opt, "requires a value", flags); + } + break; case ARGPARSE_OPT_INTEGER: - errno = 0; - if (self->optvalue) { - *(int *)opt->value = strtol(self->optvalue, (char **)&s, 0); - self->optvalue = NULL; - } else if (self->argc > 1) { - self->argc--; - *(int *)opt->value = strtol(*++self->argv, (char **)&s, 0); - } else { - argparse_error(self, opt, "requires a value", flags); - } - if (errno) - argparse_error(self, opt, strerror(errno), flags); - if (s[0] != '\0') - argparse_error(self, opt, "expects an integer value", flags); - break; + errno = 0; + if (self->optvalue) { + *(int *)opt->value = strtol(self->optvalue, (char **)&s, 0); + self->optvalue = NULL; + } else if (self->argc > 1) { + self->argc--; + *(int *)opt->value = strtol(*++self->argv, (char **)&s, 0); + } else { + argparse_error(self, opt, "requires a value", flags); + } + if (errno) argparse_error(self, opt, strerror(errno), flags); + if (s[0] != '\0') + argparse_error(self, opt, "expects an integer value", flags); + break; case ARGPARSE_OPT_FLOAT: - errno = 0; - if (self->optvalue) { - *(float *)opt->value = strtof(self->optvalue, (char **)&s); - self->optvalue = NULL; - } else if (self->argc > 1) { - self->argc--; - *(float *)opt->value = strtof(*++self->argv, (char **)&s); - } else { - argparse_error(self, opt, "requires a value", flags); - } - if (errno) - argparse_error(self, opt, strerror(errno), flags); - if (s[0] != '\0') - argparse_error(self, opt, "expects a numerical value", flags); - break; + errno = 0; + if (self->optvalue) { + *(float *)opt->value = strtof(self->optvalue, (char **)&s); + self->optvalue = NULL; + } else if (self->argc > 1) { + self->argc--; + *(float *)opt->value = strtof(*++self->argv, (char **)&s); + } else { + argparse_error(self, opt, "requires a value", flags); + } + if (errno) argparse_error(self, opt, strerror(errno), flags); + if (s[0] != '\0') + argparse_error(self, opt, "expects a numerical value", flags); + break; default: - assert(0); - } + assert(0); + } skipped: - if (opt->callback) { - return opt->callback(self, opt); - } + if (opt->callback) { + return opt->callback(self, opt); + } - return 0; + return 0; } -static void -argparse_options_check(const struct argparse_option *options) -{ - for (; options->type != ARGPARSE_OPT_END; options++) { - switch (options->type) { - case ARGPARSE_OPT_END: - case ARGPARSE_OPT_BOOLEAN: - case ARGPARSE_OPT_BIT: - case ARGPARSE_OPT_INTEGER: - case ARGPARSE_OPT_FLOAT: - case ARGPARSE_OPT_STRING: - case ARGPARSE_OPT_GROUP: - continue; - default: - fprintf(stderr, "wrong option type: %d", options->type); - break; - } +static void argparse_options_check(const struct argparse_option *options) { + for (; options->type != ARGPARSE_OPT_END; options++) { + switch (options->type) { + case ARGPARSE_OPT_END: + case ARGPARSE_OPT_BOOLEAN: + case ARGPARSE_OPT_BIT: + case ARGPARSE_OPT_INTEGER: + case ARGPARSE_OPT_FLOAT: + case ARGPARSE_OPT_STRING: + case ARGPARSE_OPT_GROUP: + continue; + default: + fprintf(stderr, "wrong option type: %d", options->type); + break; } + } } -static int -argparse_short_opt(struct argparse *self, const struct argparse_option *options) -{ - for (; options->type != ARGPARSE_OPT_END; options++) { - if (options->short_name == *self->optvalue) { - self->optvalue = self->optvalue[1] ? self->optvalue + 1 : NULL; - return argparse_getvalue(self, options, 0); - } +static int argparse_short_opt(struct argparse *self, + const struct argparse_option *options) { + for (; options->type != ARGPARSE_OPT_END; options++) { + if (options->short_name == *self->optvalue) { + self->optvalue = self->optvalue[1] ? self->optvalue + 1 : NULL; + return argparse_getvalue(self, options, 0); } - return -2; + } + return -2; } -static int -argparse_long_opt(struct argparse *self, const struct argparse_option *options) -{ - for (; options->type != ARGPARSE_OPT_END; options++) { - const char *rest; - int opt_flags = 0; - if (!options->long_name) - continue; +static int argparse_long_opt(struct argparse *self, + const struct argparse_option *options) { + for (; options->type != ARGPARSE_OPT_END; options++) { + const char *rest; + int opt_flags = 0; + if (!options->long_name) continue; - rest = prefix_skip(self->argv[0] + 2, options->long_name); - if (!rest) { - // negation disabled? - if (options->flags & OPT_NONEG) { - continue; - } - // only OPT_BOOLEAN/OPT_BIT supports negation - if (options->type != ARGPARSE_OPT_BOOLEAN && options->type != - ARGPARSE_OPT_BIT) { - continue; - } + rest = prefix_skip(self->argv[0] + 2, options->long_name); + if (!rest) { + // negation disabled? + if (options->flags & OPT_NONEG) { + continue; + } + // only OPT_BOOLEAN/OPT_BIT supports negation + if (options->type != ARGPARSE_OPT_BOOLEAN && + options->type != ARGPARSE_OPT_BIT) { + continue; + } - if (prefix_cmp(self->argv[0] + 2, "no-")) { - continue; - } - rest = prefix_skip(self->argv[0] + 2 + 3, options->long_name); - if (!rest) - continue; - opt_flags |= OPT_UNSET; - } - if (*rest) { - if (*rest != '=') - continue; - self->optvalue = rest + 1; - } - return argparse_getvalue(self, options, opt_flags | OPT_LONG); + if (prefix_cmp(self->argv[0] + 2, "no-")) { + continue; + } + rest = prefix_skip(self->argv[0] + 2 + 3, options->long_name); + if (!rest) continue; + opt_flags |= OPT_UNSET; + } + if (*rest) { + if (*rest != '=') continue; + self->optvalue = rest + 1; } - return -2; + return argparse_getvalue(self, options, opt_flags | OPT_LONG); + } + return -2; } -int -argparse_init(struct argparse *self, struct argparse_option *options, - const char *const *usages, int flags) -{ - memset(self, 0, sizeof(*self)); - self->options = options; - self->usages = usages; - self->flags = flags; - self->description = NULL; - self->epilog = NULL; - return 0; +int argparse_init(struct argparse *self, struct argparse_option *options, + const char *const *usages, int flags) { + memset(self, 0, sizeof(*self)); + self->options = options; + self->usages = usages; + self->flags = flags; + self->description = NULL; + self->epilog = NULL; + return 0; } -void -argparse_describe(struct argparse *self, const char *description, - const char *epilog) -{ - self->description = description; - self->epilog = epilog; +void argparse_describe(struct argparse *self, const char *description, + const char *epilog) { + self->description = description; + self->epilog = epilog; } -int -argparse_parse(struct argparse *self, int argc, const char **argv) -{ - self->argc = argc - 1; - self->argv = argv + 1; - self->out = argv; +int argparse_parse(struct argparse *self, int argc, const char **argv) { + self->argc = argc - 1; + self->argv = argv + 1; + self->out = argv; - argparse_options_check(self->options); + argparse_options_check(self->options); - for (; self->argc; self->argc--, self->argv++) { - const char *arg = self->argv[0]; - if (arg[0] != '-' || !arg[1]) { - if (self->flags & ARGPARSE_STOP_AT_NON_OPTION) { - goto end; - } - // if it's not option or is a single char '-', copy verbatim - self->out[self->cpidx++] = self->argv[0]; - continue; - } - // short option - if (arg[1] != '-') { - self->optvalue = arg + 1; - switch (argparse_short_opt(self, self->options)) { - case -1: - break; - case -2: - goto unknown; - } - while (self->optvalue) { - switch (argparse_short_opt(self, self->options)) { - case -1: - break; - case -2: - goto unknown; - } - } - continue; - } - // if '--' presents - if (!arg[2]) { - self->argc--; - self->argv++; - break; - } - // long option - switch (argparse_long_opt(self, self->options)) { + for (; self->argc; self->argc--, self->argv++) { + const char *arg = self->argv[0]; + if (arg[0] != '-' || !arg[1]) { + if (self->flags & ARGPARSE_STOP_AT_NON_OPTION) { + goto end; + } + // if it's not option or is a single char '-', copy verbatim + self->out[self->cpidx++] = self->argv[0]; + continue; + } + // short option + if (arg[1] != '-') { + self->optvalue = arg + 1; + switch (argparse_short_opt(self, self->options)) { case -1: - break; + break; case -2: + goto unknown; + } + while (self->optvalue) { + switch (argparse_short_opt(self, self->options)) { + case -1: + break; + case -2: goto unknown; } - continue; - -unknown: - fprintf(stderr, "error: unknown option `%s`\n", self->argv[0]); - argparse_usage(self); - exit(1); + } + continue; + } + // if '--' presents + if (!arg[2]) { + self->argc--; + self->argv++; + break; } + // long option + switch (argparse_long_opt(self, self->options)) { + case -1: + break; + case -2: + goto unknown; + } + continue; + + unknown: + fprintf(stderr, "error: unknown option `%s`\n", self->argv[0]); + argparse_usage(self); + exit(1); + } end: - memmove(self->out + self->cpidx, self->argv, - self->argc * sizeof(*self->out)); - self->out[self->cpidx + self->argc] = NULL; + memmove(self->out + self->cpidx, self->argv, self->argc * sizeof(*self->out)); + self->out[self->cpidx + self->argc] = NULL; - return self->cpidx + self->argc; + return self->cpidx + self->argc; } -void -argparse_usage(struct argparse *self) -{ - if (self->usages) { - fprintf(stdout, "Usage: %s\n", *self->usages++); - while (*self->usages && **self->usages) - fprintf(stdout, " or: %s\n", *self->usages++); - } else { - fprintf(stdout, "Usage:\n"); - } +void argparse_usage(struct argparse *self) { + if (self->usages) { + fprintf(stdout, "Usage: %s\n", *self->usages++); + while (*self->usages && **self->usages) + fprintf(stdout, " or: %s\n", *self->usages++); + } else { + fprintf(stdout, "Usage:\n"); + } - // print description - if (self->description) - fprintf(stdout, "%s\n", self->description); + // print description + if (self->description) fprintf(stdout, "%s\n", self->description); - fputc('\n', stdout); + fputc('\n', stdout); - const struct argparse_option *options; + const struct argparse_option *options; - // figure out best width - size_t usage_opts_width = 0; - size_t len; - options = self->options; - for (; options->type != ARGPARSE_OPT_END; options++) { - len = 0; - if ((options)->short_name) { - len += 2; - } - if ((options)->short_name && (options)->long_name) { - len += 2; // separator ", " - } - if ((options)->long_name) { - len += strlen((options)->long_name) + 2; - } - if (options->type == ARGPARSE_OPT_INTEGER) { - len += strlen("=<int>"); - } - if (options->type == ARGPARSE_OPT_FLOAT) { - len += strlen("=<flt>"); - } else if (options->type == ARGPARSE_OPT_STRING) { - len += strlen("=<str>"); - } - len = (len + 3) - ((len + 3) & 3); - if (usage_opts_width < len) { - usage_opts_width = len; - } + // figure out best width + size_t usage_opts_width = 0; + size_t len; + options = self->options; + for (; options->type != ARGPARSE_OPT_END; options++) { + len = 0; + if ((options)->short_name) { + len += 2; + } + if ((options)->short_name && (options)->long_name) { + len += 2; // separator ", " + } + if ((options)->long_name) { + len += strlen((options)->long_name) + 2; } - usage_opts_width += 4; // 4 spaces prefix + if (options->type == ARGPARSE_OPT_INTEGER) { + len += strlen("=<int>"); + } + if (options->type == ARGPARSE_OPT_FLOAT) { + len += strlen("=<flt>"); + } else if (options->type == ARGPARSE_OPT_STRING) { + len += strlen("=<str>"); + } + len = (len + 3) - ((len + 3) & 3); + if (usage_opts_width < len) { + usage_opts_width = len; + } + } + usage_opts_width += 4; // 4 spaces prefix - options = self->options; - for (; options->type != ARGPARSE_OPT_END; options++) { - size_t pos = 0; - int pad = 0; - if (options->type == ARGPARSE_OPT_GROUP) { - fputc('\n', stdout); - fprintf(stdout, "%s", options->help); - fputc('\n', stdout); - continue; - } - pos = fprintf(stdout, " "); - if (options->short_name) { - pos += fprintf(stdout, "-%c", options->short_name); - } - if (options->long_name && options->short_name) { - pos += fprintf(stdout, ", "); - } - if (options->long_name) { - pos += fprintf(stdout, "--%s", options->long_name); - } - if (options->type == ARGPARSE_OPT_INTEGER) { - pos += fprintf(stdout, "=<int>"); - } - if (options->type == ARGPARSE_OPT_FLOAT) { - pos += fprintf(stdout, "=<flt>"); - } else if (options->type == ARGPARSE_OPT_STRING) { - pos += fprintf(stdout, "=<str>"); - } - if (pos <= usage_opts_width) { - pad = usage_opts_width - pos; - } else { - fputc('\n', stdout); - pad = usage_opts_width; + options = self->options; + for (; options->type != ARGPARSE_OPT_END; options++) { + size_t pos = 0; + int pad = 0; + if (options->type == ARGPARSE_OPT_GROUP) { + fputc('\n', stdout); + fprintf(stdout, "%s", options->help); + fputc('\n', stdout); + continue; + } + pos = fprintf(stdout, " "); + if (options->short_name) { + pos += fprintf(stdout, "-%c", options->short_name); + } + if (options->long_name && options->short_name) { + pos += fprintf(stdout, ", "); + } + if (options->long_name) { + pos += fprintf(stdout, "--%s", options->long_name); + } + if (options->type == ARGPARSE_OPT_INTEGER) { + pos += fprintf(stdout, "=<int>"); + } + if (options->type == ARGPARSE_OPT_FLOAT) { + pos += fprintf(stdout, "=<flt>"); + } else if (options->type == ARGPARSE_OPT_STRING) { + pos += fprintf(stdout, "=<str>"); + } + if (pos <= usage_opts_width) { + pad = usage_opts_width - pos; + } else { + fputc('\n', stdout); + pad = usage_opts_width; + } + if (options->help != NULL && strlen(options->help) > 0) { + char *str = strdup(options->help); + char *token = strtok(str, " "); + fprintf(stdout, "%*s%s ", pad + 2, "", token); + int count = strlen(token); + int dangling = 1; + while ((token = strtok(NULL, " ")) != NULL) { + if (count == 0) { + fprintf(stdout, "%*s", (int)pos + pad + 2, ""); + dangling = 1; } - if (options->help != NULL && strlen(options->help) > 0) { - char *str = strdup(options->help); - char *token = strtok(str, " "); - fprintf(stdout, "%*s%s ", pad + 2, "", token); - int count = strlen(token); - int dangling = 1; - while ((token = strtok(NULL, " ")) != NULL) { - if (count == 0) { - fprintf(stdout, "%*s", (int)pos + pad + 2, ""); - dangling = 1; - } - printf("%s ", token); - count += strlen(token); - if (count > 30) { - count = 0; - fprintf(stdout, "\n"); - dangling = 0; - } - } - if (dangling) fprintf(stdout, "\n"); - } else { - fprintf(stdout, "\n"); + printf("%s ", token); + count += strlen(token); + if (count > 30) { + count = 0; + fprintf(stdout, "\n"); + dangling = 0; } - + } + if (dangling) fprintf(stdout, "\n"); + } else { + fprintf(stdout, "\n"); } + } - // print epilog - if (self->epilog) - fprintf(stdout, "%s\n", self->epilog); + // print epilog + if (self->epilog) fprintf(stdout, "%s\n", self->epilog); } -int -argparse_help_cb(struct argparse *self, const struct argparse_option *option) -{ - (void)option; - argparse_usage(self); - exit(0); +int argparse_help_cb(struct argparse *self, + const struct argparse_option *option) { + (void)option; + argparse_usage(self); + exit(0); } diff --git a/argparse/argparse.h b/argparse/argparse.h index 7fff31db001f373e566ebd51bc944b353ca343d4..186214b4bc90cea90ef141380bf0017cc50af128 100644 --- a/argparse/argparse.h +++ b/argparse/argparse.h @@ -18,36 +18,36 @@ extern "C" { struct argparse; struct argparse_option; -typedef int argparse_callback (struct argparse *self, - const struct argparse_option *option); +typedef int argparse_callback(struct argparse *self, + const struct argparse_option *option); enum argparse_flag { - ARGPARSE_STOP_AT_NON_OPTION = 1, + ARGPARSE_STOP_AT_NON_OPTION = 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, + /* 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 */ + 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. + * 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. @@ -72,32 +72,32 @@ enum argparse_option_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; + 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 + // 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 @@ -105,16 +105,23 @@ int argparse_help_cb(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() OPT_BOOLEAN('h', "help", NULL, \ - "show this help message and exit", \ - argparse_help_cb, 0, 0) +#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() \ + OPT_BOOLEAN('h', "help", NULL, "show this help message and exit", \ + argparse_help_cb, 0, 0) int argparse_init(struct argparse *self, struct argparse_option *options, const char *const *usages, int flags); diff --git a/argparse/test_argparse.c b/argparse/test_argparse.c index bb1827ff3e58cbe4337cfcc098d8419bf40baaaf..5f411833aafa603d085258f11b8bbb35ff1c6d39 100644 --- a/argparse/test_argparse.c +++ b/argparse/test_argparse.c @@ -9,76 +9,72 @@ static const char *const usages[] = { NULL, }; -#define PERM_READ (1<<0) -#define PERM_WRITE (1<<1) -#define PERM_EXEC (1<<2) +#define PERM_READ (1 << 0) +#define PERM_WRITE (1 << 1) +#define PERM_EXEC (1 << 2) struct stuff { - const char *path[10]; - int npath; + const char *path[10]; + int npath; }; -static int callback(struct argparse *self, const struct argparse_option *opt) -{ - printf("Called back... %s\n", *(char **)opt->value); - struct stuff *data = (struct stuff *)opt->data; - data->path[data->npath] = *(char **)opt->value; - data->npath++; - return 1; +static int callback(struct argparse *self, const struct argparse_option *opt) { + printf("Called back... %s\n", *(char **)opt->value); + struct stuff *data = (struct stuff *)opt->data; + data->path[data->npath] = *(char **)opt->value; + data->npath++; + return 1; } -int -main(int argc, const char **argv) -{ - int force = 0; - int self_gravity = 0; - int int_num = 0; - float flt_num = 0.f; - struct stuff data; - data.npath = 0; - data.path[0] = NULL; - const char *buffer; - int perms = 0; - int npath; +int main(int argc, const char **argv) { + int force = 0; + int self_gravity = 0; + int int_num = 0; + float flt_num = 0.f; + struct stuff data; + data.npath = 0; + data.path[0] = NULL; + const char *buffer; + int perms = 0; + int npath; - struct argparse_option options[] = { - OPT_HELP(), - OPT_GROUP("Basic options"), - OPT_BOOLEAN('f', "force", &force, "force to do", NULL, 0, 0), - OPT_BOOLEAN(0, "self-gravity", &self_gravity, "use self gravity", - NULL, 0, 0), - OPT_STRING('P', "path", &buffer, "path to read", &callback, - (intptr_t)&data , 0), - OPT_INTEGER('i', "int", &int_num, "selected integer", NULL, 0, 0), - OPT_FLOAT('s', "float", &flt_num, "selected float", NULL, 0, 0), - OPT_END(), - }; + struct argparse_option options[] = { + OPT_HELP(), + OPT_GROUP("Basic options"), + OPT_BOOLEAN('f', "force", &force, "force to do", NULL, 0, 0), + OPT_BOOLEAN(0, "self-gravity", &self_gravity, "use self gravity", NULL, 0, + 0), + OPT_STRING('P', "path", &buffer, "path to read", &callback, + (intptr_t)&data, 0), + OPT_INTEGER('i', "int", &int_num, "selected integer", NULL, 0, 0), + OPT_FLOAT('s', "float", &flt_num, "selected float", NULL, 0, 0), + OPT_END(), + }; - struct argparse argparse; - argparse_init(&argparse, options, usages, 0); - argparse_describe(&argparse, "\nA brief description of what the program does and how it works.", "\nAdditional description of the program after the description of the arguments."); - argc = argparse_parse(&argparse, argc, argv); - if (force != 0) - printf("force: %d\n", force); - if (self_gravity != 0) - printf("self_gravity: %d\n", self_gravity); - if (data.npath > 0) { - for (int i = 0 ; i < data.npath; i++) - printf("path: %s\n", data.path[i]); + struct argparse argparse; + argparse_init(&argparse, options, usages, 0); + argparse_describe( + &argparse, + "\nA brief description of what the program does and how it works.", + "\nAdditional description of the program after the description of the " + "arguments."); + argc = argparse_parse(&argparse, argc, argv); + if (force != 0) printf("force: %d\n", force); + if (self_gravity != 0) printf("self_gravity: %d\n", self_gravity); + if (data.npath > 0) { + for (int i = 0; i < data.npath; i++) printf("path: %s\n", data.path[i]); + } + if (int_num != 0) printf("int_num: %d\n", int_num); + if (flt_num != 0) printf("flt_num: %g\n", flt_num); + if (argc != 0) { + printf("argc: %d\n", argc); + int i; + for (i = 0; i < argc; i++) { + printf("argv[%d]: %s\n", i, *(argv + i)); } - if (int_num != 0) - printf("int_num: %d\n", int_num); - if (flt_num != 0) - printf("flt_num: %g\n", flt_num); - if (argc != 0) { - printf("argc: %d\n", argc); - int i; - for (i = 0; i < argc; i++) { - printf("argv[%d]: %s\n", i, *(argv + i)); - } - } - if (perms) { - printf("perms: %d\n", perms); - } - return 0; + } + if (perms) { + printf("perms: %d\n", perms); + } + return 0; }