summaryrefslogtreecommitdiff
path: root/mh
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2017-06-20 00:39:18 +0300
committerSergey Poznyakoff <gray@gnu.org.ua>2017-06-20 00:39:18 +0300
commit455554b8b04054e1db41b72426f7ee9d8579acf5 (patch)
tree8b6ff512af954dcf4c6cc1525b58b11e35788d1d /mh
parent1ddc81a18a3f1491494ff7ec3a21e1bbcabf265a (diff)
downloadmailutils-455554b8b04054e1db41b72426f7ee9d8579acf5.tar.gz
mailutils-455554b8b04054e1db41b72426f7ee9d8579acf5.tar.bz2
API for formatting message sets on output
* libmailutils/msgset/print.c (mu_msgset_formats): New global. (mu_stream_msgset_format): New function. * include/mailutils/msgset.h (mu_msgset_format): New struct. (mu_msgset_fmt_imap, mu_msgset_fmt_mh): New defines. (MU_MSGSET_IGNORE_TRANSERR): New flag (mu_msgset_copy, mu_msgset_translate): New protos. (mu_stream_msgset_format, mu_msgset_imap_print): New protos. (mu_msgset_print): Deprecate. * libmailutils/imapio/sendmsgset.c: Use mu_msgset_imap_print instead of mu_msgset_print. * mu/libexec/imap.c: Likewise. * libmailutils/msgset/Makefile.am: Add copy.c * libmailutils/msgset/add.c (mu_msgset_add_range): Translate if message set mode doesn't match the requested one. * libmailutils/msgset/sub.c (mu_msgset_sub_range): Likewise. * libmailutils/msgset/trans.c (_mu_msgset_translate_pair): Act according to the mode argument. (mu_msgset_translate): New function. * libmailutils/tests/msgset.c: New option -mh * mh/mh_sequence.c (write_sequence): Rewrite. * testsuite/msgset.c: Optionally translate uids to msgnums and vice-versa.
Diffstat (limited to 'mh')
-rw-r--r--mh/inc.c4
-rw-r--r--mh/mh_msgset.c1
-rw-r--r--mh/mh_sequence.c107
3 files changed, 26 insertions, 86 deletions
diff --git a/mh/inc.c b/mh/inc.c
index 8f3981bcd..9ae0abde4 100644
--- a/mh/inc.c
+++ b/mh/inc.c
@@ -440,9 +440,7 @@ main (int argc, char **argv)
mu_msgset_create (&unseen, NULL, MU_MSGSET_NUM);
mu_msgset_add_range (unseen, lastseen, incdat.lastmsg, MU_MSGSET_NUM);
- mh_seq_add (incdat.output,
- unseen_seq,
- unseen, 0);
+ mh_seq_add (incdat.output, unseen_seq, unseen, 0);
mu_msgset_free (unseen);
}
diff --git a/mh/mh_msgset.c b/mh/mh_msgset.c
index 3b961d5c7..5b372cc63 100644
--- a/mh/mh_msgset.c
+++ b/mh/mh_msgset.c
@@ -119,6 +119,7 @@ msgset_parser_init (struct msgset_parser *parser, mu_mailbox_t mbox,
mu_diag_funcall (MU_DIAG_ERROR, "mu_msgset_create", NULL, rc);
exit (1);
}
+
parser->argc = argc;
parser->argv = argv;
parser->curp = "";
diff --git a/mh/mh_sequence.c b/mh/mh_sequence.c
index 5ae37c621..50c6ca248 100644
--- a/mh/mh_sequence.c
+++ b/mh/mh_sequence.c
@@ -47,6 +47,8 @@ mh_seq_read (mu_mailbox_t mbox, const char *name, int flags)
static void
write_sequence (mu_mailbox_t mbox, const char *name, char *value, int private)
{
+ if (value && value[0] == 0)
+ value = NULL;
if (private)
{
char *p = private_sequence_name (name);
@@ -63,96 +65,35 @@ delete_sequence (mu_mailbox_t mbox, const char *name, int private)
write_sequence (mbox, name, NULL, private);
}
-struct format_closure
-{
- mu_stream_t stream;
- mu_mailbox_t mailbox;
- int delim;
-};
-
-static int
-format_sequence (void *item, void *data)
+static void
+save_sequence (mu_mailbox_t mbox, const char *name, mu_msgset_t mset,
+ int flags)
{
- struct mu_msgrange *r = item;
- struct format_closure *clos = data;
int rc;
- size_t beg, end;
-
- if (clos->mailbox)
- {
- rc = mu_mailbox_translate (clos->mailbox,
- MU_MAILBOX_MSGNO_TO_UID,
- r->msg_beg, &beg);
- if (rc)
- return rc;
- }
- else
- beg = r->msg_beg;
- if (clos->delim)
- mu_stream_write (clos->stream, " ", 1, NULL);
- if (r->msg_beg == r->msg_end)
- rc = mu_stream_printf (clos->stream, "%lu", (unsigned long) beg);
- else
+ mu_stream_t mstr;
+ mu_msgset_t outset;
+ mu_transport_t trans[2];
+
+ rc = mu_msgset_translate (&outset, mset,
+ MU_MSGSET_UID|MU_MSGSET_IGNORE_TRANSERR);
+ if (rc)
{
- if (clos->mailbox)
- {
- rc = mu_mailbox_translate (clos->mailbox,
- MU_MAILBOX_MSGNO_TO_UID,
- r->msg_end, &end);
- if (rc)
- return rc;
- }
- else
- end = r->msg_end;
- if (beg + 1 == end)
- rc = mu_stream_printf (clos->stream, "%lu %lu",
- (unsigned long) beg,
- (unsigned long) end);
- else
- rc = mu_stream_printf (clos->stream, "%lu-%lu",
- (unsigned long) beg,
- (unsigned long) end);
+ mu_diag_funcall (MU_DIAG_ERROR, "mu_msgset_translate", NULL, rc);
+ exit (1);
}
- clos->delim = 1;
- return rc;
-}
-static void
-save_sequence (mu_mailbox_t mbox, const char *name, mu_msgset_t mset,
- int flags)
-{
- mu_list_t list;
-
- mu_msgset_get_list (mset, &list);
- if (mu_list_is_empty (list))
- write_sequence (mset->mbox, name, NULL, flags & SEQ_PRIVATE);
- else
+ rc = mu_memory_stream_create (&mstr, MU_STREAM_RDWR);
+ if (rc)
{
- struct format_closure clos;
- int rc;
- mu_transport_t trans[2];
-
- rc = mu_memory_stream_create (&clos.stream, MU_STREAM_RDWR);
- if (rc)
- {
- mu_diag_funcall (MU_DIAG_ERROR, "mu_memory_stream_create", NULL, rc);
- exit (1);
- }
-
- clos.mailbox = mset->mbox;
- clos.delim = 0;
- rc = mu_list_foreach (list, format_sequence, &clos);
- if (rc)
- {
- mu_diag_funcall (MU_DIAG_ERROR, "mu_list_foreach", NULL, rc);
- exit (1);
- }
- mu_stream_write (clos.stream, "", 1, NULL);
- mu_stream_ioctl (clos.stream, MU_IOCTL_TRANSPORT, MU_IOCTL_OP_GET,
- trans);
- write_sequence (mbox, name, (char*)trans[0], flags & SEQ_PRIVATE);
- mu_stream_unref (clos.stream);
+ mu_diag_funcall (MU_DIAG_ERROR, "mu_memory_stream_create", NULL, rc);
+ exit (1);
}
+ mu_stream_msgset_format (mstr, mu_msgset_fmt_mh, outset);
+ mu_stream_write (mstr, "", 1, NULL);
+ mu_stream_ioctl (mstr, MU_IOCTL_TRANSPORT, MU_IOCTL_OP_GET, trans);
+ write_sequence (mbox, name, (char*)trans[0], flags & SEQ_PRIVATE);
+ mu_stream_unref (mstr);
+ mu_msgset_free (outset);
}
void

Return to:

Send suggestions and report system problems to the System administrator.