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 | |
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.
-rw-r--r-- | mh/mh_getopt.c | 47 | ||||
-rw-r--r-- | mh/mh_getopt.h | 5 | ||||
-rw-r--r-- | mh/pick.c | 17 | ||||
-rw-r--r-- | mh/tests/pick.at | 33 |
4 files changed, 92 insertions, 10 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); diff --git a/mh/mh_getopt.h b/mh/mh_getopt.h index 2dcd57a1a..93d1d348d 100644 --- a/mh/mh_getopt.h +++ b/mh/mh_getopt.h @@ -23,6 +23,11 @@ void mh_getopt (int *pargc, char ***pargv, struct mu_option *options, int flags, char *argdoc, char *progdoc, char *extradoc); +void 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); void mh_opt_notimpl (struct mu_parseopt *po, struct mu_option *opt, char const *arg); @@ -260,6 +260,19 @@ parse_comp_match (int *pargc, char **argv) *pargc = j; } +static int +comp_match_arg (int argc, char **argv, void *data) +{ + if (argc >= 2 && strncmp (argv[0], "--", 2) == 0) + { + mu_list_t *lp = data; + pick_add_token (lp, T_COMP, argv[0] + 2); + pick_add_token (lp, T_STRING, argv[1]); + return 2; + } + return 0; +} + int main (int argc, char **argv) { @@ -267,8 +280,8 @@ main (int argc, char **argv) mu_mailbox_t mbox; mu_msgset_t msgset; - mh_getopt (&argc, &argv, options, MH_GETOPT_DEFAULT_FOLDER, - args_doc, prog_doc, NULL); + mh_getopt0 (&argc, &argv, options, MH_GETOPT_DEFAULT_FOLDER, + args_doc, prog_doc, NULL, comp_match_arg, &lexlist); parse_comp_match (&argc, argv); diff --git a/mh/tests/pick.at b/mh/tests/pick.at index ce3dab1e5..d5a3b33a8 100644 --- a/mh/tests/pick.at +++ b/mh/tests/pick.at @@ -342,5 +342,38 @@ pick --X-Envelope-Sender hare 71 ]) +MH_CHECK([pick --Component pattern -or ...],[pick12 pick-component0or],[ +MUT_MBCOPY($abs_top_srcdir/testsuite/mh/teaparty,[Mail/inbox]) +pick --X-Envelope-Sender hare -or -to hare +], +[0], +[1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +16 +21 +22 +23 +24 +35 +42 +58 +59 +62 +71 +72 +]) + m4_popdef[MH_KEYWORDS]) # End of pick.at |