diff options
-rw-r--r-- | libmailutils/tests/cidr.c | 43 | ||||
-rw-r--r-- | libmailutils/tests/debugspec.c | 54 | ||||
-rw-r--r-- | libmailutils/tests/decode2047.c | 36 | ||||
-rw-r--r-- | libmailutils/tests/encode2047.c | 43 | ||||
-rw-r--r-- | libmailutils/tests/fsfolder.c | 60 | ||||
-rw-r--r-- | libmailutils/tests/globtest.c | 55 | ||||
-rw-r--r-- | libmailutils/tests/imapio.at | 2 | ||||
-rw-r--r-- | libmailutils/tests/imapio.c | 56 | ||||
-rw-r--r-- | libmailutils/tests/mailcap.c | 61 | ||||
-rw-r--r-- | libmailutils/tests/mcf.c | 49 | ||||
-rw-r--r-- | libmailutils/tests/modmesg.c | 134 | ||||
-rw-r--r-- | libmailutils/tests/msgset.c | 187 | ||||
-rw-r--r-- | libmailutils/tests/scantime.c | 39 | ||||
-rw-r--r-- | libmailutils/tests/stream-getdelim.c | 6 | ||||
-rw-r--r-- | libmailutils/tests/strerr.at | 22 | ||||
-rw-r--r-- | libmailutils/tests/strftime.c | 62 | ||||
-rw-r--r-- | libmailutils/tests/strin.c | 74 | ||||
-rw-r--r-- | libmailutils/tests/strout.at | 22 | ||||
-rw-r--r-- | libmailutils/tests/strout.c | 77 | ||||
-rw-r--r-- | libmailutils/tests/t-streamshift.c | 336 | ||||
-rw-r--r-- | libmailutils/tests/t0-stream.c | 2 | ||||
-rw-r--r-- | libmailutils/tests/temp_stream.c | 50 | ||||
-rw-r--r-- | libmailutils/tests/tempfile.c | 130 |
23 files changed, 858 insertions, 742 deletions
diff --git a/libmailutils/tests/cidr.c b/libmailutils/tests/cidr.c index 20e18b0fc..febf92f08 100644 --- a/libmailutils/tests/cidr.c +++ b/libmailutils/tests/cidr.c @@ -30,36 +30,40 @@ print_bytes (unsigned char *b, size_t l) printf ("\n"); } +static int ipv6_simplify; + +struct mu_option options[] = { + { "simplify", 's', NULL, MU_OPTION_DEFAULT, + "simplify IPv6 addresses", mu_c_bool, &ipv6_simplify }, + MU_OPTION_END +}; + int main (int argc, char **argv) { - int flags = 0; - mu_set_program_name (argv[0]); - if (argc < 2) + mu_cli_simple (argc, argv, + MU_CLI_OPTION_OPTIONS, options, + MU_CLI_OPTION_PROG_DOC, "cidr test tool", + MU_CLI_OPTION_PROG_ARGS, "CIDR [CIDR...]", + MU_CLI_OPTION_RETURN_ARGC, &argc, + MU_CLI_OPTION_RETURN_ARGV, &argv, + MU_CLI_OPTION_END); + + if (argc == 0) { - mu_error ("usage: %s [-sS] CIDR [CIDR...]", argv[0]); + mu_error ("required argument missing; try %s --help for more info", + mu_program_name); return 1; } - while (--argc) + while (argc--) { - char *arg = *++argv; + char *arg = *argv++; struct mu_cidr cidr; int rc; char *str; - if (strcmp (arg, "-s") == 0) - { - flags |= MU_CIDR_FMT_SIMPLIFY; - continue; - } - else if (strcmp (arg, "-S") == 0) - { - flags &= ~MU_CIDR_FMT_SIMPLIFY; - continue; - } - rc = mu_cidr_from_string (&cidr, arg); if (rc) { @@ -74,10 +78,11 @@ main (int argc, char **argv) print_bytes (cidr.address, cidr.len); printf ("netmask ="); print_bytes (cidr.netmask, cidr.len); - rc = mu_cidr_format (&cidr, flags, &str); + rc = mu_cidr_format (&cidr, ipv6_simplify ? MU_CIDR_FMT_SIMPLIFY : 0, + &str); if (rc) { - mu_error ("cannot covert to string: %s", mu_strerror (rc)); + mu_error ("cannot convert to string: %s", mu_strerror (rc)); return 2; } diff --git a/libmailutils/tests/debugspec.c b/libmailutils/tests/debugspec.c index 9c6feaabc..f99b720dd 100644 --- a/libmailutils/tests/debugspec.c +++ b/libmailutils/tests/debugspec.c @@ -29,47 +29,35 @@ main (int argc, char **argv) { char *names = NULL; int showunset = 0; - char *arg; + struct mu_option options[] = { + { "names", 0, "NAME[;NAME...]", MU_OPTION_DEFAULT, + "show only selected categories", mu_c_string, &names }, + { "showunset", 0, NULL, MU_OPTION_DEFAULT, + "show unset debug categories as well", mu_c_incr, &showunset }, + MU_OPTION_END + }; mu_set_program_name (argv[0]); mu_stdstream_setup (MU_STDSTREAM_RESET_NONE); - if (argc == 1) + mu_cli_simple (argc, argv, + MU_CLI_OPTION_SINGLE_DASH, + MU_CLI_OPTION_OPTIONS, options, + MU_CLI_OPTION_PROG_DOC, "Mailutils debug specification test tool", + MU_CLI_OPTION_PROG_ARGS, "SPEC", + MU_CLI_OPTION_RETURN_ARGC, &argc, + MU_CLI_OPTION_RETURN_ARGV, &argv, + MU_CLI_OPTION_END); + + + if (argc != 1) { - mu_printf ("usage: %s spec\n", argv[0]); + mu_error ("exactly one argument expected; try %s -help for more info", + mu_program_name); return 0; } - while (argc--) - { - arg = *++argv; - - if (strncmp (arg, "-names=", 7) == 0) - names = arg + 7; - else if (strcmp (arg, "-showunset") == 0) - showunset = 1; - else if (arg[0] == '-') - { - if (arg[1] == '-' && arg[2] == 0) - { - argc--; - argv++; - break; - } - mu_error ("unrecognised argument: %s", arg); - return 1; - } - else - break; - } - - if (argc != 1) - { - mu_error ("usage: %s spec", mu_program_name); - return 1; - } - - mu_debug_parse_spec (arg); + mu_debug_parse_spec (argv[0]); mu_debug_format_spec (mu_strout, names, showunset); mu_printf ("\n"); diff --git a/libmailutils/tests/decode2047.c b/libmailutils/tests/decode2047.c index 2e3c13325..d2cf185aa 100644 --- a/libmailutils/tests/decode2047.c +++ b/libmailutils/tests/decode2047.c @@ -20,19 +20,14 @@ #include <stdio.h> #include <stdlib.h> #include <errno.h> -#include <string.h> - #include <mailutils/mailutils.h> -#define ISPRINT(c) ((c)=='\t'||(c)==' '||(c)=='\n'||\ - ((unsigned char)(c)>' '&&(unsigned char)(c)<128)) - void print (char *p, int printable) { for (; *p; p++) { - if (printable && *p != '\n' && !ISPRINT (*p)) + if (printable && *p != '\n' && !mu_isprint (*p)) printf ("\\%03o", *(unsigned char *) p); else putchar (*p); @@ -43,23 +38,22 @@ int main (int argc, char *argv[]) { char buf[256]; - int c, printable = 0; + int printable = 0; char *charset = "iso-8859-1"; - - while ((c = getopt (argc, argv, "c:p")) != EOF) - switch (c) - { - case 'c': - charset = optarg; - break; - case 'p': - printable = 1; - break; - - default: - exit (1); - } + struct mu_option options[] = { + { "charset", 'c', "NAME", MU_OPTION_DEFAULT, + "define output character set", mu_c_string, &charset }, + { "printable", 'p', NULL, MU_OPTION_DEFAULT, + "make sure the output is printable", mu_c_incr, &printable }, + MU_OPTION_END + }; + mu_set_program_name (argv[0]); + mu_cli_simple (argc, argv, + MU_CLI_OPTION_OPTIONS, options, + MU_CLI_OPTION_PROG_DOC, "Test RFC 2047 decoding function", + MU_CLI_OPTION_END); + while (fgets (buf, sizeof (buf), stdin)) { char *p = NULL; diff --git a/libmailutils/tests/encode2047.c b/libmailutils/tests/encode2047.c index 5ee89e1a9..1880efd8c 100644 --- a/libmailutils/tests/encode2047.c +++ b/libmailutils/tests/encode2047.c @@ -110,35 +110,24 @@ main (int argc, char *argv[]) char *charset = "iso-8859-1"; char *encoding = "quoted-printable"; int octal = 0; - - while ((rc = getopt (argc, argv, "c:e:hot")) != EOF) - switch (rc) - { - case 'c': - charset = optarg; - break; - - case 'e': - encoding = optarg; - break; - - case 'o': - octal = 1; - break; - - case 't': - octal = 0; - break; - - case 'h': - printf ("usage: %s [-c charset] [-e encoding] [-ot]\n", argv[0]); - exit (0); - - default: - exit (1); - } + struct mu_option options[] = { + { "charset", 'c', "NAME", MU_OPTION_DEFAULT, + "define input character set", mu_c_string, &charset }, + { "encoding", 'e', "NAME", MU_OPTION_DEFAULT, + "define input encoding", mu_c_string, &encoding }, + { "octal", 'o', NULL, MU_OPTION_DEFAULT, + "decode octal escape notations on input", mu_c_bool, &octal }, + MU_OPTION_END + }; + mu_set_program_name (argv[0]); mu_stdstream_setup (MU_STDSTREAM_RESET_NONE); + mu_cli_simple (argc, argv, + MU_CLI_OPTION_OPTIONS, options, + MU_CLI_OPTION_PROG_DOC, "Test RFC 2047 encoding function", + MU_CLI_OPTION_EXTRA_INFO, "Defaults are: --charset=iso-8859-1 --encoding=quoted-printable", + MU_CLI_OPTION_END); + while ((rc = mu_stream_getline (mu_strin, &buf, &size, &n)) == 0 && n > 0) { char *p; diff --git a/libmailutils/tests/fsfolder.c b/libmailutils/tests/fsfolder.c index 7e0952f4c..97350570e 100644 --- a/libmailutils/tests/fsfolder.c +++ b/libmailutils/tests/fsfolder.c @@ -33,6 +33,7 @@ #include <mailutils/sys/registrar.h> #include <mailutils/assoc.h> #include <mailutils/iterator.h> +#include <mailutils/cli.h> #include "tesh.h" int sort_option; @@ -227,16 +228,6 @@ static struct mu_tesh_command comtab[] = { { NULL } }; -static void -usage (void) -{ - mu_printf ( - "usage: %s [-debug=SPEC] -name=URL [-sort] [-glob] OP ARG... [\\; OP ARG...]...]\n", - mu_program_name); - mu_printf ("OPerations and corresponding ARGuments are:\n"); - mu_tesh_help (comtab, NULL); -} - static int _always_is_scheme (mu_record_t record, mu_url_t url, int flags) { @@ -314,39 +305,42 @@ static struct _mu_record reg_record = int main (int argc, char **argv) { - int i; int rc; mu_folder_t folder; char *fname = NULL; int glob_option = 0; - + struct mu_option options[] = { + { "name", 0, "NAME-OR-URL", MU_OPTION_DEFAULT, + "set file name (mandatory)", mu_c_string, &fname }, + { "sort", 0, NULL, MU_OPTION_DEFAULT, + "sort folders", mu_c_incr, &sort_option }, + { "glob", 0, NULL, MU_OPTION_DEFAULT, + "assume globbing patterns", mu_c_incr, &glob_option }, + MU_OPTION_END + }; + char *capa[] = { "debug", NULL }; + + mu_set_program_name (argv[0]); mu_tesh_init (argv[0]); mu_registrar_record (&any_record); mu_registrar_record (®_record); - if (argc == 1) - { - usage (); - exit (0); - } - - for (i = 1; i < argc; i++) - { - if (strncmp (argv[i], "-debug=", 7) == 0) - mu_debug_parse_spec (argv[i] + 7); - else if (strncmp (argv[i], "-name=", 6) == 0) - fname = argv[i] + 6; - else if (strcmp (argv[i], "-sort") == 0) - sort_option = 1; - else if (strcmp (argv[i], "-glob") == 0) - glob_option = 1; - else - break; - } + mu_cli_simple (argc, argv, + MU_CLI_OPTION_SINGLE_DASH, + MU_CLI_OPTION_IN_ORDER, + MU_CLI_OPTION_OPTIONS, options, + MU_CLI_OPTION_CAPABILITIES, capa, + MU_CLI_OPTION_RETURN_ARGC, &argc, + MU_CLI_OPTION_RETURN_ARGV, &argv, + MU_CLI_OPTION_PROG_DOC, "Test file system folder traversal", + MU_CLI_OPTION_PROG_ARGS, "[OP ARG... [\\; OP ARG...]...]", + MU_CLI_OPTION_END); + if (!fname) { - mu_error ("name not specified"); + mu_error ("-name not specified; try %s -help for more info", + mu_program_name); exit (1); } @@ -376,7 +370,7 @@ main (int argc, char **argv) if (glob_option) mu_folder_set_match (folder, mu_folder_glob_match); - mu_tesh_read_and_eval (argc - i, argv + i, comtab, folder); + mu_tesh_read_and_eval (argc, argv, comtab, folder); mu_folder_close (folder); mu_folder_destroy (&folder); diff --git a/libmailutils/tests/globtest.c b/libmailutils/tests/globtest.c index a95505754..d44e4cdd9 100644 --- a/libmailutils/tests/globtest.c +++ b/libmailutils/tests/globtest.c @@ -26,37 +26,42 @@ main (int argc, char **argv) int flags = 0; int rc; int i; - + int sub_opt = 0, icase_opt = 0, collapse_opt = 0; + struct mu_option options[] = { + { "icase", 'i', NULL, MU_OPTION_DEFAULT, + "ignore case", mu_c_incr, &icase_opt }, + { "sub", 's', NULL, MU_OPTION_DEFAULT, + "treat each wildcard as regexp parenthesized group", + mu_c_incr, &sub_opt }, + { "collapse", 'c', NULL, MU_OPTION_DEFAULT, + "collapse contiguous runs of *", mu_c_incr, &collapse_opt }, + MU_OPTION_END + }; + mu_set_program_name (argv[0]); - for (i = 1; i < argc; i++) - { - char *a = argv[i]; - if (strcmp (a, "-i") == 0) - flags |= MU_GLOBF_ICASE; - else if (strcmp (a, "-s") == 0) - flags |= MU_GLOBF_SUB; - else if (strcmp (a, "-c") == 0) - flags |= MU_GLOBF_COLLAPSE; - else if (strcmp (a, "--") == 0) - { - i++; - break; - } - else if (*a != '-') - break; - else - { - mu_error ("unknown option %s", a); - return 1; - } - } + mu_cli_simple (argc, argv, + MU_CLI_OPTION_OPTIONS, options, + MU_CLI_OPTION_PROG_DOC, "convert globbing pattern to regexp", + MU_CLI_OPTION_PROG_ARGS, "PATTERN [STRING ...]", + MU_CLI_OPTION_RETURN_ARGC, &argc, + MU_CLI_OPTION_RETURN_ARGV, &argv, + MU_CLI_OPTION_END); + + if (icase_opt) + flags |= MU_GLOBF_ICASE; + if (sub_opt) + flags |= MU_GLOBF_SUB; + if (collapse_opt) + flags |= MU_GLOBF_COLLAPSE; - if (i == argc) + if (argc == 0) { - mu_printf ("usage: %s [-ics] PATTERN [WORD...]\n", mu_program_name); + mu_error ("pattern must be given; try %s --help for details", + mu_program_name); return 1; } + i = 0; pattern = argv[i++]; if (i == argc) diff --git a/libmailutils/tests/imapio.at b/libmailutils/tests/imapio.at index 779d33351..3a0ea9016 100644 --- a/libmailutils/tests/imapio.at +++ b/libmailutils/tests/imapio.at @@ -93,7 +93,7 @@ fat man 3: 'fat man' ]) -m4_pushdef([IMAPIO_FLAGS],[-server]) +m4_pushdef([IMAPIO_FLAGS],[--server]) IMAPIO([literals (server)],[literal], [A001 LOGIN {11} FRED FOOBAR {7} diff --git a/libmailutils/tests/imapio.c b/libmailutils/tests/imapio.c index bcccc95d7..4746f4a17 100644 --- a/libmailutils/tests/imapio.c +++ b/libmailutils/tests/imapio.c @@ -25,14 +25,7 @@ #include <mailutils/error.h> #include <mailutils/stream.h> #include <mailutils/stdstream.h> - -void -usage () -{ - mu_stream_printf (mu_strout, "usage: %s [debug=SPEC] [-transcript] [-server]\n", - mu_program_name); - exit (0); -} +#include <mailutils/cli.h> int main (int argc, char **argv) @@ -41,31 +34,32 @@ main (int argc, char **argv) int transcript = 0; mu_imapio_t io; mu_stream_t str; - int imapio_mode = MU_IMAPIO_CLIENT; + int imapio_mode; + int server_opt = 0; + struct mu_option options[] = { + { "transcript", 't', NULL, MU_OPTION_DEFAULT, + "enable transcript", mu_c_incr, &transcript }, + { "server", 's', NULL, MU_OPTION_DEFAULT, + "server mode", mu_c_incr, &server_opt }, + MU_OPTION_END + }; + char *capa[] = { "debug", NULL }; + mu_stream_t dstr; + int t = 1; - mu_stdstream_setup (MU_STDSTREAM_RESET_NONE); - - for (i = 1; i < argc; i++) - { - char *opt = argv[i]; + /* Create a separate diagnostic stream, independent from mu_strerr */ + MU_ASSERT (mu_stdio_stream_create (&dstr, MU_STDERR_FD, 0)); + mu_stream_ioctl (dstr, MU_IOCTL_FD, MU_IOCTL_FD_SET_BORROW, &t); - if (strncmp (opt, "debug=", 6) == 0) - mu_debug_parse_spec (opt + 6); - else if (strcmp (opt, "-transcript") == 0) - transcript = 1; - else if (strcmp (opt, "-server") == 0) - imapio_mode = MU_IMAPIO_SERVER; - else if (strcmp (opt, "-h") == 0) - usage (); - else - { - mu_error ("%s: unrecognized argument", opt); - exit (1); - } - } + mu_cli_simple (argc, argv, + MU_CLI_OPTION_OPTIONS, options, + MU_CLI_OPTION_CAPABILITIES, capa, + MU_CLI_OPTION_PROG_DOC, "imap parser test tool", + MU_CLI_OPTION_END); - MU_ASSERT (mu_iostream_create (&str, mu_strin, mu_strout)); + imapio_mode = server_opt ? MU_IMAPIO_SERVER : MU_IMAPIO_CLIENT; + MU_ASSERT (mu_iostream_create (&str, mu_strin, mu_strout)); MU_ASSERT (mu_imapio_create (&io, str, imapio_mode)); @@ -82,10 +76,10 @@ main (int argc, char **argv) if (wc == 0) break; - mu_stream_printf (mu_strerr, "%lu\n", (unsigned long) wc); + mu_stream_printf (dstr, "%lu\n", (unsigned long) wc); for (i = 0; i < wc; i++) { - mu_stream_printf (mu_strerr, "%d: '%s'\n", i, wv[i]); + mu_stream_printf (dstr, "%d: '%s'\n", i, wv[i]); } } diff --git a/libmailutils/tests/mailcap.c b/libmailutils/tests/mailcap.c index 17e95ce8d..229b91a3e 100644 --- a/libmailutils/tests/mailcap.c +++ b/libmailutils/tests/mailcap.c @@ -31,6 +31,13 @@ static void list_single_entry (mu_mailcap_entry_t ent); static int list_field (char const *name, char const *value, void *data); static int list_entry (mu_mailcap_entry_t ent, void *closure); +static void +cli_locus (struct mu_parseopt *po, struct mu_option *opt, char const *arg) +{ + int *pflag = opt->opt_ptr; + *pflag |= MU_MAILCAP_FLAG_LOCUS; +} + /* usage: mailcap [-f FILE] List entries @@ -46,39 +53,29 @@ main (int argc, char **argv) int flags = MU_MAILCAP_FLAG_DEFAULT; mu_mailcap_t mailcap; char *file = NULL; - char *arg; - - mu_stdstream_setup (MU_STDSTREAM_RESET_NONE); - - while (--argc && (arg = *++argv)[0] == '-') - { - if (strcmp (arg, "--") == 0) - { - argc--; - argv++; - break; - } - else if (strncmp (arg, "-f", 2) == 0) - { - if (arg[2]) - file = arg + 2; - else if (--argc) - file = *++argv; - else - { - mu_error ("-f requires arguments"); - return 1; - } - } - else if (strcmp (arg, "-l") == 0) - flags |= MU_MAILCAP_FLAG_LOCUS; - else - { - mu_error ("unrecognized option: %s", arg); - return 1; - } - } + struct mu_option options[] = { + { "file", 'f', "NAME", MU_OPTION_DEFAULT, + "mailcap file name", mu_c_string, &file }, + { "locus", 'l', NULL, MU_OPTION_DEFAULT, + "record location of each entry in the source file", + mu_c_incr, &flags, cli_locus }, + MU_OPTION_END + }; + + mu_set_program_name (argv[0]); + mu_cli_simple (argc, argv, + MU_CLI_OPTION_OPTIONS, options, + MU_CLI_OPTION_PROG_DOC, + "mailcap test: without arguments lists all mailcap entries, " + "with single argument, prints the first entry matching TYPE, " + "with two arguments prints FIELD from the first entry " + "matching TYPE.", + MU_CLI_OPTION_PROG_ARGS, "[TYPE [FIELD]]", + MU_CLI_OPTION_RETURN_ARGC, &argc, + MU_CLI_OPTION_RETURN_ARGV, &argv, + MU_CLI_OPTION_END); + MU_ASSERT (mu_mailcap_create (&mailcap)); mu_mailcap_set_error (mailcap, &mu_mailcap_default_error_closure); if (flags != MU_MAILCAP_FLAG_DEFAULT) diff --git a/libmailutils/tests/mcf.c b/libmailutils/tests/mcf.c index e2085f9f5..406dda381 100644 --- a/libmailutils/tests/mcf.c +++ b/libmailutils/tests/mcf.c @@ -39,6 +39,13 @@ selector (mu_mailcap_entry_t entry, void *data) static void list_entry (mu_mailcap_entry_t ent, unsigned long n); +static void +cli_locus (struct mu_parseopt *po, struct mu_option *opt, char const *arg) +{ + int *pflag = opt->opt_ptr; + *pflag |= MU_MAILCAP_FLAG_LOCUS; +} + int main (int argc, char **argv) { @@ -49,31 +56,29 @@ main (int argc, char **argv) mu_mailcap_entry_t entry; size_t n; int flags = MU_MAILCAP_FLAG_DEFAULT; - char *arg; - - mu_stdstream_setup (MU_STDSTREAM_RESET_NONE); - - while (--argc && (arg = *++argv)[0] == '-') - { - if (strcmp (arg, "--") == 0) - { - argc--; - argv++; - break; - } - else if (strcmp (arg, "-l") == 0) - flags |= MU_MAILCAP_FLAG_LOCUS; - else - { - mu_error ("unrecognized option: %s", arg); - usage (mu_strerr); - return 1; - } - } + struct mu_option options[] = { + { "locus", 'l', NULL, MU_OPTION_DEFAULT, + "record location of each entry in the source file", + mu_c_incr, &flags, cli_locus }, + MU_OPTION_END + }; + + mu_set_program_name (argv[0]); + mu_cli_simple (argc, argv, + MU_CLI_OPTION_OPTIONS, options, + MU_CLI_OPTION_PROG_DOC, + "extracts entries matching TYPE/SUBTYPE from the " + "given mailcap FILEs", + MU_CLI_OPTION_PROG_ARGS, "TYPE/SUBTYPE FILE...", + MU_CLI_OPTION_RETURN_ARGC, &argc, + MU_CLI_OPTION_RETURN_ARGV, &argv, + MU_CLI_OPTION_END); + if (argc < 2) { - usage (mu_strerr); + mu_error ("required arguments missing; try %s --help for assistance", + mu_program_name); return 1; } type = argv[0]; diff --git a/libmailutils/tests/modmesg.c b/libmailutils/tests/modmesg.c index f6dd28006..a7adc6793 100644 --- a/libmailutils/tests/modmesg.c +++ b/libmailutils/tests/modmesg.c @@ -23,16 +23,84 @@ This is a test message.\n\ oo\n\ "; +static void +cli_a (struct mu_parseopt *po, struct mu_option *opt, char const *arg) +{ + mu_header_t *hdr = opt->opt_ptr; + char *p; + + p = strchr (arg, ':'); + if (!p) + { + mu_parseopt_error (po, "%s: invalid append header format", arg); + exit (po->po_exit_error); + } + + *p++ = 0; + while (*p && mu_isspace (*p)) + p++; + MU_ASSERT (mu_header_set_value (*hdr, arg, p, 1)); +} + +static void +cli_t (struct mu_parseopt *po, struct mu_option *opt, char const *arg) +{ + mu_stream_t *stream = opt->opt_ptr; + mu_wordsplit_t ws; + + if (mu_wordsplit (arg, &ws, + MU_WRDSF_NOSPLIT | MU_WRDSF_DEFFLAGS)) + { + mu_parseopt_error (po, "mu_wordsplit: %s", mu_wordsplit_strerror (&ws)); + exit (po->po_exit_error); + } + else + MU_ASSERT (mu_stream_write (*stream, ws.ws_wordv[0], + strlen (ws.ws_wordv[0]), NULL)); + mu_wordsplit_free (&ws); +} + +static void +cli_l (struct mu_parseopt *po, struct mu_option *opt, char const *arg) +{ + mu_stream_t *stream = opt->opt_ptr; + mu_off_t off; + int whence = MU_SEEK_SET; + char *p; + + errno = 0; + off = strtol (arg, &p, 10); + if (errno || *p) + { + mu_parseopt_error (po, "%s: invalid offset", arg); + exit (po->po_exit_error); + } + + if (off < 0) + whence = MU_SEEK_END; + MU_ASSERT (mu_stream_seek (*stream, off, whence, NULL)); +} + int main (int argc, char **argv) { - int i; - char *p; mu_message_t msg; mu_stream_t stream = NULL; mu_header_t hdr; mu_body_t body; - + + struct mu_option options[] = { + { "add-header", 'a', "HDR:VAL", MU_OPTION_DEFAULT, + "add header to the message", mu_c_string, &hdr, cli_a }, + { "seek", 'l', "OFF", MU_OPTION_DEFAULT, + "seek to the given position in message stream", mu_c_string, &stream, + cli_l }, + { "text", 't', "TEXT", MU_OPTION_DEFAULT, + "write given text to the message stream in current position", + mu_c_string, &stream, cli_t }, + MU_OPTION_END + }; + mu_set_program_name (argv[0]); mu_static_memory_stream_create (&stream, text, strlen (text)); @@ -42,59 +110,13 @@ main (int argc, char **argv) MU_ASSERT (mu_message_get_body (msg, &body)); MU_ASSERT (mu_body_get_streamref (body, &stream)); MU_ASSERT (mu_stream_seek (stream, 0, MU_SEEK_END, NULL)); - - for (i = 1; i < argc; i++) - { - if (strcmp (argv[i], "-h") == 0) - { - mu_printf ("usage: %s [-a HDR:VAL] [-t TEXT]\n", mu_program_name); - return 0; - } - - if (strcmp (argv[i], "-a") == 0) - { - i++; - assert (argv[i] != NULL); - p = strchr (argv[i], ':'); - assert (p != NULL); - *p++ = 0; - while (*p && mu_isspace (*p)) - p++; - MU_ASSERT (mu_header_set_value (hdr, argv[i], p, 1)); - } - else if (strcmp (argv[i], "-l") == 0) - { - mu_off_t off; - int whence = MU_SEEK_SET; - - i++; - assert (argv[i] != NULL); - off = strtol (argv[i], &p, 10); - assert (*p == 0); - if (off < 0) - whence = MU_SEEK_END; - MU_ASSERT (mu_stream_seek (stream, off, whence, NULL)); - } - else if (strcmp (argv[i], "-t") == 0) - { - mu_wordsplit_t ws; - i++; - assert (argv[i] != NULL); - - if (mu_wordsplit (argv[i], &ws, - MU_WRDSF_NOSPLIT | MU_WRDSF_DEFFLAGS)) - { - mu_error ("mu_wordsplit: %s", mu_wordsplit_strerror (&ws)); - exit (1); - } - else - MU_ASSERT (mu_stream_write (stream, ws.ws_wordv[0], - strlen (ws.ws_wordv[0]), NULL)); - mu_wordsplit_free (&ws); - } - else - mu_error ("ignoring unknown argument %s", argv[i]); - } + + //parse arguments + mu_cli_simple (argc, argv, + MU_CLI_OPTION_OPTIONS, options, + MU_CLI_OPTION_PROG_DOC, "test message modifications", + MU_CLI_OPTION_END); + mu_stream_unref (stream); MU_ASSERT (mu_message_get_streamref (msg, &stream)); diff --git a/libmailutils/tests/msgset.c b/libmailutils/tests/msgset.c index ea4469fde..6c519f8a8 100644 --- a/libmailutils/tests/msgset.c +++ b/libmailutils/tests/msgset.c @@ -21,7 +21,7 @@ mu_msgset_format_t format = mu_msgset_fmt_imap; static void -parse_msgrange (char *arg, struct mu_msgrange *range) +parse_msgrange (char const *arg, struct mu_msgrange *range) { size_t msgnum; char *p; @@ -98,88 +98,125 @@ print_last (mu_msgset_t msgset) printf ("%zu\n", n); } -int -main (int argc, char **argv) +static void +cli_msgset (struct mu_parseopt *po, struct mu_option *opt, char const *arg) { - int i; - char *msgset_string = NULL; - mu_msgset_t msgset; - void (*print) (mu_msgset_t) = print_all; - - mu_set_program_name (argv[0]); - for (i = 1; i < argc; i++) + mu_msgset_t *msgset = opt->opt_ptr; + if (*msgset) { - char *arg = argv[i]; + mu_parseopt_error (po, "message set already defined"); + exit (po->po_exit_error); + } + *msgset = parse_msgset (arg); +} - if (strcmp (arg, "-h") == 0 || strcmp (arg, "-help") == 0) - { - mu_printf ("usage: %s [-mh] [-msgset=SET] [-add=X[:Y]] [-del=X[:Y]] " - "[-addset=SET] [-delset=SET] [-first] [-last] ...\n", - mu_program_name); - return 0; - } - else if (strncmp (arg, "-msgset=", 8) == 0) - msgset_string = arg + 8; - else if (strcmp (arg, "-mh") == 0) - format = mu_msgset_fmt_mh; - else - break; +static void +cli_mh (struct mu_parseopt *po, struct mu_option *opt, char const *arg) +{ + format = mu_msgset_fmt_mh; +} + +static mu_msgset_t +get_msgset (struct mu_option *opt) +{ + mu_msgset_t *msgset = opt->opt_ptr; + if (!*msgset) + { + *msgset = parse_msgset (NULL); } + return *msgset; +} + +static void +cli_add (struct mu_parseopt *po, struct mu_option *opt, char const *arg) +{ + struct mu_msgrange range; + parse_msgrange (arg, &range); + MU_ASSERT (mu_msgset_add_range (get_msgset (opt), range.msg_beg, + range.msg_end, MU_MSGSET_NUM)); +} + +static void +cli_sub (struct mu_parseopt *po, struct mu_option *opt, char const *arg) +{ + struct mu_msgrange range; + parse_msgrange (arg, &range); + MU_ASSERT (mu_msgset_sub_range (get_msgset (opt), range.msg_beg, + range.msg_end, MU_MSGSET_NUM)); +} + +static void +cli_addset (struct mu_parseopt *po, struct mu_option *opt, char const *arg) +{ + mu_msgset_t tset = parse_msgset (arg); + MU_ASSERT (mu_msgset_add (get_msgset (opt), tset)); + mu_msgset_free (tset); +} + +static void +cli_subset (struct mu_parseopt *po, struct mu_option *opt, char const *arg) +{ + mu_msgset_t tset = parse_msgset (arg); + MU_ASSERT (mu_msgset_sub (get_msgset (opt), tset)); + mu_msgset_free (tset); +} - msgset = parse_msgset (msgset_string); +static void +cli_first (struct mu_parseopt *po, struct mu_option *opt, char const *arg) +{ + void (**print) (mu_msgset_t) = opt->opt_ptr; + *print = print_first; +} + +static void |