annotate src/lib-imap/imap-seqset.c @ 9595:166a188f9165 HEAD

mbox: Fields weren't being added to cache file during message saving.
author Timo Sirainen <tss@iki.fi>
date Fri, 30 Jul 2010 16:55:58 +0100
parents 00cd9aacd03c
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9532
00cd9aacd03c Updated copyright notices to include year 2010.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
1 /* Copyright (c) 2002-2010 Dovecot authors, see the included COPYING file */
7649
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "imap-seqset.h"
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 static uint32_t get_next_number(const char **str)
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 {
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 uint32_t num;
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 num = 0;
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 while (**str != '\0') {
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 if (**str < '0' || **str > '9')
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 break;
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 num = num*10 + (**str - '0');
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 (*str)++;
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17 }
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 if (num == (uint32_t)-1) {
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 /* FIXME: ugly hack, we're using this number to mean the
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 last existing message. In reality UIDs should never get
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 this high, so we can quite safely just drop this one down. */
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23 num--;
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 }
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 return num;
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27 }
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29 static int
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30 get_next_seq_range(const char **str, uint32_t *seq1_r, uint32_t *seq2_r)
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31 {
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32 uint32_t seq1, seq2;
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34 if (**str == '*') {
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35 /* last message */
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36 seq1 = (uint32_t)-1;
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37 *str += 1;
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38 } else {
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 seq1 = get_next_number(str);
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 if (seq1 == 0)
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 return -1;
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 }
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 if (**str != ':')
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 seq2 = seq1;
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 else {
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 /* first:last range */
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48 *str += 1;
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50 if (**str == '*') {
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 seq2 = (uint32_t)-1;
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 *str += 1;
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53 } else {
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54 seq2 = get_next_number(str);
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55 if (seq2 == 0)
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 return -1;
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 }
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 }
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60 if (seq1 > seq2) {
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 /* swap, as specified by RFC-3501 */
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62 *seq1_r = seq2;
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 *seq2_r = seq1;
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64 } else {
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 *seq1_r = seq1;
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66 *seq2_r = seq2;
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67 }
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 return 0;
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
69 }
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71 int imap_seq_set_parse(const char *str, ARRAY_TYPE(seq_range) *dest)
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72 {
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73 uint32_t seq1, seq2;
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75 while (*str != '\0') {
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76 if (get_next_seq_range(&str, &seq1, &seq2) < 0)
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 return -1;
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78 seq_range_array_add_range(dest, seq1, seq2);
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80 if (*str == ',')
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81 str++;
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
82 else if (*str != '\0')
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83 return -1;
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
84 }
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
85 return 0;
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
86 }
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
88 int imap_seq_range_parse(const char *str, uint32_t *seq1_r, uint32_t *seq2_r)
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
89 {
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
90 if (get_next_seq_range(&str, seq1_r, seq2_r) < 0)
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
91 return -1;
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
92 return *str == '\0' ? 0 : -1;
efbfe9344c14 Renamed imap_messageset_parse() to imap_seq_set_parse().
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
93 }