diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2016-12-14 21:52:40 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2016-12-14 21:52:40 +0200 |
commit | fb84d1e35a1f9247e3c79919b52230adf6592f9f (patch) | |
tree | 72a759f967e036755a1b3c31accc693df54d82fe /mh/mh_getopt.c | |
parent | 89fb41d0170724c49d23c0887d5f47026b221898 (diff) | |
download | mailutils-fb84d1e35a1f9247e3c79919b52230adf6592f9f.tar.gz mailutils-fb84d1e35a1f9247e3c79919b52230adf6592f9f.tar.bz2 |
Fix pick --component NAME
* mh/mh_getopt.c (mh_getopt0): New function.
(mh_getopt): Rewrite as alternative entry point to .
* mh/mh_getopt.h (mh_getopt0): New proto.
* mh/pick.c: Use mh_getopt0
* mh/tests/pick.at: Add new testcase.
Diffstat (limited to 'mh/mh_getopt.c')
-rw-r--r-- | mh/mh_getopt.c | 47 |
1 files changed, 39 insertions, 8 deletions
diff --git a/mh/mh_getopt.c b/mh/mh_getopt.c index 0e7ec3cff..211f57f49 100644 --- a/mh/mh_getopt.c +++ b/mh/mh_getopt.c @@ -178,9 +178,11 @@ has_folder_option (struct mu_option *opt) } void -mh_getopt (int *pargc, char ***pargv, struct mu_option *options, - int mhflags, - char *argdoc, char *progdoc, char *extradoc) +mh_getopt0 (int *pargc, char ***pargv, struct mu_option *options, + int mhflags, + char *argdoc, char *progdoc, char *extradoc, + int (*eatarg) (int argc, char **argv, void *data), + void *data) { int argc = *pargc; char **argv = *pargv; @@ -197,6 +199,9 @@ mh_getopt (int *pargc, char ***pargv, struct mu_option *options, po.po_negation = "no"; flags |= MU_PARSEOPT_NEGATION; + if (eatarg) + flags |= MU_PARSEOPT_IN_ORDER; + if ((mhflags & MH_GETOPT_DEFAULT_FOLDER) || has_folder_option (options)) { po.po_special_args = N_("[+FOLDER]"); @@ -254,12 +259,29 @@ mh_getopt (int *pargc, char ***pargv, struct mu_option *options, if (options) optv[i++] = options; optv[i] = NULL; - - if (mu_parseopt (&po, argc, argv, optv, flags)) - exit (po.po_exit_error); - argc -= po.po_arg_start; - argv += po.po_arg_start; + do + { + if (mu_parseopt (&po, argc, argv, optv, flags)) + exit (po.po_exit_error); + argc -= po.po_arg_start; + argv += po.po_arg_start; + if (eatarg) + { + int consumed = eatarg (argc, argv, data); + if (consumed == 0) + break; + else + { + argc -= consumed; + argv += consumed; + } + flags |= MU_PARSEOPT_ARGV0; + } + else + break; + } + while (argc > 0); process_std_options (argc, argv, &po); @@ -283,6 +305,15 @@ mh_getopt (int *pargc, char ***pargv, struct mu_option *options, } void +mh_getopt (int *pargc, char ***pargv, struct mu_option *options, + int mhflags, + char *argdoc, char *progdoc, char *extradoc) +{ + return mh_getopt0 (pargc, pargv, options, mhflags, argdoc, progdoc, extradoc, + NULL, NULL); +} + +void mh_opt_notimpl (struct mu_parseopt *po, struct mu_option *opt, char const *arg) { mu_error (_("option is not yet implemented: %s"), opt->opt_long); |