summaryrefslogtreecommitdiff
path: root/libmailutils/tests/mcf.c
diff options
context:
space:
mode:
Diffstat (limited to 'libmailutils/tests/mcf.c')
-rw-r--r--libmailutils/tests/mcf.c148
1 files changed, 148 insertions, 0 deletions
diff --git a/libmailutils/tests/mcf.c b/libmailutils/tests/mcf.c
new file mode 100644
index 000000000..ba240d7ad
--- /dev/null
+++ b/libmailutils/tests/mcf.c
@@ -0,0 +1,148 @@
+/* GNU Mailutils -- a suite of utilities for electronic mail
+ Copyright (C) 1999-2019 Free Software Foundation, Inc.
+
+ GNU Mailutils is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3, or (at your option)
+ any later version.
+
+ GNU Mailutils is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNU Mailutils. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <stdlib.h>
+#include <stdio.h>
+#include <mailutils/mailutils.h>
+
+void
+usage (mu_stream_t str)
+{
+ mu_stream_printf (str, "usage: mcf [-l] TYPE/SUBTYPE FILE [FILE...]\n");
+}
+
+int
+selector (mu_mailcap_entry_t entry, void *data)
+{
+ char const *type = data;
+ char const *pattern;
+
+ MU_ASSERT (mu_mailcap_entry_sget_type (entry, &pattern));
+ return mu_mailcap_string_match (pattern, 0, type);
+}
+
+static void list_entry (mu_mailcap_entry_t ent, unsigned long n);
+
+int
+main (int argc, char **argv)
+{
+ struct mu_mailcap_selector_closure selcl;
+ char *type;
+ int rc;
+ mu_mailcap_finder_t finder;
+ 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;
+ }
+ }
+
+ if (argc < 2)
+ {
+ usage (mu_strerr);
+ return 1;
+ }
+ type = argv[0];
+ mu_printf ("%s\n", type);
+
+ memset (&selcl, 0, sizeof (selcl));
+ selcl.selector = selector;
+ selcl.data = type;
+
+ MU_ASSERT (mu_mailcap_finder_create (&finder, flags,
+ &selcl,
+ &mu_mailcap_default_error_closure,
+ argv + 1));
+
+ n = 1;
+ while ((rc = mu_mailcap_finder_next_match (finder, &entry)) == 0)
+ {
+ list_entry (entry, n++);
+ }
+ mu_mailcap_finder_destroy (&finder);
+
+ if (rc != MU_ERR_NOENT)
+ {
+ mu_diag_funcall (MU_DIAG_ERR,
+ "mu_mailcap_finder_next_match",
+ NULL,
+ rc);
+ }
+
+ return 0;
+}
+
+struct list_closure
+{
+ unsigned long n;
+};
+
+static int
+list_field (char const *name, char const *value, void *data)
+{
+ struct list_closure *fc = data;
+ mu_printf ("\tfields[%lu]: ", fc->n++);
+ if (value)
+ mu_printf ("%s=%s", name, value);
+ else
+ mu_printf ("%s", name);
+ mu_printf ("\n");
+ return 0;
+}
+
+static void
+list_entry (mu_mailcap_entry_t ent, unsigned long n)
+{
+ struct mu_locus_range lr = MU_LOCUS_RANGE_INITIALIZER;
+ char const *val;
+ struct list_closure fc;
+
+ if (mu_mailcap_entry_get_locus (ent, &lr) == 0)
+ {
+ mu_stream_lprintf (mu_strout, &lr, "entry[%lu]\n", n);
+ mu_locus_range_deinit (&lr);
+ }
+ else
+ mu_printf ("entry[%lu]\n", n);
+ MU_ASSERT (mu_mailcap_entry_sget_type (ent, &val));
+ mu_printf ("\ttypefield: %s\n", val);
+ MU_ASSERT (mu_mailcap_entry_sget_command (ent, &val));
+ mu_printf ("\tview-command: %s\n", val);
+ fc.n = 1;
+ mu_mailcap_entry_fields_foreach (ent, list_field, &fc);
+ mu_printf ("\n");
+}

Return to:

Send suggestions and report system problems to the System administrator.