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 82B9E6DE0B7C for ; Thu, 24 Sep 2015 11:34:54 -0700 (PDT) X-Virus-Scanned: Debian amavisd-new at cworth.org X-Spam-Flag: NO X-Spam-Score: -0.144 X-Spam-Level: X-Spam-Status: No, score=-0.144 tagged_above=-999 required=5 tests=[AWL=-0.168, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, URIBL_SBL=0.644, URIBL_SBL_A=0.1] 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 NBZ1QLCyxlg9 for ; Thu, 24 Sep 2015 11:34:52 -0700 (PDT) Received: from mail-wi0-f174.google.com (mail-wi0-f174.google.com [209.85.212.174]) by arlo.cworth.org (Postfix) with ESMTPS id 9DCC56DE0B64 for ; Thu, 24 Sep 2015 11:34:51 -0700 (PDT) Received: by wiclk2 with SMTP id lk2so125067381wic.1 for ; Thu, 24 Sep 2015 11:34:49 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:subject:in-reply-to:references :user-agent:date:message-id:mime-version:content-type; bh=AbjQtlAGaBJ7UpHzwYDcPbI+XjKqIo8M9MaZdTgxqDQ=; b=luQgGMFqrXZc8Zyzn21LO8p7nJmUB4V+eIGNsiDAcwJmzTOoqiv2UK0gdXeRB6AfkR PNDwj9k7TywwCR4NGv2nREhNlxtYqk7X4mlZ5KJH5Gd32uvTYZt/gF64lN0YJWxsHvv2 nsaF9tWk2FVE4UHVdrn2jZ+z2UyUQiepti6XOI0jWPfpiNdX+/K1bRJaCTFreH1zajor rOqqnY8eFnwTCenWB4DSflRJpWE2H9OwlmO/txqE4Uy4hzly3rCepjyyjDwd5T0RtbQv b/DVazpfyzjQyfxj8b+ZKCJHzsh9VFRNK0t+yHAJLzRSh9F4mWOmuogUZ6FzUhQWNILF yRCQ== X-Gm-Message-State: ALoCoQkmzFWDH7PeSVSxjElnnYSyDjjz6qpObdf8KjHfZ9DXRGmL6LVDpYJFDztbJHgemVfvuX/Q X-Received: by 10.194.116.67 with SMTP id ju3mr1165206wjb.143.1443119689474; Thu, 24 Sep 2015 11:34:49 -0700 (PDT) Received: from localhost (mobile-access-bcee63-221.dhcp.inet.fi. [188.238.99.221]) by smtp.gmail.com with ESMTPSA id jj8sm169536wid.2.2015.09.24.11.34.48 (version=TLSv1/SSLv3 cipher=OTHER); Thu, 24 Sep 2015 11:34:48 -0700 (PDT) From: Jani Nikula To: David Bremner , notmuch@notmuchmail.org Subject: Re: [PATCH v2 6/9] cli: change the data structure for notmuch address deduplication In-Reply-To: <87fv242e2a.fsf@zancas.localnet> References: <87fv242e2a.fsf@zancas.localnet> User-Agent: Notmuch/0.20.2+66~gb33abd9 (http://notmuchmail.org) Emacs/24.4.1 (x86_64-pc-linux-gnu) Date: Thu, 24 Sep 2015 21:34:30 +0300 Message-ID: <87612zwts9.fsf@nikula.org> 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 18:34:54 -0000 On Thu, 24 Sep 2015, David Bremner wrote: > Jani Nikula writes: > > >> + else >> + v = !!m1->name - !!m2->name; > > Is this really idiomatic? It seems a little difficult to follow to me. Probably depends on whether you're accustomed to using !! for "normalizing" zero and non-zero to 0 and 1, respectively. The alternative seemed a bit too verbose for my liking: if (m1->name && m2->name) v = strcmp (m1->name, m2->name); else if (!m1->name && !m2->name) v = 0; else if (m1->name) v = 1; else v = -1; I can live with that if you think the verbosity is in order here. (Or am I missing an obvious better alternative?) BR, Jani. > >> /* 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