From 90dd474c3ea8bf10bde6ee15eaaf9f3af3fb46f6 Mon Sep 17 00:00:00 2001 From: nicm Date: Fri, 20 Aug 2021 18:59:53 +0000 Subject: Expose args_value struct (will be needed soon) and add some missing frees. --- arguments.c | 25 ++++++------------------- 1 file changed, 6 insertions(+), 19 deletions(-) (limited to 'arguments.c') diff --git a/arguments.c b/arguments.c index 91141b99..142f86d8 100644 --- a/arguments.c +++ b/arguments.c @@ -29,10 +29,6 @@ * Manipulate command arguments. */ -struct args_value { - char *value; - TAILQ_ENTRY(args_value) entry; -}; TAILQ_HEAD(args_values, args_value); struct args_entry { @@ -335,30 +331,21 @@ args_next(struct args_entry **entry) } /* Get first value in argument. */ -const char * -args_first_value(struct args *args, u_char flag, struct args_value **value) +struct args_value * +args_first_value(struct args *args, u_char flag) { struct args_entry *entry; if ((entry = args_find(args, flag)) == NULL) return (NULL); - - *value = TAILQ_FIRST(&entry->values); - if (*value == NULL) - return (NULL); - return ((*value)->value); + return (TAILQ_FIRST(&entry->values)); } /* Get next value in argument. */ -const char * -args_next_value(struct args_value **value) +struct args_value * +args_next_value(struct args_value *value) { - if (*value == NULL) - return (NULL); - *value = TAILQ_NEXT(*value, entry); - if (*value == NULL) - return (NULL); - return ((*value)->value); + return (TAILQ_NEXT(value, entry)); } /* Convert an argument value to a number. */ -- cgit From 5f32b7d9613e9ef3f8198302379a42630323da6a Mon Sep 17 00:00:00 2001 From: nicm Date: Fri, 20 Aug 2021 19:50:16 +0000 Subject: Hide struct args behind a couple of accessor functions. --- arguments.c | 62 +++++++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 42 insertions(+), 20 deletions(-) (limited to 'arguments.c') diff --git a/arguments.c b/arguments.c index 142f86d8..0867f815 100644 --- a/arguments.c +++ b/arguments.c @@ -38,6 +38,12 @@ struct args_entry { RB_ENTRY(args_entry) entry; }; +struct args { + struct args_tree tree; + int argc; + char **argv; +}; + static struct args_entry *args_find(struct args *, u_char); static int args_cmp(struct args_entry *, struct args_entry *); @@ -73,7 +79,7 @@ args_create(void) /* Parse an argv and argc into a new argument set. */ struct args * -args_parse(const char *template, int argc, char **argv) +args_parse(const char *template, int argc, char **argv, int lower, int upper) { struct args *args; int opt; @@ -99,6 +105,10 @@ args_parse(const char *template, int argc, char **argv) args->argc = argc; args->argv = cmd_copy_argv(argc, argv); + if ((lower != -1 && argc < lower) || (upper != -1 && argc > upper)) { + args_free(args); + return (NULL); + } return (args); } @@ -126,6 +136,14 @@ args_free(struct args *args) free(args); } +/* Convert arguments to vector. */ +void +args_vector(struct args *args, int *argc, char ***argv) +{ + *argc = args->argc; + *argv = cmd_copy_argv(args->argc, args->argv); +} + /* Add to string. */ static void printflike(3, 4) args_print_add(char **buf, size_t *len, const char *fmt, ...) @@ -145,23 +163,6 @@ args_print_add(char **buf, size_t *len, const char *fmt, ...) free(s); } -/* Add value to string. */ -static void -args_print_add_value(char **buf, size_t *len, struct args_entry *entry, - struct args_value *value) -{ - char *escaped; - - if (**buf != '\0') - args_print_add(buf, len, " -%c ", entry->flag); - else - args_print_add(buf, len, "-%c ", entry->flag); - - escaped = args_escape(value->value); - args_print_add(buf, len, "%s", escaped); - free(escaped); -} - /* Add argument to string. */ static void args_print_add_argument(char **buf, size_t *len, const char *argument) @@ -203,8 +204,13 @@ args_print(struct args *args) /* Then the flags with arguments. */ RB_FOREACH(entry, args_tree, &args->tree) { - TAILQ_FOREACH(value, &entry->values, entry) - args_print_add_value(&buf, &len, entry, value); + TAILQ_FOREACH(value, &entry->values, entry) { + if (*buf != '\0') + args_print_add(&buf, &len, " -%c", entry->flag); + else + args_print_add(&buf, &len, "-%c", entry->flag); + args_print_add_argument(&buf, &len, value->value); + } } /* And finally the argument vector. */ @@ -330,6 +336,22 @@ args_next(struct args_entry **entry) return ((*entry)->flag); } +/* Get argument count. */ +u_int +args_count(struct args *args) +{ + return (args->argc); +} + +/* Return argument as string. */ +const char * +args_string(struct args *args, u_int idx) +{ + if (idx >= (u_int)args->argc) + return (NULL); + return (args->argv[idx]); +} + /* Get first value in argument. */ struct args_value * args_first_value(struct args *args, u_char flag) -- cgit From d589be6c65c7295880bb84cd875baab2f77d5067 Mon Sep 17 00:00:00 2001 From: nicm Date: Fri, 20 Aug 2021 20:08:30 +0000 Subject: A couple more spacing fixes. --- arguments.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'arguments.c') diff --git a/arguments.c b/arguments.c index 0867f815..ad3e20b3 100644 --- a/arguments.c +++ b/arguments.c @@ -148,7 +148,7 @@ args_vector(struct args *args, int *argc, char ***argv) static void printflike(3, 4) args_print_add(char **buf, size_t *len, const char *fmt, ...) { - va_list ap; + va_list ap; char *s; size_t slen; @@ -181,7 +181,7 @@ args_print_add_argument(char **buf, size_t *len, const char *argument) char * args_print(struct args *args) { - size_t len; + size_t len; char *buf; int i; u_int j; @@ -376,7 +376,7 @@ args_strtonum(struct args *args, u_char flag, long long minval, long long maxval, char **cause) { const char *errstr; - long long ll; + long long ll; struct args_entry *entry; struct args_value *value; @@ -418,7 +418,7 @@ args_string_percentage(const char *value, long long minval, long long maxval, long long curval, char **cause) { const char *errstr; - long long ll; + long long ll; size_t valuelen = strlen(value); char *copy; -- cgit