changeset 7649:efbfe9344c14 HEAD

Renamed imap_messageset_parse() to imap_seq_set_parse(). Added imap_seq_range_parse().
author Timo Sirainen <tss@iki.fi>
date Fri, 06 Jun 2008 23:54:30 +0300
parents d003fb4bb7d9
children edd180c77b99
files src/imap/cmd-select.c src/imap/imap-search.c src/lib-imap/Makefile.am src/lib-imap/imap-messageset.c src/lib-imap/imap-messageset.h src/lib-imap/imap-seqset.c src/lib-imap/imap-seqset.h src/lib-storage/mail-search-build.c
diffstat 8 files changed, 122 insertions(+), 100 deletions(-) [+]
line wrap: on
line diff
--- a/src/imap/cmd-select.c	Thu Jun 05 05:16:31 2008 +0300
+++ b/src/imap/cmd-select.c	Fri Jun 06 23:54:30 2008 +0300
@@ -4,7 +4,7 @@
 #include "seq-range-array.h"
 #include "commands.h"
 #include "mail-search-build.h"
-#include "imap-messageset.h"
+#include "imap-seqset.h"
 #include "imap-fetch.h"
 #include "imap-sync.h"
 
@@ -100,8 +100,8 @@
 		strtoull(IMAP_ARG_STR_NONULL(&args[1]), NULL, 10);
 	if (count > 2) {
 		i_array_init(&ctx->qresync_known_uids, 64);
-		if (imap_messageset_parse(&ctx->qresync_known_uids,
-					  IMAP_ARG_STR_NONULL(&args[2])) < 0) {
+		if (imap_seq_set_parse(IMAP_ARG_STR_NONULL(&args[2]),
+				       &ctx->qresync_known_uids) < 0) {
 			client_send_command_error(ctx->cmd,
 						  "Invalid QRESYNC known-uids");
 			return FALSE;
@@ -121,15 +121,15 @@
 			return FALSE;
 		}
 		t_array_init(&seqset, 32);
-		if (imap_messageset_parse(&seqset,
-					  IMAP_ARG_STR_NONULL(&args[0])) < 0) {
+		if (imap_seq_set_parse(IMAP_ARG_STR_NONULL(&args[0]),
+				       &seqset) < 0) {
 			client_send_command_error(ctx->cmd,
 				"Invalid QRESYNC known-sequence-set");
 			return FALSE;
 		}
 		t_array_init(&uidset, 32);
-		if (imap_messageset_parse(&uidset,
-					  IMAP_ARG_STR_NONULL(&args[1])) < 0) {
+		if (imap_seq_set_parse(IMAP_ARG_STR_NONULL(&args[1]),
+				       &uidset) < 0) {
 			client_send_command_error(ctx->cmd,
 				"Invalid QRESYNC known-uid-set");
 			return FALSE;
--- a/src/imap/imap-search.c	Thu Jun 05 05:16:31 2008 +0300
+++ b/src/imap/imap-search.c	Fri Jun 06 23:54:30 2008 +0300
@@ -5,7 +5,7 @@
 #include "mail-search-build.h"
 #include "imap-search.h"
 #include "imap-parser.h"
-#include "imap-messageset.h"
+#include "imap-seqset.h"
 
 #include <stdlib.h>
 
@@ -97,7 +97,7 @@
 	args->args = p_new(args->pool, struct mail_search_arg, 1);
 	args->args->type = SEARCH_SEQSET;
 	p_array_init(&args->args->value.seqset, args->pool, 16);
-	if (imap_messageset_parse(&args->args->value.seqset, messageset) < 0 ||
+	if (imap_seq_set_parse(messageset, &args->args->value.seqset) < 0 ||
 	    !msgset_is_valid(&args->args->value.seqset,
 			     cmd->client->messages_count)) {
 		*error_r = "Invalid messageset";
@@ -118,7 +118,7 @@
 	args->args = p_new(args->pool, struct mail_search_arg, 1);
 	args->args->type = SEARCH_UIDSET;
 	p_array_init(&args->args->value.seqset, cmd->pool, 16);
-	if (imap_messageset_parse(&args->args->value.seqset, uidset) < 0) {
+	if (imap_seq_set_parse(uidset, &args->args->value.seqset) < 0) {
 		*error_r = "Invalid uidset";
 		return -1;
 	}
--- a/src/lib-imap/Makefile.am	Thu Jun 05 05:16:31 2008 +0300
+++ b/src/lib-imap/Makefile.am	Fri Jun 06 23:54:30 2008 +0300
@@ -11,9 +11,9 @@
 	imap-date.c \
 	imap-envelope.c \
 	imap-match.c \
-	imap-messageset.c \
 	imap-parser.c \
 	imap-quote.c \
+	imap-seqset.c \
 	imap-util.c
 
 headers = \
@@ -22,9 +22,9 @@
 	imap-date.h \
 	imap-envelope.h \
 	imap-match.h \
-	imap-messageset.h \
 	imap-parser.h \
 	imap-quote.h \
+	imap-seqset.h \
 	imap-util.h
 
 if INSTALL_HEADERS
--- a/src/lib-imap/imap-messageset.c	Thu Jun 05 05:16:31 2008 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,75 +0,0 @@
-/* Copyright (c) 2002-2008 Dovecot authors, see the included COPYING file */
-
-#include "lib.h"
-#include "imap-messageset.h"
-
-static uint32_t get_next_number(const char **str)
-{
-	uint32_t num;
-
-	num = 0;
-	while (**str != '\0') {
-		if (**str < '0' || **str > '9')
-			break;
-
-		num = num*10 + (**str - '0');
-		(*str)++;
-	}
-
-	if (num == (uint32_t)-1) {
-		/* FIXME: ugly hack, we're using this number to mean the
-		   last existing message. In reality UIDs should never get
-		   this high, so we can quite safely just drop this one down. */
-		num--;
-	}
-
-	return num;
-}
-
-int imap_messageset_parse(ARRAY_TYPE(seq_range) *dest, const char *messageset)
-{
-	uint32_t seq1, seq2;
-
-	while (*messageset != '\0') {
-		if (*messageset == '*') {
-			/* last message */
-			seq1 = (uint32_t)-1;
-			messageset++;
-		} else {
-			seq1 = get_next_number(&messageset);
-			if (seq1 == 0)
-				return -1;
-		}
-
-		if (*messageset != ':')
-			seq2 = seq1;
-		else {
-			/* first:last range */
-			messageset++;
-
-			if (*messageset == '*') {
-				seq2 = (uint32_t)-1;
-				messageset++;
-			} else {
-				seq2 = get_next_number(&messageset);
-				if (seq2 == 0)
-					return -1;
-			}
-		}
-
-		if (*messageset == ',')
-			messageset++;
-		else if (*messageset != '\0')
-			return -1;
-
-		if (seq1 > seq2) {
-			/* swap, as specified by RFC-3501 */
-			uint32_t temp = seq1;
-			seq1 = seq2;
-			seq2 = temp;
-		}
-
-		seq_range_array_add_range(dest, seq1, seq2);
-	}
-	return 0;
-}
--- a/src/lib-imap/imap-messageset.h	Thu Jun 05 05:16:31 2008 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,8 +0,0 @@
-#ifndef IMAP_MESSAGESET_H
-#define IMAP_MESSAGESET_H
-
-#include "seq-range-array.h"
-
-int imap_messageset_parse(ARRAY_TYPE(seq_range) *dest, const char *messageset);
-
-#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/lib-imap/imap-seqset.c	Fri Jun 06 23:54:30 2008 +0300
@@ -0,0 +1,93 @@
+/* Copyright (c) 2002-2008 Dovecot authors, see the included COPYING file */
+
+#include "lib.h"
+#include "imap-seqset.h"
+
+static uint32_t get_next_number(const char **str)
+{
+	uint32_t num;
+
+	num = 0;
+	while (**str != '\0') {
+		if (**str < '0' || **str > '9')
+			break;
+
+		num = num*10 + (**str - '0');
+		(*str)++;
+	}
+
+	if (num == (uint32_t)-1) {
+		/* FIXME: ugly hack, we're using this number to mean the
+		   last existing message. In reality UIDs should never get
+		   this high, so we can quite safely just drop this one down. */
+		num--;
+	}
+
+	return num;
+}
+
+static int
+get_next_seq_range(const char **str, uint32_t *seq1_r, uint32_t *seq2_r)
+{
+	uint32_t seq1, seq2;
+
+	if (**str == '*') {
+		/* last message */
+		seq1 = (uint32_t)-1;
+		*str += 1;
+	} else {
+		seq1 = get_next_number(str);
+		if (seq1 == 0)
+			return -1;
+	}
+
+	if (**str != ':')
+		seq2 = seq1;
+	else {
+		/* first:last range */
+		*str += 1;
+
+		if (**str == '*') {
+			seq2 = (uint32_t)-1;
+			*str += 1;
+		} else {
+			seq2 = get_next_number(str);
+			if (seq2 == 0)
+				return -1;
+		}
+	}
+
+	if (seq1 > seq2) {
+		/* swap, as specified by RFC-3501 */
+		*seq1_r = seq2;
+		*seq2_r = seq1;
+	} else {
+		*seq1_r = seq1;
+		*seq2_r = seq2;
+	}
+	return 0;
+}
+
+int imap_seq_set_parse(const char *str, ARRAY_TYPE(seq_range) *dest)
+{
+	uint32_t seq1, seq2;
+
+	while (*str != '\0') {
+		if (get_next_seq_range(&str, &seq1, &seq2) < 0)
+			return -1;
+		seq_range_array_add_range(dest, seq1, seq2);
+
+		if (*str == ',')
+			str++;
+		else if (*str != '\0')
+			return -1;
+	}
+	return 0;
+}
+
+int imap_seq_range_parse(const char *str, uint32_t *seq1_r, uint32_t *seq2_r)
+{
+	if (get_next_seq_range(&str, seq1_r, seq2_r) < 0)
+		return -1;
+	return *str == '\0' ? 0 : -1;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/lib-imap/imap-seqset.h	Fri Jun 06 23:54:30 2008 +0300
@@ -0,0 +1,13 @@
+#ifndef IMAP_SEQSET_H
+#define IMAP_SEQSET_H
+
+#include "seq-range-array.h"
+
+/* Parse IMAP sequence-set and store the result in dest. '*' is stored as
+   (uint32_t)-1. Returns 0 if successful, -1 if input is invalid. */
+int imap_seq_set_parse(const char *str, ARRAY_TYPE(seq_range) *dest);
+
+/* Parse IMAP seq-number / seq-range. */
+int imap_seq_range_parse(const char *str, uint32_t *seq1_r, uint32_t *seq2_r);
+
+#endif
--- a/src/lib-storage/mail-search-build.c	Thu Jun 05 05:16:31 2008 +0300
+++ b/src/lib-storage/mail-search-build.c	Fri Jun 06 23:54:30 2008 +0300
@@ -4,7 +4,7 @@
 #include "ioloop.h"
 #include "imap-date.h"
 #include "imap-parser.h"
-#include "imap-messageset.h"
+#include "imap-seqset.h"
 #include "mail-search-build.h"
 #include "mail-storage.h"
 
@@ -513,8 +513,8 @@
 				/* SEARCHRES: delay initialization */
 				return TRUE;
 			}
-			if (imap_messageset_parse(&sarg->value.seqset,
-						  sarg->value.str) < 0) {
+			if (imap_seq_set_parse(sarg->value.str,
+					       &sarg->value.seqset) < 0) {
 				data->error = "Invalid UID messageset";
 				return FALSE;
 			}
@@ -584,8 +584,7 @@
 
 			p_array_init(&(*next_sarg)->value.seqset,
 				     data->pool, 16);
-			if (imap_messageset_parse(&(*next_sarg)->value.seqset,
-						  str) < 0) {
+			if (imap_seq_set_parse(str, &(*next_sarg)->value.seqset) < 0) {
 				data->error = "Invalid messageset";
 				return FALSE;
 			}