diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2017-06-20 00:39:18 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2017-06-20 00:39:18 +0300 |
commit | 455554b8b04054e1db41b72426f7ee9d8579acf5 (patch) | |
tree | 8b6ff512af954dcf4c6cc1525b58b11e35788d1d /mh | |
parent | 1ddc81a18a3f1491494ff7ec3a21e1bbcabf265a (diff) | |
download | mailutils-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.c | 4 | ||||
-rw-r--r-- | mh/mh_msgset.c | 1 | ||||
-rw-r--r-- | mh/mh_sequence.c | 107 |
3 files changed, 26 insertions, 86 deletions
@@ -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 |