changeset: 6930:7c97a8af8718 user: Kevin McCarthy <ke...@8t8.us> date: Fri Feb 10 13:01:21 2017 -0800 link: http://dev.mutt.org/hg/mutt/rev/7c97a8af8718
Change "allow_dups" into a flag at hash creation. Instead of having an "allow_dups" parameter for hash_insert(), add a flag, MUTT_HASH_ALLOW_DUPS, to hash_create(). Currently ReverseAlias, subj_hash, and thread_hash allow duplicate keys. Change those hashes to pass the flag at creation, and remove the last parameter from all callers of hash_insert(). diffs (265 lines): diff -r e2b186a92390 -r 7c97a8af8718 alias.c --- a/alias.c Fri Feb 10 12:56:42 2017 -0800 +++ b/alias.c Fri Feb 10 13:01:21 2017 -0800 @@ -465,7 +465,7 @@ for (ap = t->addr; ap; ap = ap->next) { if (!ap->group && ap->mailbox) - hash_insert (ReverseAlias, ap->mailbox, ap, 1); + hash_insert (ReverseAlias, ap->mailbox, ap); } } diff -r e2b186a92390 -r 7c97a8af8718 group.c --- a/group.c Fri Feb 10 12:56:42 2017 -0800 +++ b/group.c Fri Feb 10 13:01:21 2017 -0800 @@ -47,7 +47,7 @@ dprint (2, (debugfile, "mutt_pattern_group: Creating group %s.\n", k)); p = safe_calloc (1, sizeof (group_t)); p->name = safe_strdup (k); - hash_insert (Groups, p->name, p, 0); + hash_insert (Groups, p->name, p); } return p; diff -r e2b186a92390 -r 7c97a8af8718 hash.c --- a/hash.c Fri Feb 10 12:56:42 2017 -0800 +++ b/hash.c Fri Feb 10 13:01:21 2017 -0800 @@ -102,14 +102,18 @@ } if (flags & MUTT_HASH_STRDUP_KEYS) table->strdup_keys = 1; + if (flags & MUTT_HASH_ALLOW_DUPS) + table->allow_dups = 1; return table; } -HASH *int_hash_create (int nelem) +HASH *int_hash_create (int nelem, int flags) { HASH *table = new_hash (nelem); table->gen_hash = gen_int_hash; table->cmp_key = cmp_int_key; + if (flags & MUTT_HASH_ALLOW_DUPS) + table->allow_dups = 1; return table; } @@ -118,7 +122,7 @@ * data data to associate with `key' * allow_dup if nonzero, duplicate keys are allowed in the table */ -static int union_hash_insert (HASH * table, union hash_key key, void *data, int allow_dup) +static int union_hash_insert (HASH * table, union hash_key key, void *data) { struct hash_elem *ptr; unsigned int h; @@ -128,7 +132,7 @@ ptr->key = key; ptr->data = data; - if (allow_dup) + if (table->allow_dups) { ptr->next = table->table[h]; table->table[h] = ptr; @@ -158,18 +162,18 @@ return h; } -int hash_insert (HASH * table, const char *strkey, void *data, int allow_dup) +int hash_insert (HASH * table, const char *strkey, void *data) { union hash_key key; key.strkey = table->strdup_keys ? safe_strdup (strkey) : strkey; - return union_hash_insert (table, key, data, allow_dup); + return union_hash_insert (table, key, data); } -int int_hash_insert (HASH * table, unsigned int intkey, void *data, int allow_dup) +int int_hash_insert (HASH * table, unsigned int intkey, void *data) { union hash_key key; key.intkey = intkey; - return union_hash_insert (table, key, data, allow_dup); + return union_hash_insert (table, key, data); } static struct hash_elem *union_hash_find_elem (const HASH *table, union hash_key key) diff -r e2b186a92390 -r 7c97a8af8718 hash.h --- a/hash.h Fri Feb 10 12:56:42 2017 -0800 +++ b/hash.h Fri Feb 10 13:01:21 2017 -0800 @@ -35,7 +35,8 @@ typedef struct { int nelem; - int strdup_keys; /* if set, the key->strkey is strdup'ed */ + unsigned int strdup_keys : 1; /* if set, the key->strkey is strdup'ed */ + unsigned int allow_dups : 1; /* if set, duplicate keys are allowed */ struct hash_elem **table; unsigned int (*gen_hash)(union hash_key, unsigned int); int (*cmp_key)(union hash_key, union hash_key); @@ -45,12 +46,13 @@ /* flags for hash_create() */ #define MUTT_HASH_STRCASECMP (1<<0) /* use strcasecmp() to compare keys */ #define MUTT_HASH_STRDUP_KEYS (1<<1) /* make a copy of the keys */ +#define MUTT_HASH_ALLOW_DUPS (1<<2) /* allow duplicate keys to be inserted */ -HASH *hash_create (int nelem, int lower); -HASH *int_hash_create (int nelem); +HASH *hash_create (int nelem, int flags); +HASH *int_hash_create (int nelem, int flags); -int hash_insert (HASH * table, const char *key, void *data, int allow_dup); -int int_hash_insert (HASH *table, unsigned int key, void *data, int allow_dup); +int hash_insert (HASH * table, const char *key, void *data); +int int_hash_insert (HASH *table, unsigned int key, void *data); void *hash_find (const HASH *table, const char *key); struct hash_elem *hash_find_elem (const HASH *table, const char *strkey); diff -r e2b186a92390 -r 7c97a8af8718 headers.c --- a/headers.c Fri Feb 10 12:56:42 2017 -0800 +++ b/headers.c Fri Feb 10 13:01:21 2017 -0800 @@ -242,7 +242,7 @@ if (!elem) { count = 1; - hash_insert(ctx->label_hash, label, (void *)count, 0); + hash_insert(ctx->label_hash, label, (void *)count); return; } diff -r e2b186a92390 -r 7c97a8af8718 imap/message.c --- a/imap/message.c Fri Feb 10 12:56:42 2017 -0800 +++ b/imap/message.c Fri Feb 10 13:01:21 2017 -0800 @@ -60,12 +60,12 @@ ctx = idata->ctx; if (!idata->uid_hash) - idata->uid_hash = int_hash_create (MAX (6 * ctx->msgcount / 5, 30)); + idata->uid_hash = int_hash_create (MAX (6 * ctx->msgcount / 5, 30), 0); for (msgno = oldmsgcount; msgno < ctx->msgcount; msgno++) { h = ctx->hdrs[msgno]; - int_hash_insert (idata->uid_hash, HEADER_DATA(h)->uid, h, 0); + int_hash_insert (idata->uid_hash, HEADER_DATA(h)->uid, h); } } diff -r e2b186a92390 -r 7c97a8af8718 init.c --- a/init.c Fri Feb 10 12:56:42 2017 -0800 +++ b/init.c Fri Feb 10 13:01:21 2017 -0800 @@ -3249,7 +3249,8 @@ Groups = hash_create (1031, 0); /* reverse alias keys need to be strdup'ed because of idna conversions */ - ReverseAlias = hash_create (1031, MUTT_HASH_STRCASECMP | MUTT_HASH_STRDUP_KEYS); + ReverseAlias = hash_create (1031, MUTT_HASH_STRCASECMP | MUTT_HASH_STRDUP_KEYS | + MUTT_HASH_ALLOW_DUPS); mutt_menu_init (); mutt_srandom (); diff -r e2b186a92390 -r 7c97a8af8718 mh.c --- a/mh.c Fri Feb 10 12:56:42 2017 -0800 +++ b/mh.c Fri Feb 10 13:01:21 2017 -0800 @@ -2141,7 +2141,7 @@ { maildir_canon_filename (buf, p->h->path, sizeof (buf)); p->canon_fname = safe_strdup (buf); - hash_insert (fnames, p->canon_fname, p, 0); + hash_insert (fnames, p->canon_fname, p); } /* check for modifications and adjust flags */ @@ -2291,7 +2291,7 @@ { /* the hash key must survive past the header, which is freed below. */ p->canon_fname = safe_strdup (p->h->path); - hash_insert (fnames, p->canon_fname, p, 0); + hash_insert (fnames, p->canon_fname, p); } for (i = 0; i < ctx->msgcount; i++) diff -r e2b186a92390 -r 7c97a8af8718 mx.c --- a/mx.c Fri Feb 10 12:56:42 2017 -0800 +++ b/mx.c Fri Feb 10 13:01:21 2017 -0800 @@ -1420,9 +1420,9 @@ /* add this message to the hash tables */ if (ctx->id_hash && h->env->message_id) - hash_insert (ctx->id_hash, h->env->message_id, h, 0); + hash_insert (ctx->id_hash, h->env->message_id, h); if (ctx->subj_hash && h->env->real_subj) - hash_insert (ctx->subj_hash, h->env->real_subj, h, 1); + hash_insert (ctx->subj_hash, h->env->real_subj, h); mutt_label_hash_add (ctx, h); if (option (OPTSCORE)) diff -r e2b186a92390 -r 7c97a8af8718 pop.c --- a/pop.c Fri Feb 10 12:56:42 2017 -0800 +++ b/pop.c Fri Feb 10 13:01:21 2017 -0800 @@ -636,7 +636,7 @@ mutt_free_envelope (&h->env); h->env = mutt_read_rfc822_header (msg->fp, h, 0, 0); if (ctx->subj_hash && h->env->real_subj) - hash_insert (ctx->subj_hash, h->env->real_subj, h, 1); + hash_insert (ctx->subj_hash, h->env->real_subj, h); mutt_label_hash_add (ctx, h); h->data = uidl; diff -r e2b186a92390 -r 7c97a8af8718 thread.c --- a/thread.c Fri Feb 10 12:56:42 2017 -0800 +++ b/thread.c Fri Feb 10 13:01:21 2017 -0800 @@ -762,7 +762,7 @@ init = 1; if (init) - ctx->thread_hash = hash_create (ctx->msgcount * 2, 0); + ctx->thread_hash = hash_create (ctx->msgcount * 2, MUTT_HASH_ALLOW_DUPS); /* we want a quick way to see if things are actually attached to the top of the * thread tree or if they're just dangling, so we attach everything to a top @@ -834,7 +834,7 @@ cur->thread = thread; hash_insert (ctx->thread_hash, cur->env->message_id ? cur->env->message_id : "", - thread, 1); + thread); if (new) { @@ -921,7 +921,7 @@ if ((new = hash_find (ctx->thread_hash, ref->data)) == NULL) { new = safe_calloc (1, sizeof (THREAD)); - hash_insert (ctx->thread_hash, ref->data, new, 1); + hash_insert (ctx->thread_hash, ref->data, new); } else { @@ -1337,7 +1337,7 @@ { hdr = ctx->hdrs[i]; if (hdr->env->message_id) - hash_insert (hash, hdr->env->message_id, hdr, 0); + hash_insert (hash, hdr->env->message_id, hdr); } return hash; @@ -1349,13 +1349,13 @@ HEADER *hdr; HASH *hash; - hash = hash_create (ctx->msgcount * 2, 0); + hash = hash_create (ctx->msgcount * 2, MUTT_HASH_ALLOW_DUPS); for (i = 0; i < ctx->msgcount; i++) { hdr = ctx->hdrs[i]; if (hdr->env->real_subj) - hash_insert (hash, hdr->env->real_subj, hdr, 1); + hash_insert (hash, hdr->env->real_subj, hdr); } return hash;