summaryrefslogtreecommitdiff
path: root/mh/mh_getopt.c
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2016-12-14 21:52:40 +0200
committerSergey Poznyakoff <gray@gnu.org>2016-12-14 21:52:40 +0200
commitfb84d1e35a1f9247e3c79919b52230adf6592f9f (patch)
tree72a759f967e036755a1b3c31accc693df54d82fe /mh/mh_getopt.c
parent89fb41d0170724c49d23c0887d5f47026b221898 (diff)
downloadmailutils-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.c47
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);

Return to:

Send suggestions and report system problems to the System administrator.