Mercurial > dovecot > core-2.2
changeset 12127:6a99212b636d
maildir: Use array_bsearch() in uidlist instead of reimplementing it.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 16 Sep 2010 16:26:48 +0100 |
parents | 0540815363b6 |
children | b93405cdd4e9 |
files | src/lib-storage/index/maildir/maildir-uidlist.c |
diffstat | 1 files changed, 20 insertions(+), 28 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/index/maildir/maildir-uidlist.c Thu Sep 16 15:19:45 2010 +0100 +++ b/src/lib-storage/index/maildir/maildir-uidlist.c Thu Sep 16 16:26:48 2010 +0100 @@ -990,12 +990,18 @@ } static int +maildir_uid_bsearch_cmp(const uint32_t *uidp, + struct maildir_uidlist_rec *const *recp) +{ + return *uidp < (*recp)->uid ? -1 : + *uidp > (*recp)->uid ? 1 : 0; +} + +static int maildir_uidlist_lookup_rec(struct maildir_uidlist *uidlist, uint32_t uid, - unsigned int *idx_r, struct maildir_uidlist_rec **rec_r) { - struct maildir_uidlist_rec *const *recs; - unsigned int idx, left_idx, right_idx; + struct maildir_uidlist_rec *const *pos; if (!uidlist->initial_read) { /* first time we need to read uidlist */ @@ -1003,25 +1009,14 @@ return -1; } - idx = left_idx = 0; - recs = array_get(&uidlist->records, &right_idx); - while (left_idx < right_idx) { - idx = (left_idx + right_idx) / 2; - - if (recs[idx]->uid < uid) - left_idx = idx+1; - else if (recs[idx]->uid > uid) - right_idx = idx; - else { - *idx_r = idx; - *rec_r = recs[idx]; - return 1; - } + pos = array_bsearch(&uidlist->records, &uid, + maildir_uid_bsearch_cmp); + if (pos == NULL) { + *rec_r = NULL; + return 0; } - - if (idx > 0) idx--; - *idx_r = idx; - return 0; + *rec_r = *pos; + return 1; } int maildir_uidlist_lookup(struct maildir_uidlist *uidlist, uint32_t uid, @@ -1058,10 +1053,9 @@ const char **fname_r) { struct maildir_uidlist_rec *rec; - unsigned int idx; int ret; - if ((ret = maildir_uidlist_lookup_rec(uidlist, uid, &idx, &rec)) <= 0) + if ((ret = maildir_uidlist_lookup_rec(uidlist, uid, &rec)) <= 0) return ret; *flags_r = rec->flags; @@ -1074,11 +1068,10 @@ enum maildir_uidlist_rec_ext_key key) { struct maildir_uidlist_rec *rec; - unsigned int idx; const unsigned char *p; int ret; - ret = maildir_uidlist_lookup_rec(uidlist, uid, &idx, &rec); + ret = maildir_uidlist_lookup_rec(uidlist, uid, &rec); if (ret <= 0 || rec->extensions == NULL) return NULL; @@ -1153,13 +1146,12 @@ const char *value) { struct maildir_uidlist_rec *rec; - unsigned int idx; const unsigned char *p; buffer_t *buf; unsigned int len; int ret; - ret = maildir_uidlist_lookup_rec(uidlist, uid, &idx, &rec); + ret = maildir_uidlist_lookup_rec(uidlist, uid, &rec); if (ret <= 0) { if (ret < 0) return; @@ -1167,7 +1159,7 @@ /* maybe it's a new message */ if (maildir_uidlist_refresh(uidlist) < 0) return; - if (maildir_uidlist_lookup_rec(uidlist, uid, &idx, &rec) <= 0) { + if (maildir_uidlist_lookup_rec(uidlist, uid, &rec) <= 0) { /* message is already expunged, ignore */ return; }