+static GSList *imap_get_seq_set_from_numlist(MsgNumberList *numlist)
+{
+ GString *str;
+ GSList *sorted_list, *cur;
+ guint first, last, next;
+ gchar *ret_str;
+ GSList *ret_list = NULL;
+
+ if (numlist == NULL)
+ return NULL;
+
+ str = g_string_sized_new(256);
+
+ sorted_list = g_slist_copy(numlist);
+ sorted_list = g_slist_sort(sorted_list, g_int_compare);
+
+ first = GPOINTER_TO_INT(sorted_list->data);
+
+ for (cur = sorted_list; cur != NULL; cur = g_slist_next(cur)) {
+ last = GPOINTER_TO_INT(cur->data);
+ if (cur->next)
+ next = GPOINTER_TO_INT(cur->next->data);
+ else
+ next = 0;
+
+ if (last + 1 != next || next == 0) {
+ if (str->len > 0)
+ g_string_append_c(str, ',');
+ if (first == last)
+ g_string_sprintfa(str, "%u", first);
+ else
+ g_string_sprintfa(str, "%u:%u", first, last);
+
+ first = next;
+
+ if (str->len > IMAP_CMD_LIMIT) {
+ ret_str = g_strdup(str->str);
+ ret_list = g_slist_append(ret_list, ret_str);
+ g_string_truncate(str, 0);
+ }
+ }
+ }
+
+ if (str->len > 0) {
+ ret_str = g_strdup(str->str);
+ ret_list = g_slist_append(ret_list, ret_str);
+ }
+
+ g_slist_free(sorted_list);
+ g_string_free(str, TRUE);
+
+ return ret_list;
+}
+
+static GSList *imap_get_seq_set_from_msglist(MsgInfoList *msglist)
+{
+ MsgNumberList *numlist = NULL;
+ MsgInfoList *cur;
+ GSList *seq_list;
+
+ for (cur = msglist; cur != NULL; cur = g_slist_next(cur)) {
+ MsgInfo *msginfo = (MsgInfo *) cur->data;
+
+ numlist = g_slist_append(numlist, GINT_TO_POINTER(msginfo->msgnum));
+ }
+ seq_list = imap_get_seq_set_from_numlist(numlist);
+ g_slist_free(numlist);
+
+ return seq_list;
+}
+
+static void imap_seq_set_free(GSList *seq_list)
+{
+ slist_free_strings(seq_list);
+ g_slist_free(seq_list);
+}
+
+