diff --git a/lib/roken/getarg.c b/lib/roken/getarg.c index 3f4317170..a2af9f53c 100644 --- a/lib/roken/getarg.c +++ b/lib/roken/getarg.c @@ -91,12 +91,16 @@ arg_printusage (struct getargs *args, len += 2 + strlen(args[i].long_name); len += print_arg (1, &args[i]); putc (']', stderr); + if(args[i].type == arg_strings) + fprintf (stderr, "..."); } if (args[i].short_name) { len += 2; fprintf (stderr, " [-%c", args[i].short_name); len += print_arg (0, &args[i]); putc (']', stderr); + if(args[i].type == arg_strings) + fprintf (stderr, "..."); } if (args[i].long_name && args[i].short_name) len += 4; @@ -136,6 +140,14 @@ arg_printusage (struct getargs *args, } } +static void +add_string(getarg_strings *s, char *value) +{ + s->strings = realloc(s->strings, (s->num_strings + 1) * sizeof(*s->strings)); + s->strings[s->num_strings] = value; + s->num_strings++; +} + static int arg_match_long(struct getargs *args, size_t num_args, char *argv) @@ -206,6 +218,11 @@ arg_match_long(struct getargs *args, size_t num_args, *(char**)current->value = optarg + 1; return 0; } + case arg_strings: + { + add_string((getarg_strings*)current->value, optarg + 1); + return 0; + } case arg_flag: { int *flag = current->value; @@ -279,6 +296,9 @@ getarg(struct getargs *args, size_t num_args, }else if(args[k].type == arg_string){ *(char**)args[k].value = optarg; goto out; + }else if(args[k].type == arg_strings){ + add_string((getarg_strings*)args[k].value, optarg); + goto out; } return ARG_ERR_BAD_ARG; } diff --git a/lib/roken/getarg.h b/lib/roken/getarg.h index 2f5ddc6b1..de144d70f 100644 --- a/lib/roken/getarg.h +++ b/lib/roken/getarg.h @@ -46,7 +46,7 @@ struct getargs{ const char *long_name; char short_name; - enum { arg_integer, arg_string, arg_flag, arg_negative_flag } type; + enum { arg_integer, arg_string, arg_flag, arg_negative_flag, arg_strings } type; void *value; const char *help; const char *arg_help; @@ -58,6 +58,11 @@ enum { ARG_ERR_NO_ARG }; +typedef struct getarg_strings { + int num_strings; + char **strings; +} getarg_strings; + int getarg(struct getargs *args, size_t num_args, int argc, char **argv, int *optind);