Fix performance regression for ~b/~B searching. (closes #3743) In mutt_is_autoview(), changeset b58cdfacfb89 introduced a call to rfc1524_mailcap_lookup() before checking if the MIME type should be autoviewed based on the user's preferences. This caused a major performance regression for ~b/~B searching. Rearrange mutt_is_autoview() to check the user preferences first, then search for a mailcap entry only if the MIME type should be autoviewed. In order to preserve correct mime_lookup behavior, re-add a call to mutt_check_lookup_list() before scanning the AutoViewList. diff -r 067a3ac42c3b -r 755a18da99bc handler.c --- a/handler.c Sun Apr 19 13:15:50 2015 -0700 +++ b/handler.c Sat Apr 25 19:00:13 2015 -0700 @@ -955,36 +955,38 @@ static int mutt_is_autoview (BODY *b) { char type[SHORT_STRING]; + int is_autoview = 0; snprintf (type, sizeof (type), "%s/%s", TYPE (b), b->subtype); + if (option(OPTIMPLICITAUTOVIEW)) + { + /* $implicit_autoview is essentially the same as "auto_view *" */ + is_autoview = 1; + } + else + { + /* determine if this type is on the user's auto_view list */ + LIST *t = AutoViewList; + + mutt_check_lookup_list (b, type, sizeof (type)); + for (; t; t = t->next) { + int i = mutt_strlen (t->data) - 1; + if ((i > 0 && t->data[i-1] == '/' && t->data[i] == '*' && + ascii_strncasecmp (type, t->data, i) == 0) || + ascii_strcasecmp (type, t->data) == 0) + is_autoview = 1; + } + + if (is_mmnoask (type)) + is_autoview = 1; + } + /* determine if there is a mailcap entry suitable for auto_view * - * WARNING: _type is altered by this call as a result of `mime_lookup' support */ - if (rfc1524_mailcap_lookup(b, type, NULL, M_AUTOVIEW)) - { - if (option(OPTIMPLICITAUTOVIEW)) - { - /* $implicit_autoview is essentially the same as "auto_view *" */ - return 1; - } - else - { - /* determine if this type is on the user's auto_view list */ - LIST *t = AutoViewList; - - for (; t; t = t->next) { - int i = mutt_strlen (t->data) - 1; - if ((i > 0 && t->data[i-1] == '/' && t->data[i] == '*' && - ascii_strncasecmp (type, t->data, i) == 0) || - ascii_strcasecmp (type, t->data) == 0) - return 1; - } - - if (is_mmnoask (type)) - return 1; - } - } + * WARNING: type is altered by this call as a result of `mime_lookup' support */ + if (is_autoview) + return rfc1524_mailcap_lookup(b, type, NULL, M_AUTOVIEW); return 0; }