summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2019-03-25 14:35:06 +0200
committerSergey Poznyakoff <gray@gnu.org>2019-03-25 16:16:08 +0200
commitcef8dafaf17b67c1b4836e22ef00c54f38237fe6 (patch)
tree8b4a134c60934f92021a0851d4aa314046a7e69b
parent1a523cb6c788fc46b234019f4198b865c4b5f502 (diff)
downloadmailutils-cef8dafaf17b67c1b4836e22ef00c54f38237fe6.tar.gz
mailutils-cef8dafaf17b67c1b4836e22ef00c54f38237fe6.tar.bz2
Implement test shell framework
* libmailutils/tests/tesh.c: New file. * libmailutils/tests/tesh.h: New file. * libmailutils/tests/Makefile.am: Add new files. * libmailutils/tests/fsfolder.c: Rewrite using test shell framework. * libmailutils/tests/fsfolder00.at: Use semicolons to delimit commands. * libmailutils/tests/fsfolder01.at: Likewise. * libmailutils/tests/linetrack.c: Rewrite using test shell framework. * libmailutils/tests/linetrack.at: Change command initial character to dot. * libmailutils/tests/listop.c: Rewrite using test shell framework. * libmailutils/tests/list.at: Minor changes. * libproto/dotmail/tests/dm_mesg.c: Rewrite using test shell framework. * libproto/dotmail/tests/Makefile.am: Link dm_mesg with libmu_tesh * libproto/dotmail/dotmail.c: Fix typo.
-rw-r--r--libmailutils/tests/Makefile.am10
-rw-r--r--libmailutils/tests/fsfolder.c128
-rw-r--r--libmailutils/tests/fsfolder00.at6
-rw-r--r--libmailutils/tests/fsfolder01.at2
-rw-r--r--libmailutils/tests/linetrack.at56
-rw-r--r--libmailutils/tests/linetrack.c144
-rw-r--r--libmailutils/tests/list.at6
-rw-r--r--libmailutils/tests/listop.c669
-rw-r--r--libmailutils/tests/tesh.c385
-rw-r--r--libmailutils/tests/tesh.h176
-rw-r--r--libproto/dotmail/dotmail.c2
-rw-r--r--libproto/dotmail/tests/Makefile.am2
-rw-r--r--libproto/dotmail/tests/dm_mesg.c396
13 files changed, 1204 insertions, 778 deletions
diff --git a/libmailutils/tests/Makefile.am b/libmailutils/tests/Makefile.am
index b0f3b9295..ef95577f9 100644
--- a/libmailutils/tests/Makefile.am
+++ b/libmailutils/tests/Makefile.am
@@ -39,6 +39,10 @@ $(srcdir)/package.m4: $(top_srcdir)/configure.ac
## -------------------------- ##
AM_CPPFLAGS = @MU_LIB_COMMON_INCLUDES@
+
+noinst_LTLIBRARIES = libmu_tesh.la
+libmu_tesh_la_SOURCES = tesh.c tesh.h
+
noinst_PROGRAMS = \
addr\
cidr\
@@ -83,6 +87,12 @@ noinst_PROGRAMS = \
wsp\
xscript
+fsfolder_LDFLAGS = -lmu_tesh $(LDADD)
+
+linetrack_LDFLAGS = -lmu_tesh $(LDADD)
+
+listop_LDFLAGS = -lmu_tesh $(LDADD)
+
LDADD = ${MU_LIB_MAILUTILS}
EXTRA_DIST += Encode Decode Wicketfile
diff --git a/libmailutils/tests/fsfolder.c b/libmailutils/tests/fsfolder.c
index f6f62d7b4..789569d9a 100644
--- a/libmailutils/tests/fsfolder.c
+++ b/libmailutils/tests/fsfolder.c
@@ -31,18 +31,12 @@
#include <mailutils/registrar.h>
#include <mailutils/sys/folder.h>
#include <mailutils/sys/registrar.h>
+#include <mailutils/opt.h>
+#include "tesh.h"
int sort_option;
int prefix_len;
-struct command
-{
- char *verb;
- int nargs;
- char *args;
- void (*handler) (mu_folder_t folder, char **argv);
-};
-
static int
compare_response (void const *a, void const *b)
{
@@ -70,16 +64,17 @@ _print_list_entry (void *item, void *data)
return 0;
}
-static void
-com_list (mu_folder_t folder, char **argv)
+static int
+com_list (int argc, char **argv, mu_assoc_t options, void *env)
{
+ mu_folder_t folder = env;
int rc;
mu_list_t list;
- mu_printf ("listing '%s' '%s'\n", argv[0], argv[1]);
- rc = mu_folder_list (folder, argv[0], argv[1], 0, &list);
+ mu_printf ("listing '%s' '%s'\n", argv[1], argv[2]);
+ rc = mu_folder_list (folder, argv[1], argv[2], 0, &list);
if (rc)
- mu_diag_funcall (MU_DIAG_ERROR, "mu_folder_list", argv[0], rc);
+ mu_diag_funcall (MU_DIAG_ERROR, "mu_folder_list", argv[1], rc);
else
{
if (sort_option)
@@ -87,18 +82,20 @@ com_list (mu_folder_t folder, char **argv)
mu_list_foreach (list, _print_list_entry, &prefix_len);
mu_list_destroy (&list);
}
+ return 0;
}
-static void
-com_lsub (mu_folder_t folder, char **argv)
+static int
+com_lsub (int argc, char **argv, mu_assoc_t options, void *env)
{
+ mu_folder_t folder = env;
int rc;
mu_list_t list;
- mu_printf ("listing subscriptions for '%s' '%s'\n", argv[0], argv[1]);
- rc = mu_folder_lsub (folder, argv[0], argv[1], &list);
+ mu_printf ("listing subscriptions for '%s' '%s'\n", argv[1], argv[2]);
+ rc = mu_folder_lsub (folder, argv[1], argv[2], &list);
if (rc)
- mu_diag_funcall (MU_DIAG_ERROR, "mu_folder_lsub", argv[0], rc);
+ mu_diag_funcall (MU_DIAG_ERROR, "mu_folder_lsub", argv[1], rc);
else
{
if (sort_option)
@@ -106,78 +103,71 @@ com_lsub (mu_folder_t folder, char **argv)
mu_list_foreach (list, _print_list_entry, NULL);
mu_list_destroy (&list);
}
+ return 0;
}
-static void
-com_rename (mu_folder_t folder, char **argv)
+static int
+com_rename (int argc, char **argv, mu_assoc_t options, void *env)
{
int rc;
+ mu_folder_t folder = env;
- mu_printf ("renaming %s to %s\n", argv[0], argv[1]);
- rc = mu_folder_rename (folder, argv[0], argv[1]);
+ mu_printf ("renaming %s to %s\n", argv[1], argv[2]);
+ rc = mu_folder_rename (folder, argv[1], argv[2]);
if (rc)
- mu_diag_funcall (MU_DIAG_ERROR, "mu_folder_rename", argv[0], rc);
+ mu_diag_funcall (MU_DIAG_ERROR, "mu_folder_rename", argv[1], rc);
else
mu_printf ("rename successful\n");
+ return 0;
}
-static void
-com_subscribe (mu_folder_t folder, char **argv)
+static int
+com_subscribe (int argc, char **argv, mu_assoc_t options, void *env)
{
+ mu_folder_t folder = env;
int rc;
- mu_printf ("subscribing %s\n", argv[0]);
- rc = mu_folder_subscribe (folder, argv[0]);
+ mu_printf ("subscribing %s\n", argv[1]);
+ rc = mu_folder_subscribe (folder, argv[1]);
if (rc)
- mu_diag_funcall (MU_DIAG_ERROR, "mu_folder_subscribe", argv[0], rc);
+ mu_diag_funcall (MU_DIAG_ERROR, "mu_folder_subscribe", argv[1], rc);
else
mu_printf ("subscribe successful\n");
+ return 0;
}
-static void
-com_unsubscribe (mu_folder_t folder, char **argv)
+static int
+com_unsubscribe (int argc, char **argv, mu_assoc_t options, void *env)
{
+ mu_folder_t folder = env;
int rc;
- mu_printf ("unsubscribing %s\n", argv[0]);
- rc = mu_folder_unsubscribe (folder, argv[0]);
+ mu_printf ("unsubscribing %s\n", argv[1]);
+ rc = mu_folder_unsubscribe (folder, argv[1]);
if (rc)
- mu_diag_funcall (MU_DIAG_ERROR, "mu_folder_unsubscribe", argv[0], rc);
+ mu_diag_funcall (MU_DIAG_ERROR, "mu_folder_unsubscribe", argv[1], rc);
else
mu_printf ("unsubscribe successful\n");
+ return 0;
}
-static struct command comtab[] = {
- { "list", 2, "REF MBX", com_list },
- { "lsub", 2, "REF MBX", com_lsub },
- { "rename", 2, "OLD NEW", com_rename },
- { "subscribe", 1, "MBX", com_subscribe },
- { "unsubscribe", 1, "MBX", com_unsubscribe },
+static struct mu_tesh_command comtab[] = {
+ { "list", "REF MBX", com_list },
+ { "lsub", "REF MBX", com_lsub },
+ { "rename", "OLD NEW", com_rename },
+ { "subscribe", "MBX", com_subscribe },
+ { "unsubscribe", "MBX", com_unsubscribe },
{ NULL }
};
-static struct command *
-find_command (const char *name)
-{
- struct command *cp;
-
- for (cp = comtab; cp->verb; cp++)
- if (strcmp (cp->verb, name) == 0)
- return cp;
- return NULL;
-}
-
static void
-usage ()
+usage (void)
{
- struct command *cp;
-
mu_printf (
- "usage: %s [-debug=SPEC] -name=URL [-sort] [-glob] OP ARG [ARG...] [OP ARG [ARG...]...]\n",
+ "usage: %s [-debug=SPEC] -name=URL [-sort] [-glob] OP ARG... [\\; OP ARG...]...]\n",
mu_program_name);
mu_printf ("OPerations and corresponding ARGuments are:\n");
- for (cp = comtab; cp->verb; cp++)
- mu_printf (" %s %s\n", cp->verb, cp->args);
+ mu_tesh_help (comtab, NULL);
}
static int
@@ -237,7 +227,7 @@ main (int argc, char **argv)
char *fname = NULL;
int glob_option = 0;
- mu_set_program_name (argv[0]);
+ mu_tesh_init (argv[0]);
mu_registrar_record (&test_record);
if (argc == 1)
@@ -292,29 +282,7 @@ main (int argc, char **argv)
if (glob_option)
mu_folder_set_match (folder, mu_folder_glob_match);
- while (i < argc)
- {
- char *comargs[2];
- struct command *cmd;
-
- cmd = find_command (argv[i]);
- if (!cmd)
- {
- mu_error ("unknown command %s\n", argv[i]);
- break;
- }
-
- i++;
- if (i + cmd->nargs > argc)
- {
- mu_error ("not enough arguments for %s", cmd->verb);
- break;
- }
- memcpy (comargs, argv + i, cmd->nargs * sizeof (comargs[0]));
- i += cmd->nargs;
-
- cmd->handler (folder, comargs);
- }
+ mu_tesh_read_and_eval (argc - i, argv + i, comtab, folder);
mu_folder_close (folder);
mu_folder_destroy (&folder);
diff --git a/libmailutils/tests/fsfolder00.at b/libmailutils/tests/fsfolder00.at
index ed5f1f368..a179441b6 100644
--- a/libmailutils/tests/fsfolder00.at
+++ b/libmailutils/tests/fsfolder00.at
@@ -27,9 +27,9 @@ mkdir dir/subdir
> dir/subdir/baz.mbox
fsfolder -name=dir -sort dnl
- list "" "*" dnl
- list subdir "*" dnl
- list "" "*.mbox" dnl
+ list "" "*" \; dnl
+ list subdir "*" \; dnl
+ list "" "*.mbox" \; dnl
list "subdir" "*.mbox"
],
[0],
diff --git a/libmailutils/tests/fsfolder01.at b/libmailutils/tests/fsfolder01.at
index 577f3b4f7..da17c4592 100644
--- a/libmailutils/tests/fsfolder01.at
+++ b/libmailutils/tests/fsfolder01.at
@@ -22,7 +22,7 @@ mkdir dir
fsfolder -name=dir -sort lsub "" "*"
fsfolder -name=dir subscribe foo
fsfolder -name=dir -sort lsub "" "*"
-fsfolder -name=dir subscribe baz subscribe foo/baz subscribe foo/bar
+fsfolder -name=dir subscribe baz \; subscribe foo/baz \; subscribe foo/bar
fsfolder -name=dir -sort lsub "" "*"
fsfolder -name=dir -sort lsub foo "*"
fsfolder -name=dir -sort lsub "" 'foo*'
diff --git a/libmailutils/tests/linetrack.at b/libmailutils/tests/linetrack.at
index 39961382d..4a4cea39a 100644
--- a/libmailutils/tests/linetrack.at
+++ b/libmailutils/tests/linetrack.at
@@ -54,11 +54,11 @@ liber:4.15-18: Naso
TRACKTEST([retreat],[],[3],
[
agnosco
-#retreat 4
+.retreat 4
veteris
vestigia\n
flamme
-#retreat 8
+.retreat 8
Publius
],
[liber:1.1-7: agnosco
@@ -73,7 +73,7 @@ TRACKTEST([retreat over several lines],[],[4],
one\n
two\n
three
-#retreat 11
+.retreat 11
four
],
[liber:1.1-3: one\n
@@ -85,7 +85,7 @@ liber:1.3-6: four
TRACKTEST([retreat to the beginning],[],[4],
[one\n
two\n
-#retreat 8
+.retreat 8
three
],
[liber:1.1-3: one\n
@@ -96,7 +96,7 @@ liber:1.1-5: three
TRACKTEST([too big retreat],[],[2],
[one\n
two\n
-#retreat 10
+.retreat 10
three
],
[liber:1.1-3: one\n
@@ -110,14 +110,14 @@ TRACKTEST([origin 1],[],[10],
[one\n
two\n
three\n
-#origin B 5 0
+.origin B 5 0
four\n
five\n
-#origin C 2 0
+.origin C 2 0
six\n
seven\n
eight\n
-#stat
+.stat
],
[liber:1.1-3: one\n
liber:2.1-3: two\n
@@ -136,14 +136,14 @@ TRACKTEST([origin 2],[],[8],
[one\n
two\n
three\n
-#origin B 5 0
+.origin B 5 0
four\n
five\n
-#origin C 2 0
+.origin C 2 0
six\n
seven\n
eight\n
-#stat
+.stat
],
[liber:1.1-3: one\n
liber:2.1-3: two\n
@@ -162,14 +162,14 @@ TRACKTEST([origin 3],[],[7],
[one\n
two\n
three\n
-#origin B 5 0
+.origin B 5 0
four\n
five\n
-#origin C 2 0
+.origin C 2 0
six\n
seven\n
eight\n
-#stat
+.stat
],
[liber:1.1-3: one\n
liber:2.1-3: two\n
@@ -188,14 +188,14 @@ TRACKTEST([origin 4],[],[6],
[one\n
two\n
three\n
-#origin B 5 0
+.origin B 5 0
four\n
five\n
-#origin C 2 0
+.origin C 2 0
six\n
seven\n
eight\n
-#stat
+.stat
],
[liber:1.1-3: one\n
liber:2.1-3: two\n
@@ -214,16 +214,16 @@ TRACKTEST([retreat over origin],[],[9],
[one\n
two\n
three\n
-#origin B 5 0
+.origin B 5 0
four\n
five\n
-#origin C 2 0
+.origin C 2 0
six\n
seven\n
eight\n
-#retreat 17
+.retreat 17
nine
-#stat
+.stat
],[liber:1.1-3: one\n
liber:2.1-3: two\n
liber:3.1-5: three\n
@@ -242,16 +242,16 @@ TRACKTEST([retreat over two origins],[],[9],
[one\n
two\n
three\n
-#origin B 5 0
+.origin B 5 0
four\n
five\n
-#origin C 2 0
+.origin C 2 0
six\n
seven\n
eight\n
-#retreat 32
+.retreat 32
nine
-#stat
+.stat
],[liber:1.1-3: one\n
liber:2.1-3: two\n
liber:3.1-5: three\n
@@ -268,7 +268,7 @@ n_chars=12
TRACKTEST([rebase],[],[9],
[one
-#rebase archivum 5 3
+.rebase archivum 5 3
two
],
[liber:1.1-3: one
@@ -279,9 +279,9 @@ TRACKTEST([#line directive],[],[9],
[agnosco
veteris\n
vestigia
-#line 20
+.line 20
flamme\n
-#retreat 8
+.retreat 8
Naso
],
[liber:1.1-7: agnosco
diff --git a/libmailutils/tests/linetrack.c b/libmailutils/tests/linetrack.c
index 48240265f..d54522717 100644
--- a/libmailutils/tests/linetrack.c
+++ b/libmailutils/tests/linetrack.c
@@ -1,7 +1,8 @@
#include <mailutils/mailutils.h>
#include <mailutils/locus.h>
+#include "tesh.h"
-int
+static int
getnum (char const *arg, unsigned *ret)
{
char *end;
@@ -15,9 +16,10 @@ getnum (char const *arg, unsigned *ret)
return 0;
}
-static void
-com_retreat (mu_linetrack_t trk, size_t argc, char **argv)
+static int
+com_retreat (int argc, char **argv, mu_assoc_t options, void *env)
{
+ mu_linetrack_t trk = env;
unsigned x;
if (getnum (argv[1], &x) == 0)
{
@@ -27,56 +29,64 @@ com_retreat (mu_linetrack_t trk, size_t argc, char **argv)
else if (rc)
mu_diag_funcall (MU_DIAG_ERROR, "mu_linetrack_retreat", argv[1], rc);
}
+ return 0;
}
-static void
-com_origin (mu_linetrack_t trk, size_t argc, char **argv)
+static int
+com_origin (int argc, char **argv, mu_assoc_t options, void *env)
{
+ mu_linetrack_t trk = env;
int rc;
struct mu_locus_point pt;
pt.mu_file = argv[1];
if (getnum (argv[2], &pt.mu_line))
- return;
+ return 0;
if (getnum (argv[3], &pt.mu_col))
- return;
+ return 0;
rc = mu_linetrack_origin (trk, &pt);
if (rc)
mu_diag_funcall (MU_DIAG_ERROR, "mu_linetrack_origin", NULL, rc);
+ return 0;
}
-static void
-com_line (mu_linetrack_t trk, size_t argc, char **argv)
+static int
+com_line (int argc, char **argv, mu_assoc_t options, void *env)
{
+ mu_linetrack_t trk = env;
int rc;
struct mu_locus_point pt = MU_LOCUS_POINT_INITIALIZER;
if (getnum (argv[1], &pt.mu_line))
- return;
+ return 0;
rc = mu_linetrack_origin (trk, &pt);
if (rc)
mu_diag_funcall (MU_DIAG_ERROR, "mu_linetrack_origin", NULL, rc);
+ return 0;
}
-static void
-com_rebase (mu_linetrack_t trk, size_t argc, char **argv)
+static int
+com_rebase (int argc, char **argv, mu_assoc_t options, void *env)
{
+ mu_linetrack_t trk = env;
int rc;
struct mu_locus_point pt;
pt.mu_file = argv[1];
if (getnum (argv[2], &pt.mu_line))
- return;
+ return 0;
if (getnum (argv[3], &pt.mu_col))
- return;
+ return 0;
rc = mu_linetrack_rebase (trk, &pt);
if (rc)
mu_diag_funcall (MU_DIAG_ERROR, "mu_linetrack_rebase", NULL, rc);
+ return 0;
}
-static void
-com_point (mu_linetrack_t trk, size_t argc, char **argv)
+static int
+com_point (int argc, char **argv, mu_assoc_t options, void *env)
{
+ mu_linetrack_t trk = env;
struct mu_locus_range lr = MU_LOCUS_RANGE_INITIALIZER;
int rc;
@@ -88,17 +98,21 @@ com_point (mu_linetrack_t trk, size_t argc, char **argv)
mu_stream_lprintf (mu_strout, &lr, "%s\n", argv[0]);
mu_locus_range_deinit (&lr);
}
+ return 0;
}
-static void
-com_bol_p (mu_linetrack_t trk, size_t argc, char **argv)
+static int
+com_bol_p (int argc, char **argv, mu_assoc_t options, void *env)
{
+ mu_linetrack_t trk = env;
mu_printf ("%d\n", mu_linetrack_at_bol (trk));
+ return 0;
}
-static void
-com_stat (mu_linetrack_t trk, size_t argc, char **argv)
+static int
+com_stat (int argc, char **argv, mu_assoc_t options, void *env)
{
+ mu_linetrack_t trk = env;
int rc;
struct mu_linetrack_stat st;
@@ -111,23 +125,44 @@ com_stat (mu_linetrack_t trk, size_t argc, char **argv)
mu_printf ("n_lines=%zu\n", st.n_lines);
mu_printf ("n_chars=%zu\n", st.n_chars);
}
+ return 0;
}
-struct command
+static int
+lineproc (int argc, char **argv, mu_assoc_t options, void *env)
{
- char *name;
- size_t argc;
- void (*fun) (mu_linetrack_t trk, size_t argc, char **argv);
-};
+ char *buf = argv[0];
+ mu_linetrack_t trk = env;
+ struct mu_locus_range lr = MU_LOCUS_RANGE_INITIALIZER;
+ char *tok;
+
+ if (buf[0] == 0)
+ return 0;
+ if (buf[0] == '.')
+ {
+ /* command escape */
+ memmove (buf, buf + 1, strlen (buf));
+ return MU_ERR_USER0;
+ }
+
+ mu_c_str_unescape (buf, "\\\n", "\\n", &tok);
+ mu_linetrack_advance (trk, &lr, tok, strlen (tok));
+ free (tok);
+ mu_stream_lprintf (mu_strout, &lr, "%s\n", buf);
+ mu_locus_range_deinit (&lr);
+ return 0;
+}
+
-static struct command comtab[] = {
- { "retreat", 2, com_retreat },
- { "origin", 4, com_origin },
- { "line", 2, com_line },
- { "point", 1, com_point },
- { "rebase", 4, com_rebase },
- { "bol", 1, com_bol_p },
- { "stat", 1, com_stat },
+static struct mu_tesh_command comtab[] = {
+ { "__LINEPROC__", "", lineproc },
+ { "retreat", "COUNT", com_retreat },
+ { "origin", "FILE LINE COL", com_origin },
+ { "line", "NUMBER", com_line },
+ { "point", "NUMBER", com_point },
+ { "rebase", "FILE LINE COL", com_rebase },
+ { "bol", "", com_bol_p },
+ { "stat", "", com_stat },
{ NULL }
};
@@ -137,16 +172,8 @@ main (int argc, char **argv)
unsigned long max_lines;
char *end;
mu_linetrack_t trk;
- int rc;
- char *buf = NULL;
- size_t size, n;
- struct mu_wordsplit ws;
- int wsf = MU_WRDSF_NOVAR | MU_WRDSF_NOCMD
- | MU_WRDSF_SHOWERR | MU_WRDSF_ENOMEMABRT;
-
- mu_set_program_name (argv[0]);
- mu_stdstream_setup (MU_STDSTREAM_RESET_NONE);
+ mu_tesh_init (argv[0]);
if (argc != 3)
{
mu_error ("usage: %s FILE LINES", mu_program_name);
@@ -160,40 +187,9 @@ main (int argc, char **argv)
}
MU_ASSERT (mu_linetrack_create (&trk, argv[1], max_lines));
- while ((rc = mu_stream_getline (mu_strin, &buf, &size, &n)) == 0 && n > 0)
- {
- char *tok;
-
- n = mu_rtrim_class (buf, MU_CTYPE_SPACE);
- if (n == 0)
- continue;
- if (buf[0] == '#')
- {
- struct command *com;
-
- mu_wordsplit (buf+1, &ws, wsf);
- wsf |= MU_WRDSF_REUSE;
- for (com = comtab; com->name; com++)
- if (strcmp (com->name, ws.ws_wordv[0]) == 0
- && com->argc == ws.ws_wordc)
- break;
- if (com->name)
- com->fun (trk, ws.ws_wordc, ws.ws_wordv);
- else
- mu_error ("unrecognized command");
- }
- else
- {
- struct mu_locus_range lr = MU_LOCUS_RANGE_INITIALIZER;
+ mu_tesh_read_and_eval (argc - 3, argv + 3, comtab, trk);
- mu_c_str_unescape (buf, "\\\n", "\\n", &tok);
- mu_linetrack_advance (trk, &lr, tok, strlen (tok));
- free (tok);
- mu_stream_lprintf (mu_strout, &lr, "%s\n", buf);
- mu_locus_range_deinit (&lr);
- }
- }
mu_linetrack_destroy (&trk);
return 0;
}
diff --git a/libmailutils/tests/list.at b/libmailutils/tests/list.at
index 057fa07b3..fc2e3da08 100644
--- a/libmailutils/tests/list.at
+++ b/libmailutils/tests/list.at
@@ -48,7 +48,7 @@ fem
TESTLIST([insert after],[],
[add en tre fire fem
-ins after en to
+ins -after en to
print],
[# items: 5
en
@@ -60,7 +60,7 @@ fem
TESTLIST([insert before],[],
[add en tre fire fem
-ins before tre to
+ins -before tre to
print],
[# items: 5
en
@@ -118,7 +118,7 @@ en
TESTLIST([pop-null],[],
[pop],
[],
-[mu_list_pop: Requested item not found
+[listop: mu_list_pop() failed: Requested item not found
])
TESTLIST([get],[],
diff --git a/libmailutils/tests/listop.c b/libmailutils/tests/listop.c
index b5b633668..05dd0c405 100644
--- a/libmailutils/tests/listop.c
+++ b/libmailutils/tests/listop.c
@@ -21,18 +21,37 @@
#include <stdio.h>
#include <stdlib.h>
#include <mailutils/mailutils.h>
+#include "tesh.h"
static int interactive;
void
lperror (char *text, int rc)
{
- fprintf (stderr, "%s: %s\n", text, mu_strerror (rc));
+ mu_error ("%s: %s", text, mu_strerror (rc));
exit (1);
}
+#define NITR 4
+
+struct listop_closure
+{
+ mu_list_t lst;
+ mu_iterator_t itr[NITR];
+ int num;
+};
+
+static void
+listop_invalidate_iterators (struct listop_closure *cls)
+{
+ int i;
+
+ for (i = 0; i < NITR; i++)
+ mu_iterator_destroy (&cls->itr[i]);
+}
+
void
-print (mu_list_t list)
+print_list (mu_list_t list)
{
mu_iterator_t itr;
size_t count;
@@ -46,7 +65,7 @@ print (mu_list_t list)
if (rc)
lperror ("mu_iterator_current", rc);
- printf ("# items: %lu\n", (unsigned long) count);
+ mu_printf ("# items: %lu\n", (unsigned long) count);
for (mu_iterator_first (itr); !mu_iterator_is_done (itr);
mu_iterator_next (itr))
{
@@ -55,90 +74,98 @@ print (mu_list_t list)
rc = mu_iterator_current (itr, (void**) &text);
if (rc)
lperror ("mu_iterator_current", rc);
- printf ("%s\n", text);
+ mu_printf ("%s\n", text);
}
mu_iterator_destroy (&itr);
}
-void
-count (mu_list_t list)
+int
+com_print (int argc, char **argv, mu_assoc_t options, void *env)
+{
+ struct listop_closure *cls = env;
+ print_list (cls->lst);
+ return 0;
+}
+
+int
+com_count (int argc, char **argv, mu_assoc_t options, void *env)
{
+ struct listop_closure *cls = env;
size_t n;
int rc;
- rc = mu_list_count (list, &n);
+ rc = mu_list_count (cls->lst, &n);
if (rc)
lperror ("mu_iterator_current", rc);
else
- printf ("%lu\n", (unsigned long) n);
+ mu_printf ("%lu\n", (unsigned long) n);
+ return 0;
}
-void
-next (mu_iterator_t itr, char *arg)
+int
+com_next (int argc, char **argv, mu_assoc_t options, void *env)
{
- int skip = arg ? strtoul (arg, NULL, 0) : 1;
+ struct listop_closure *cls = env;
+ int skip = argc == 2 ? strtoul (argv[1], NULL, 0) : 1;
if (skip == 0)
- fprintf (stderr, "next arg?\n");
+ {
+ mu_error ("next arg?");
+ }
+ else
+ {
while (skip--)
- mu_iterator_next (itr);
+ mu_iterator_next (cls->itr[cls->num]);
+ }
+ return 0;
}
-void
-delete (mu_list_t list, int argc, char **argv)
+int
+com_delete (int argc, char **argv, mu_assoc_t options, void *env)
{
+ struct listop_closure *cls = env;
+ mu_list_t list = cls->lst;
int rc;
- if (argc == 1)
- {
- fprintf (stderr, "del arg?\n");
- return;
- }
-
while (--argc)
{
rc = mu_list_remove (list, *++argv);
if (rc)
- fprintf (stderr, "mu_list_remove(%s): %s\n", *argv, mu_strerror (rc));
+ mu_diag_funcall (MU_DIAG_ERROR, "mu_list_remove", *argv, rc);
}
+ return 0;
}
-void
-add (mu_list_t list, int argc, char **argv)
+int
+com_add (int argc, char **argv, mu_assoc_t options, void *env)
{
+ struct listop_closure *cls = env;
+ mu_list_t list = cls->lst;
int rc;
- if (argc == 1)
- {
- fprintf (stderr, "add arg?\n");
- return;
- }
-
while (--argc)
{
rc = mu_list_append (list, strdup (*++argv));
if (rc)
- fprintf (stderr, "mu_list_append: %s\n", mu_strerror (rc));
+ mu_diag_funcall (MU_DIAG_ERROR, "mu_list_append", *argv, rc);
}
+ return 0;
}
-void
-prep (mu_list_t list, int argc, char **argv)
+int
+com_prep (int argc, char **argv, mu_assoc_t options, void *env)
{
+ struct listop_closure *cls = env;
+ mu_list_t list = cls->lst;
int rc;
- if (argc == 1)
- {
- fprintf (stderr, "add arg?\n");
- return;
- }
-
while (--argc)
{
rc = mu_list_prepend (list, strdup (*++argv));
if (rc)
- fprintf (stderr, "mu_list_append: %s\n", mu_strerror (rc));
+ mu_diag_funcall (MU_DIAG_ERROR, "mu_list_prepend", *argv, rc);
}
+ return 0;
}
static mu_list_t
@@ -150,7 +177,7 @@ read_list (int argc, char **argv)
rc = mu_list_create (&list);
if (rc)
{
- fprintf (stderr, "creating temp list: %s\n", mu_strerror (rc));
+ mu_diag_funcall (MU_DIAG_ERROR, "mu_list_create", NULL, rc);
return NULL;
}
mu_list_set_destroy_item (list, mu_list_free_item);
@@ -159,71 +186,55 @@ read_list (int argc, char **argv)
rc = mu_list_append (list, strdup (*argv));
if (rc)
{
+ mu_diag_funcall (MU_DIAG_ERROR, "mu_list_append", *argv, rc);
mu_list_destroy (&list);
- fprintf (stderr, "adding to temp list: %s\n", mu_strerror (rc));
break;
}
}
return list;
}
-void
-ins (mu_list_t list, int argc, char **argv)
+int
+com_ins (int argc, char **argv, mu_assoc_t options, void *env)
{
- int an;
+ struct listop_closure *cls = env;
+ mu_list_t list = cls->lst;
int rc;
char *item;
int insert_before = 0;
- if (argc < 3)
- {
- fprintf (stderr, "ins [before] item new_item [new_item*]?\n");
- return;
- }
-
- an = 1;
- if (strcmp (argv[1], "before") == 0)
- {
- an++;
+ if (mu_assoc_lookup (options, "before", NULL) == 0)
insert_before = 1;
- }
- else if (strcmp (argv[1], "after") == 0)
- {
- an++;
- insert_before = 0;
- }
- item = argv[an++];
+ item = argv[1];
- if (an + 1 == argc)
- rc = mu_list_insert (list, item, strdup (argv[an]), insert_before);
+ if (3 == argc)
+ rc = mu_list_insert (list, item, strdup (argv[2]), insert_before);
else
{
- mu_list_t tmp = read_list (argc - an, argv + an);
+ mu_list_t tmp = read_list (argc - 2, argv + 2);
if (!tmp)
- return;
+ return 0;
rc = mu_list_insert_list (list, item, tmp, insert_before);
mu_list_destroy (&tmp);
}
if (rc)
lperror ("mu_list_insert", rc);
+ return 0;
}
-void
-repl (mu_list_t list, int argc, char **argv)
+int
+com_repl (int argc, char **argv, mu_assoc_t options, void *env)
{
+ struct listop_closure *cls = env;
+ mu_list_t list = cls->lst;
int rc;
- if (argc != 3)
- {
- fprintf (stderr, "repl src dst?\n");
- return;
- }
-
rc = mu_list_replace (list, argv[1], strdup (argv[2]));
if (rc)
- fprintf (stderr, "mu_list_replace: %s\n", mu_strerror (rc));
+ mu_diag_funcall (MU_DIAG_ERROR, "mu_list_replace", NULL, rc);
+ return 0;
}
void
@@ -234,14 +245,14 @@ ictl_tell (mu_iterator_t itr, int argc)
if (argc)
{
- fprintf (stderr, "ictl tell?\n");
+ mu_error ("ictl tell?");
return;
}
rc = mu_iterator_ctl (itr, mu_itrctl_tell, &pos);
if (rc)
lperror ("mu_iterator_ctl", rc);
- printf ("%lu\n", (unsigned long) pos);
+ mu_printf ("%lu\n", (unsigned long) pos);
}
void
@@ -251,7 +262,7 @@ ictl_del (mu_iterator_t itr, int argc)
if (argc)
{
- fprintf (stderr, "ictl del?\n");
+ mu_error ("ictl del?");
return;
}
rc = mu_iterator_ctl (itr, mu_itrctl_delete, NULL);
@@ -259,20 +270,21 @@ ictl_del (mu_iterator_t itr, int argc)
lperror ("mu_iterator_ctl", rc);
}
-void
+int
ictl_repl (mu_iterator_t itr, int argc, char **argv)
{
int rc;
if (argc != 1)
{
- fprintf (stderr, "ictl repl item?\n");
- return;
+ mu_error ("ictl repl item?");
+ return 0;
}
rc = mu_iterator_ctl (itr, mu_itrctl_replace, strdup (argv[0]));
if (rc)
lperror ("mu_iterator_ctl", rc);
+ return 0;
}
void
@@ -283,7 +295,7 @@ ictl_dir (mu_iterator_t itr, int argc, char **argv)
if (argc > 1)
{
- fprintf (stderr, "ictl dir [backwards|forwards]?\n");
+ mu_error ("ictl dir [backwards|forwards]?");
return;
}
if (argc == 1)
@@ -294,7 +306,7 @@ ictl_dir (mu_iterator_t itr, int argc, char **argv)
dir = 0;
else
{
- fprintf (stderr, "ictl dir [backwards|forwards]?\n");
+ mu_error ("ictl dir [backwards|forwards]?");
return;
}
rc = mu_iterator_ctl (itr, mu_itrctl_set_direction, &dir);
@@ -306,8 +318,9 @@ ictl_dir (mu_iterator_t itr, int argc, char **argv)
rc = mu_iterator_ctl (itr, mu_itrctl_qry_direction, &dir);
if (rc)
lperror ("mu_iterator_ctl", rc);
- printf ("%s\n", dir ? "backwards" : "forwards");
+ mu_printf ("%s\n", dir ? "backwards" : "forwards");
}
+ return;
}
void
@@ -317,7 +330,7 @@ ictl_ins (mu_iterator_t itr, int argc, char **argv)
if (argc < 1)
{
- fprintf (stderr, "ictl ins item [item*]?\n");
+ mu_error ("ictl ins item [item*]?");