]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Use array_bsearch*().
authorTimo Sirainen <tss@iki.fi>
Fri, 10 Jul 2009 17:59:32 +0000 (13:59 -0400)
committerTimo Sirainen <tss@iki.fi>
Fri, 10 Jul 2009 17:59:32 +0000 (13:59 -0400)
--HG--
branch : HEAD

12 files changed:
src/imap/imap-commands.c
src/imap/imap-fetch.c
src/lib-index/mail-index-strmap.c
src/lib-index/mailbox-list-index-sync.c
src/lib-mail/istream-header-filter.c
src/lib-storage/index/dbox/dbox-storage-rebuild.c
src/lib-storage/index/index-thread.c
src/lib-storage/index/maildir/maildir-uidlist.c
src/plugins/acl/acl-backend-vfile.c
src/plugins/fts/fts-storage.c
src/plugins/virtual/virtual-storage.c
src/plugins/virtual/virtual-sync.c

index 9aeeb1b17c0b24fe472445c285ed0bcdb9417e4b..6a2661dfe87145dd44603ceb1730c4686e1d7653 100644 (file)
@@ -109,26 +109,19 @@ static int command_cmp(const struct command *c1, const struct command *c2)
        return strcasecmp(c1->name, c2->name);
 }
 
-static int command_bsearch(const void *name, const void *cmd_p)
+static int command_bsearch(const char *name, const struct command *cmd)
 {
-        const struct command *cmd = cmd_p;
-
        return strcasecmp(name, cmd->name);
 }
 
 struct command *command_find(const char *name)
 {
-       const void *base;
-       unsigned int count;
-
        if (commands_unsorted) {
                array_sort(&imap_commands, command_cmp);
                 commands_unsorted = FALSE;
        }
 
-       base = array_get(&imap_commands, &count);
-       return bsearch(name, base, count, sizeof(struct command),
-                      command_bsearch);
+       return array_bsearch(&imap_commands, name, command_bsearch);
 }
 
 void commands_init(void)
index 2f5844d57c1ca8f0c11427b13241e3cbcbc00f47..826c49068755f967dd7bb4f9dab295b3794f4a39 100644 (file)
@@ -38,28 +38,23 @@ void imap_fetch_handlers_register(const struct imap_fetch_handler *handlers,
        array_sort(&fetch_handlers, imap_fetch_handler_cmp);
 }
 
-static int imap_fetch_handler_bsearch(const void *name_p, const void *handler_p)
+static int
+imap_fetch_handler_bsearch(const char *name, const struct imap_fetch_handler *h)
 {
-       const char *name = name_p;
-        const struct imap_fetch_handler *h = handler_p;
-
        return strcmp(name, h->name);
 }
 
 bool imap_fetch_init_handler(struct imap_fetch_context *ctx, const char *name,
                             const struct imap_arg **args)
 {
-       const struct imap_fetch_handler *handler, *handlers;
+       const struct imap_fetch_handler *handler;
        const char *lookup_name, *p;
-       unsigned int count;
 
        for (p = name; i_isalnum(*p); p++) ;
        lookup_name = t_strdup_until(name, p);
 
-       handlers = array_get_modifiable(&fetch_handlers, &count);
-       handler = bsearch(lookup_name, handlers, count,
-                         sizeof(struct imap_fetch_handler),
-                         imap_fetch_handler_bsearch);
+       handler = array_bsearch(&fetch_handlers, lookup_name,
+                               imap_fetch_handler_bsearch);
        if (handler == NULL) {
                client_send_command_error(ctx->cmd,
                        t_strconcat("Unknown parameter ", name, NULL));
index ec3a39e465d2b63303e1681a45e95fdcde739203..39caaf4031794f3ac62713c843eb8c9011f6f098 100644 (file)
@@ -1072,11 +1072,9 @@ static void mail_index_strmap_unlock(struct mail_index_strmap *strmap)
                file_dotlock_delete(&strmap->dotlock);
 }
 
-static int strmap_rec_cmp(const void *key, const void *value)
+static int
+strmap_rec_cmp(const uint32_t *uid, const struct mail_index_strmap_rec *rec)
 {
-       const uint32_t *uid = key;
-       const struct mail_index_strmap_rec *rec = value;
-
        return *uid < rec->uid ? -1 :
                (*uid > rec->uid ? 1 : 0);
 }
@@ -1112,10 +1110,11 @@ mail_index_strmap_write_append(struct mail_index_strmap_view *view)
           already have internally given it another index). So the only
           sensible choice is to write nothing and hope that the message goes
           away soon. */
-       old_recs = array_get(&view->recs, &old_count);
        next_uid = view->last_read_uid + 1;
-       (void)bsearch_insert_pos(&next_uid, old_recs, old_count,
-                                sizeof(*old_recs), strmap_rec_cmp, &i);
+       (void)array_bsearch_insert_pos(&view->recs, &next_uid,
+                                      strmap_rec_cmp, &i);
+
+       old_recs = array_get(&view->recs, &old_count);
        if (i < old_count) {
                while (i > 0 && old_recs[i-1].uid == old_recs[i].uid)
                        i--;
index 74474ee0a2dacfadc1779b924579b9158311fc03..5de5230d54517798bc6118b75c582ceac85d60fe 100644 (file)
@@ -136,11 +136,10 @@ mailbox_list_copy_sync_dir(struct mailbox_list_index_sync_ctx *ctx,
        return 0;
 }
 
-static int mailbox_list_sync_record_cmp(const void *_key, const void *_rec)
+static int
+mailbox_list_sync_record_cmp(const struct mailbox_list_sync_lookup_key *key,
+                            const struct mailbox_list_sync_record *rec)
 {
-       const struct mailbox_list_sync_lookup_key *key = _key;
-       const struct mailbox_list_sync_record *rec = _rec;
-
        if (key->name_hash < rec->name_hash)
                return -1;
        if (key->name_hash > rec->name_hash)
@@ -154,9 +153,6 @@ mailbox_list_sync_dir_lookup(struct mailbox_list_sync_dir *dir,
                             const char *name, unsigned int *idx_r)
 {
        struct mailbox_list_sync_lookup_key key;
-       struct mailbox_list_sync_record *recs;
-       unsigned int count;
-       bool match;
 
        /* binary search the current hierarchy level name. the values are
           sorted primarily by their hash value and secondarily by the actual
@@ -164,14 +160,11 @@ mailbox_list_sync_dir_lookup(struct mailbox_list_sync_dir *dir,
        key.name = name;
        key.name_hash = crc32_str(name);
 
-       recs = array_get_modifiable(&dir->records, &count);
-       match = bsearch_insert_pos(&key, recs, count, sizeof(*recs),
-                                  mailbox_list_sync_record_cmp,
-                                  idx_r);
-       if (!match)
+       if (!array_bsearch_insert_pos(&dir->records, &key,
+                                     mailbox_list_sync_record_cmp, idx_r))
                return NULL;
 
-       return &recs[*idx_r];
+       return array_idx_modifiable(&dir->records, *idx_r);
 }
 
 static struct mailbox_list_sync_record *
index 858d66177375d5731e012638b7fb5d3b0b23c7cc..1ee1fd0ef95d7adb387b583ede60990044b15afc 100644 (file)
@@ -86,25 +86,19 @@ read_mixed(struct header_filter_istream *mstream, size_t body_highwater_size)
        return ret;
 }
 
-static int cmp_uint(const void *p1, const void *p2)
+static int cmp_uint(const unsigned int *i1, const unsigned int *i2)
 {
-       const unsigned int *i1 = p1, *i2 = p2;
-
        return *i1 < *i2 ? -1 :
                (*i1 > *i2 ? 1 : 0);
 }
 
 static bool match_line_changed(struct header_filter_istream *mstream)
 {
-       const unsigned int *lines;
-       unsigned int count;
-
        if (!array_is_created(&mstream->match_change_lines))
                return FALSE;
 
-       lines = array_get(&mstream->match_change_lines, &count);
-       return bsearch(&mstream->cur_line, lines, count, sizeof(*lines),
-                      cmp_uint) != NULL;
+       return array_bsearch(&mstream->match_change_lines, &mstream->cur_line,
+                            cmp_uint) != NULL;
 }
 
 static void add_eol(struct header_filter_istream *mstream)
index 1a149e2d2d93641acc6e20e429470331d84bbdf9..993fc6b46dda6c50d35d891f55534e2bf5cd6dbb 100644 (file)
@@ -116,10 +116,9 @@ static int dbox_rebuild_msg_offset_cmp(const void *p1, const void *p2)
        return 0;
 }
 
-static int dbox_rebuild_msg_uid_cmp(const void *p1, const void *p2)
+static int dbox_rebuild_msg_uid_cmp(struct dbox_rebuild_msg *const *m1,
+                                   struct dbox_rebuild_msg *const *m2)
 {
-       const struct dbox_rebuild_msg *const *m1 = p1, *const *m2 = p2;
-
        if ((*m1)->map_uid < (*m2)->map_uid)
                return -1;
        if ((*m1)->map_uid > (*m2)->map_uid)
@@ -296,13 +295,10 @@ rebuild_lookup_map_uid(struct dbox_storage_rebuild_context *ctx,
                       uint32_t map_uid)
 {
        struct dbox_rebuild_msg search_msg, *search_msgp = &search_msg;
-       struct dbox_rebuild_msg *const *msgs, **pos;
-       unsigned int count;
+       struct dbox_rebuild_msg **pos;
 
        search_msg.map_uid = map_uid;
-       msgs = array_get(&ctx->msgs, &count);
-       pos = bsearch(&search_msgp, msgs, count, sizeof(*msgs),
-                     dbox_rebuild_msg_uid_cmp);
+       pos = array_bsearch(&ctx->msgs, &search_msgp, dbox_rebuild_msg_uid_cmp);
        return pos == NULL ? NULL : *pos;
 }
 
index 6d4d241910d02016e9b116981a8325eef77566d4..17b9a64b663d5bd8a7dbe438e76c2f78af9b0679 100644 (file)
@@ -436,9 +436,9 @@ static void mail_thread_cache_update_adds(struct mail_thread_mailbox *tbox,
        if (uid_count == 0)
                return;
 
+       (void)array_bsearch_insert_pos(tbox->msgid_map, &uids[0].seq1,
+                                      msgid_map_cmp, &j);
        msgid_map = array_get(tbox->msgid_map, &map_count);
-       (void)bsearch_insert_pos(&uids[0].seq1, msgid_map, map_count,
-                                sizeof(*msgid_map), msgid_map_cmp, &j);
        i_assert(j < map_count);
        while (j > 0 && msgid_map[j-1].uid == msgid_map[j].uid)
                j--;
index 0d181b66c050f1265f234fdaaed0e0c08be5a097..2f721637a0d690b60bdce5dbd3c284ac6f022d2d 100644 (file)
@@ -339,10 +339,9 @@ void maildir_uidlist_deinit(struct maildir_uidlist **_uidlist)
        i_free(uidlist);
 }
 
-static int maildir_uid_cmp(const void *p1, const void *p2)
+static int maildir_uid_cmp(struct maildir_uidlist_rec *const *rec1,
+                          struct maildir_uidlist_rec *const *rec2)
 {
-       const struct maildir_uidlist_rec *const *rec1 = p1, *const *rec2 = p2;
-
        return (*rec1)->uid < (*rec2)->uid ? -1 :
                (*rec1)->uid > (*rec2)->uid ? 1 : 0;
 }
@@ -400,12 +399,12 @@ maildir_uidlist_records_array_delete(struct maildir_uidlist *uidlist,
                                     struct maildir_uidlist_rec *rec)
 {
        struct maildir_uidlist_rec *const *recs, *const *pos;
-       unsigned int idx, count;
+       unsigned int idx;
 
-       recs = array_get(&uidlist->records, &count);
-       pos = bsearch(&rec, recs, count, sizeof(*recs), maildir_uid_cmp);
+       pos = array_bsearch(&uidlist->records, &rec, maildir_uid_cmp);
        i_assert(pos != NULL);
 
+       recs = array_idx(&uidlist->records, 0);
        idx = pos - recs;
        array_delete(&uidlist->records, idx, 1);
        return idx;
index 62366e32074a1279085ed911428c6533a9bc5813..a850ac45c685b8a4100489738b2d8c8474718049 100644 (file)
@@ -664,11 +664,6 @@ static int acl_rights_cmp(const struct acl_rights *r1,
        return null_strcmp(r1->identifier, r2->identifier);
 }
 
-static int acl_rights_bsearch_cmp(const void *p1, const void *p2)
-{
-       return acl_rights_cmp(p1, p2);
-}
-
 static void
 acl_rights_merge(pool_t pool, const char *const **destp, const char *const *src,
                 bool dup_strings)
@@ -1092,10 +1087,9 @@ acl_backend_vfile_object_update(struct acl_object *_aclobj,
        struct acl_object_vfile *aclobj = (struct acl_object_vfile *)_aclobj;
        struct acl_backend_vfile *backend =
                (struct acl_backend_vfile *)_aclobj->backend;
-       const struct acl_rights *rights;
        struct dotlock *dotlock;
        const char *path;
-       unsigned int i, count;
+       unsigned int i;
        int fd;
        bool changed;
 
@@ -1106,9 +1100,8 @@ acl_backend_vfile_object_update(struct acl_object *_aclobj,
        if (fd == -1)
                return -1;
 
-       rights = array_get(&aclobj->rights, &count);
-       if (!bsearch_insert_pos(&update->rights, rights, count, sizeof(*rights),
-                               acl_rights_bsearch_cmp, &i))
+       if (!array_bsearch_insert_pos(&aclobj->rights, &update->rights,
+                                     acl_rights_cmp, &i))
                changed = vfile_object_add_right(aclobj, i, update);
        else
                changed = vfile_object_modify_right(aclobj, i, update);
index 71a5284eeb4b52d297a434b915e5dfc77253a2dd..096de45e4efcee477ad5dfcfb4cf3f2e6e0f369d 100644 (file)
@@ -848,11 +848,8 @@ static void fts_mail_expunge(struct mail *_mail)
        fmail->module_ctx.super.expunge(_mail);
 }
 
-static int fts_score_cmp(const void *key, const void *data)
+static int fts_score_cmp(const uint32_t *uid, const struct fts_score_map *score)
 {
-       const uint32_t *uid = key;
-       const struct fts_score_map *score = data;
-
        return *uid < score->uid ? -1 :
                (*uid > score->uid ? 1 : 0);
 }
@@ -864,15 +861,13 @@ static int fts_mail_get_special(struct mail *_mail, enum mail_fetch_field field,
        struct fts_mail *fmail = FTS_MAIL_CONTEXT(mail);
        struct fts_transaction_context *ft = FTS_CONTEXT(_mail->transaction);
        const struct fts_score_map *scores;
-       unsigned int count;
 
        if (field != MAIL_FETCH_SEARCH_SCORE || ft->score_map == NULL ||
            !array_is_created(ft->score_map))
                scores = NULL;
        else {
-               scores = array_get(ft->score_map, &count);
-               scores = bsearch(&_mail->uid, scores, count, sizeof(*scores),
-                                fts_score_cmp);
+               scores = array_bsearch(ft->score_map, &_mail->uid,
+                                      fts_score_cmp);
        }
        if (scores != NULL) {
                i_assert(scores->uid == _mail->uid);
index b768ef06210ac155eef3821da914c5a4b7d6e283..adfb3dff4108f16318d1b77482c3013a3dcf3bef 100644 (file)
@@ -453,11 +453,9 @@ virtual_list_iter_is_mailbox(struct mailbox_list_iterate_context *ctx
        return ret;
 }
 
-static int virtual_backend_uidmap_cmp(const void *key, const void *data)
+static int virtual_backend_uidmap_cmp(const uint32_t *uid,
+                                     const struct virtual_backend_uidmap *map)
 {
-       const uint32_t *uid = key;
-       const struct virtual_backend_uidmap *map = data;
-
        return *uid < map->real_uid ? -1 :
                *uid > map->real_uid ? 1 : 0;
 }
@@ -471,7 +469,6 @@ virtual_get_virtual_uid(struct mailbox *box, const char *backend_mailbox,
        struct virtual_backend_box *bbox;
        struct mailbox_status status;
        const struct virtual_backend_uidmap *uids;
-       unsigned int count;
 
        if (strcmp(mbox->vseq_lookup_prev_mailbox, backend_mailbox) == 0)
                bbox = mbox->vseq_lookup_prev_bbox;
@@ -489,9 +486,8 @@ virtual_get_virtual_uid(struct mailbox *box, const char *backend_mailbox,
        if (status.uidvalidity != backend_uidvalidity)
                return FALSE;
 
-       uids = array_get(&bbox->uids, &count);
-       uids = bsearch(&backend_uid, uids, count, sizeof(*uids),
-                      virtual_backend_uidmap_cmp);
+       uids = array_bsearch(&bbox->uids, &backend_uid,
+                            virtual_backend_uidmap_cmp);
        if (uids == NULL)
                return FALSE;
 
index cef644ea7603eeff4f3515a81cca7b0e621bfe1f..e08e9b372c58ba440a85ee3e218a5bc5c1f59576 100644 (file)
@@ -473,11 +473,10 @@ static int virtual_sync_backend_box_init(struct virtual_backend_box *bbox)
        return ret;
 }
 
-static int virtual_backend_uidmap_bsearch_cmp(const void *key, const void *data)
+static int
+virtual_backend_uidmap_bsearch_cmp(const uint32_t *uidp,
+                                  const struct virtual_backend_uidmap *uidmap)
 {
-       const uint32_t *uidp = key;
-       const struct virtual_backend_uidmap *uidmap = data;
-
        return *uidp < uidmap->real_uid ? -1 :
                (*uidp > uidmap->real_uid ? 1 : 0);
 }
@@ -501,9 +500,8 @@ virtual_sync_mailbox_box_remove(struct virtual_sync_context *ctx,
        i_assert(rec_count >= uid_count);
 
        /* find the first uidmap record to be removed */
-       if (!bsearch_insert_pos(&uids[0].seq1, uidmap, rec_count,
-                               sizeof(*uidmap),
-                               virtual_backend_uidmap_bsearch_cmp, &src))
+       if (!array_bsearch_insert_pos(&bbox->uids, &uids[0].seq1,
+                                     virtual_backend_uidmap_bsearch_cmp, &src))
                i_unreached();
 
        /* remove the unwanted messages */
@@ -550,10 +548,9 @@ virtual_sync_mailbox_box_add(struct virtual_sync_context *ctx,
            added_uids[0].seq1 > uidmap[rec_count-1].real_uid) {
                /* fast path: usually messages are appended */
                dest = rec_count;
-       } else if (bsearch_insert_pos(&added_uids[0].seq1, uidmap, rec_count,
-                                     sizeof(*uidmap),
-                                     virtual_backend_uidmap_bsearch_cmp,
-                                     &dest))
+       } else if (array_bsearch_insert_pos(&bbox->uids, &added_uids[0].seq1,
+                                           virtual_backend_uidmap_bsearch_cmp,
+                                           &dest))
                i_unreached();
 
        /* make space for all added UIDs. */
@@ -724,9 +721,10 @@ static void virtual_sync_drop_existing(struct virtual_backend_box *bbox,
        if (!seq_range_array_iter_nth(&iter, n++, &add_uid))
                return;
 
+       (void)array_bsearch_insert_pos(&bbox->uids, &add_uid,
+                                      virtual_backend_uidmap_bsearch_cmp, &i);
+
        uidmap = array_get_modifiable(&bbox->uids, &count);
-       (void)bsearch_insert_pos(&add_uid, uidmap, count, sizeof(*uidmap),
-                                virtual_backend_uidmap_bsearch_cmp, &i);
        if (i == count)
                return;
 
@@ -760,11 +758,11 @@ static void virtual_sync_drop_nonexisting(struct virtual_backend_box *bbox,
        if (!seq_range_array_iter_nth(&iter, n++, &remove_uid))
                return;
 
-       uidmap = array_get_modifiable(&bbox->uids, &count);
-       (void)bsearch_insert_pos(&remove_uid, uidmap, count, sizeof(*uidmap),
-                                virtual_backend_uidmap_bsearch_cmp, &i);
+       (void)array_bsearch_insert_pos(&bbox->uids, &remove_uid,
+                                      virtual_backend_uidmap_bsearch_cmp, &i);
 
        t_array_init(&drop_uids, array_count(removed_uids)); iter_done = FALSE;
+       uidmap = array_get_modifiable(&bbox->uids, &count);
        for (; i < count; ) {
                if (uidmap[i].real_uid < remove_uid) {
                        i++;
@@ -862,9 +860,11 @@ static bool virtual_sync_find_seqs(struct virtual_backend_box *bbox,
 
        mail_index_lookup_uid(ibox->view, sync_rec->seq1, &uid1);
        mail_index_lookup_uid(ibox->view, sync_rec->seq2, &uid2);
+       (void)array_bsearch_insert_pos(&bbox->uids, &uid1,
+                                      virtual_backend_uidmap_bsearch_cmp,
+                                      &idx);
+
        uidmap = array_get_modifiable(&bbox->uids, &count);
-       (void)bsearch_insert_pos(&uid1, uidmap, count, sizeof(*uidmap),
-                                virtual_backend_uidmap_bsearch_cmp, &idx);
        if (idx == count || uidmap[idx].real_uid > uid2)
                return FALSE;
 
@@ -888,9 +888,10 @@ static void virtual_sync_expunge_add(struct virtual_sync_context *ctx,
 
        /* remember only the expunges for messages that
           already exist for this mailbox */
+       (void)array_bsearch_insert_pos(&bbox->uids, &uid1,
+                                      virtual_backend_uidmap_bsearch_cmp,
+                                      &idx1);
        uidmap = array_get_modifiable(&bbox->uids, &count);
-       (void)bsearch_insert_pos(&uid1, uidmap, count, sizeof(*uidmap),
-                                virtual_backend_uidmap_bsearch_cmp, &idx1);
        for (i = idx1; i < count; i++) {
                if (uidmap[i].real_uid > uid2)
                        break;
@@ -1196,7 +1197,7 @@ static void virtual_sync_backend_add_new(struct virtual_sync_context *ctx)
        struct virtual_backend_uidmap *uidmap;
        const struct mail_index_header *hdr;
        const struct virtual_mail_index_record *vrec;
-       unsigned int i, count, idx, uid_count;
+       unsigned int i, count, idx;
        uint32_t vseq, first_uid, next_uid;
 
        hdr = mail_index_get_header(ctx->sync_view);
@@ -1239,14 +1240,13 @@ static void virtual_sync_backend_add_new(struct virtual_sync_context *ctx)
                                                          vrec->mailbox_id);
                }
 
-               uidmap = array_get_modifiable(&bbox->uids, &uid_count);
-               if (!bsearch_insert_pos(&vrec->real_uid, uidmap, uid_count,
-                                       sizeof(*uidmap),
-                                       virtual_backend_uidmap_bsearch_cmp,
-                                       &idx))
+               if (!array_bsearch_insert_pos(&bbox->uids, &vrec->real_uid,
+                                             virtual_backend_uidmap_bsearch_cmp,
+                                             &idx))
                        i_unreached();
-               i_assert(uidmap[idx].virtual_uid == 0);
-               uidmap[idx].virtual_uid = first_uid + i;
+               uidmap = array_idx_modifiable(&bbox->uids, idx);
+               i_assert(uidmap->virtual_uid == 0);
+               uidmap->virtual_uid = first_uid + i;
        }
        ctx->mbox->sync_virtual_next_uid = first_uid + i;
 }