Return-Path: X-Original-To: notmuch@notmuchmail.org Delivered-To: notmuch@notmuchmail.org Received: from localhost (localhost [127.0.0.1]) by arlo.cworth.org (Postfix) with ESMTP id 705EE6DE0C1E for ; Thu, 24 Sep 2015 05:34:22 -0700 (PDT) X-Virus-Scanned: Debian amavisd-new at cworth.org X-Spam-Flag: NO X-Spam-Score: 0.112 X-Spam-Level: X-Spam-Status: No, score=0.112 tagged_above=-999 required=5 tests=[AWL=0.112] autolearn=disabled Received: from arlo.cworth.org ([127.0.0.1]) by localhost (arlo.cworth.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id BVL9venosmGo for ; Thu, 24 Sep 2015 05:34:20 -0700 (PDT) Received: from gitolite.debian.net (gitolite.debian.net [87.98.215.224]) by arlo.cworth.org (Postfix) with ESMTPS id 3C4C06DE0B7C for ; Thu, 24 Sep 2015 05:34:20 -0700 (PDT) Received: from remotemail by gitolite.debian.net with local (Exim 4.80) (envelope-from ) id 1Zf5hQ-0006ga-I3; Thu, 24 Sep 2015 12:32:32 +0000 Received: (nullmailer pid 9111 invoked by uid 1000); Thu, 24 Sep 2015 12:32:13 -0000 From: David Bremner To: Jani Nikula , notmuch@notmuchmail.org Subject: Re: [PATCH v2 6/9] cli: change the data structure for notmuch address deduplication In-Reply-To: References: User-Agent: Notmuch/0.20.2+73~gd432116 (http://notmuchmail.org) Emacs/24.5.1 (x86_64-pc-linux-gnu) Date: Thu, 24 Sep 2015 09:32:13 -0300 Message-ID: <87fv242e2a.fsf@zancas.localnet> MIME-Version: 1.0 Content-Type: text/plain X-BeenThere: notmuch@notmuchmail.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: "Use and development of the notmuch mail system." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 24 Sep 2015 12:34:22 -0000 Jani Nikula writes: > + else > + v = !!m1->name - !!m2->name; Is this really idiomatic? It seems a little difficult to follow to me. > /* Returns TRUE iff name and addr is duplicate. If not, stores the > * name/addr pair in order to detect subsequent duplicates. */ > static notmuch_bool_t > is_duplicate (const search_context_t *ctx, const char *name, const char *addr) > { > char *key; > + GList *list, *l; > mailbox_t *mailbox; > > - key = talloc_asprintf (ctx->format, "%s <%s>", name, addr); > - if (! key) > - return FALSE; > + list = g_hash_table_lookup (ctx->addresses, addr); > + if (list) { > + mailbox_t find = { > + .name = name, > + .addr = addr, > + }; > + > + l = g_list_find_custom (list, &find, mailbox_compare); > + if (l) { > + mailbox = l->data; > + mailbox->count++; > + return TRUE; > + } > > - mailbox = g_hash_table_lookup (ctx->addresses, key); > - if (mailbox) { > - mailbox->count++; > - talloc_free (key); > - return TRUE; > + mailbox = new_mailbox (ctx->format, name, addr); > + if (! mailbox) > + return FALSE; > + > + /* > + * XXX: It would be more efficient to prepend to the list, but > + * then we'd have to store the changed list head back to the > + * hash table. This check is here just to avoid the compiler > + * warning for unused result. > + */ > + if (list != g_list_append (list, mailbox)) > + INTERNAL_ERROR ("appending to list changed list head\n"); > + > + return FALSE; > } > > + key = talloc_strdup (ctx->format, addr); > + if (! key) > + return FALSE; > + > mailbox = new_mailbox (ctx->format, name, addr); > if (! mailbox) > return FALSE; > > - g_hash_table_insert (ctx->addresses, key, mailbox); > + list = g_list_append (NULL, mailbox); > + if (! list) > + return FALSE; > + > + g_hash_table_insert (ctx->addresses, key, list); > > return FALSE; > } > @@ -401,12 +445,21 @@ _talloc_free_for_g_hash (void *ptr) > } > > static void > -print_hash_value (unused (gpointer key), gpointer value, gpointer user_data) > +_list_free_for_g_hash (void *ptr) > +{ > + g_list_free_full (ptr, _talloc_free_for_g_hash); > +} > + > +static void > +print_list_value (void *mailbox, void *context) > { > - const mailbox_t *mailbox = value; > - search_context_t *ctx = user_data; > + print_mailbox (context, mailbox); > +} > > - print_mailbox (ctx, mailbox); > +static void > +print_hash_value (unused (void *key), void *list, void *context) > +{ > + g_list_foreach (list, print_list_value, context); > } > > static int > @@ -792,8 +845,9 @@ notmuch_address_command (notmuch_config_t *config, int argc, char *argv[]) > argc - opt_index, argv + opt_index)) > return EXIT_FAILURE; > > - ctx->addresses = g_hash_table_new_full (g_str_hash, g_str_equal, > - _talloc_free_for_g_hash, _talloc_free_for_g_hash); > + ctx->addresses = g_hash_table_new_full (strcase_hash, strcase_equal, > + _talloc_free_for_g_hash, > + _list_free_for_g_hash); > > ret = do_search_messages (ctx); > > -- > 2.1.4 > > _______________________________________________ > notmuch mailing list > notmuch@notmuchmail.org > http://notmuchmail.org/mailman/listinfo/notmuch