diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2019-03-25 14:35:06 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2019-03-25 16:16:08 +0200 |
commit | cef8dafaf17b67c1b4836e22ef00c54f38237fe6 (patch) | |
tree | 8b4a134c60934f92021a0851d4aa314046a7e69b | |
parent | 1a523cb6c788fc46b234019f4198b865c4b5f502 (diff) | |
download | mailutils-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.am | 10 | ||||
-rw-r--r-- | libmailutils/tests/fsfolder.c | 128 | ||||
-rw-r--r-- | libmailutils/tests/fsfolder00.at | 6 | ||||
-rw-r--r-- | libmailutils/tests/fsfolder01.at | 2 | ||||
-rw-r--r-- | libmailutils/tests/linetrack.at | 56 | ||||
-rw-r--r-- | libmailutils/tests/linetrack.c | 144 | ||||
-rw-r--r-- | libmailutils/tests/list.at | 6 | ||||
-rw-r--r-- | libmailutils/tests/listop.c | 669 | ||||
-rw-r--r-- | libmailutils/tests/tesh.c | 385 | ||||
-rw-r--r-- | libmailutils/tests/tesh.h | 176 | ||||
-rw-r--r-- | libproto/dotmail/dotmail.c | 2 | ||||
-rw-r--r-- | libproto/dotmail/tests/Makefile.am | 2 | ||||
-rw-r--r-- | libproto/dotmail/tests/dm_mesg.c | 396 |
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*]?"); |