Mercurial > dovecot > original-hg > dovecot-1.2
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 |
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 } |