NeoMutt  2024-04-25-97-g7d2481
Teaching an old dog new tricks
No Matches
msg_set.c File Reference

IMAP Message Sets. More...

#include "config.h"
#include <stdio.h>
#include "private.h"
#include "mutt/lib.h"
#include "msg_set.h"
#include "sort.h"
+ Include dependency graph for msg_set.c:

Go to the source code of this file.


int imap_sort_uid (const void *a, const void *b, void *sdata)
 Compare two UIDs - Implements sort_t -.
int imap_make_msg_set (struct UidArray *uida, struct Buffer *buf, int *pos)
 Generate a compressed message set of UIDs.
int imap_exec_msg_set (struct ImapAccountData *adata, const char *pre, const char *post, struct UidArray *uida)
 Execute a command using a set of UIDs.


int ImapMaxCmdlen = 8192
 Maximum length of IMAP commands before they must be split.

Detailed Description

IMAP Message Sets.

  • Richard Russon

This program 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 this program. If not, see

Definition in file msg_set.c.

Function Documentation

◆ imap_make_msg_set()

int imap_make_msg_set ( struct UidArray *  uida,
struct Buffer buf,
int *  pos 

Generate a compressed message set of UIDs.

uidaArray of UIDs
bufBuffer for message set
posCursor used for multiple calls to this function
Return values
numNumber of UIDs processed

Compress a sorted list of UIDs, e.g.

  • 1,2,3,4,6,8,9,10 becomes 1:4,6,8:10

Definition at line 73 of file msg_set.c.

75 if (!uida || !buf || !pos)
76 return 0;
78 const size_t array_size = ARRAY_SIZE(uida);
79 if ((array_size == 0) || (*pos >= array_size))
80 return 0;
82 int count = 1; // Number of UIDs added to the set
83 size_t i = *pos;
84 unsigned int start = *ARRAY_GET(uida, i);
85 unsigned int prev = start;
87 for (i++; (i < array_size) && (buf_len(buf) < ImapMaxCmdlen); i++, count++)
88 {
89 unsigned int uid = *ARRAY_GET(uida, i);
91 // Keep adding to current set
92 if (uid == (prev + 1))
93 {
94 prev = uid;
95 continue;
96 }
98 // End the current set
99 if (start == prev)
100 buf_add_printf(buf, "%u,", start);
101 else
102 buf_add_printf(buf, "%u:%u,", start, prev);
104 // Start a new set
105 start = uid;
106 prev = uid;
107 }
109 if (start == prev)
110 buf_add_printf(buf, "%u", start);
111 else
112 buf_add_printf(buf, "%u:%u", start, prev);
114 *pos = i;
116 return count;
#define ARRAY_SIZE(head)
The number of elements stored.
Definition: array.h:87
#define ARRAY_GET(head, idx)
Return the element at index.
Definition: array.h:109
int buf_add_printf(struct Buffer *buf, const char *fmt,...)
Format a string appending a Buffer.
Definition: buffer.c:204
size_t buf_len(const struct Buffer *buf)
Calculate the length of a Buffer.
Definition: buffer.c:491
int ImapMaxCmdlen
Maximum length of IMAP commands before they must be split.
Definition: msg_set.c:50
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ imap_exec_msg_set()

int imap_exec_msg_set ( struct ImapAccountData adata,
const char *  pre,
const char *  post,
struct UidArray *  uida 

Execute a command using a set of UIDs.

adataImap Account data
prePrefix commands
postPostfix commands
uidaSorted array of UIDs
Return values
numNumber of messages sent

Commands are of the form: TAG PRE MESSAGE-SET POST e.g. A01 UID COPY 1:4 MAILBOX

Must be flushed with imap_exec()

Definition at line 133 of file msg_set.c.

136 struct Buffer *cmd = buf_pool_get();
138 int count = 0;
139 int pos = 0;
140 int rc = 0;
142 do
143 {
144 buf_reset(cmd);
145 buf_add_printf(cmd, "%s ", pre);
146 rc = imap_make_msg_set(uida, cmd, &pos);
147 if (rc > 0)
148 {
149 buf_add_printf(cmd, " %s", post);
151 {
152 rc = -1;
153 goto out;
154 }
155 count += rc;
156 }
157 } while (rc > 0);
159 rc = count;
162 buf_pool_release(&cmd);
163 return rc;
void buf_reset(struct Buffer *buf)
Reset an existing Buffer.
Definition: buffer.c:76
static const char * buf_string(const struct Buffer *buf)
Convert a buffer to a const char * "string".
Definition: buffer.h:96
int imap_exec(struct ImapAccountData *adata, const char *cmdstr, ImapCmdFlags flags)
Execute a command and wait for the response from the server.
Definition: command.c:1304
Imap command executed or queued successfully.
Definition: private.h:82
Queue a command, do not execute.
Definition: private.h:73
int imap_make_msg_set(struct UidArray *uida, struct Buffer *buf, int *pos)
Generate a compressed message set of UIDs.
Definition: msg_set.c:73
struct Buffer * buf_pool_get(void)
Get a Buffer from the pool.
Definition: pool.c:81
void buf_pool_release(struct Buffer **ptr)
Return a Buffer to the pool.
Definition: pool.c:94
String manipulation buffer.
Definition: buffer.h:36
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

Variable Documentation

◆ ImapMaxCmdlen

int ImapMaxCmdlen = 8192

Maximum length of IMAP commands before they must be split.

This is suggested in RFC7162 (dated 2014).

Definition at line 50 of file msg_set.c.