1
/* Copyright (c) 2002-2009 Dovecot authors, see the included COPYING file */
4
#include "imap-seqset.h"
6
static uint32_t get_next_number(const char **str)
11
while (**str != '\0') {
12
if (**str < '0' || **str > '9')
15
num = num*10 + (**str - '0');
19
if (num == (uint32_t)-1) {
20
/* FIXME: ugly hack, we're using this number to mean the
21
last existing message. In reality UIDs should never get
22
this high, so we can quite safely just drop this one down. */
30
get_next_seq_range(const char **str, uint32_t *seq1_r, uint32_t *seq2_r)
39
seq1 = get_next_number(str);
47
/* first:last range */
54
seq2 = get_next_number(str);
61
/* swap, as specified by RFC-3501 */
71
int imap_seq_set_parse(const char *str, ARRAY_TYPE(seq_range) *dest)
75
while (*str != '\0') {
76
if (get_next_seq_range(&str, &seq1, &seq2) < 0)
78
seq_range_array_add_range(dest, seq1, seq2);
82
else if (*str != '\0')
88
int imap_seq_range_parse(const char *str, uint32_t *seq1_r, uint32_t *seq2_r)
90
if (get_next_seq_range(&str, seq1_r, seq2_r) < 0)
92
return *str == '\0' ? 0 : -1;