tseveral performance tweaks - dmenu - Dmenu fork with xft fonts.
 (HTM) git clone git://r-36.net/dmenu
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 542c58d8d00e26f23a5e0f09a9d1e68a7259db5e
 (DIR) parent 745c46d8fa810bbf45ef16e79a0f84c787f1a670
 (HTM) Author: anselm@anselm1 <unknown>
       Date:   Sat, 22 Mar 2008 14:52:00 +0000
       
       several performance tweaks
       Diffstat:
         Makefile                            |       2 +-
         dmenu.c                             |      61 ++++++++++++++++++++++---------
       
       2 files changed, 44 insertions(+), 19 deletions(-)
       ---
 (DIR) diff --git a/Makefile b/Makefile
       t@@ -1,5 +1,5 @@
        # dmenu - dynamic menu
       -# © 2006-2007 Anselm R. Garbe, Sander van Dijk
       +# See LICENSE file for copyright and license details.
        
        include config.mk
        
 (DIR) diff --git a/dmenu.c b/dmenu.c
       t@@ -35,13 +35,12 @@ typedef struct {
        typedef struct Item Item;
        struct Item {
                char *text;
       -        Bool matched;
                Item *next;                /* traverses all items */
                Item *left, *right;        /* traverses items matching current search pattern */
        };
        
        /* forward declarations */
       -Item *appenditem(Item *i, Item *last);
       +void appenditem(Item *i, Item **list, Item **last);
        void calcoffsets(void);
        char *cistrstr(const char *s, const char *sub);
        void cleanup(void);
       t@@ -92,17 +91,15 @@ Window root, win;
        int (*fstrncmp)(const char *, const char *, size_t n) = strncmp;
        char *(*fstrstr)(const char *, const char *) = strstr;
        
       -Item *
       -appenditem(Item *i, Item *last) {
       -        if(!last)
       -                item = i;
       +void
       +appenditem(Item *i, Item **list, Item **last) {
       +        if(!(*last))
       +                *list = i;
                else
       -                last->right = i;
       -        i->left = last;
       +                (*last)->right = i;
       +        i->left = *last;
                i->right = NULL;
       -        last = i;
       -        nitem++;
       -        return last;
       +        *last = i;
        }
        
        void
       t@@ -521,19 +518,47 @@ kpress(XKeyEvent * e) {
        void
        match(char *pattern) {
                unsigned int plen;
       -        Item *i, *j;
       +        Item *i, *itemend, *lexact, *lprefix, *lsubstr, *exactend, *prefixend, *substrend;
        
                if(!pattern)
                        return;
                plen = strlen(pattern);
       -        item = j = NULL;
       +        item = lexact = lprefix = lsubstr = itemend = exactend = prefixend = substrend = NULL;
                nitem = 0;
                for(i = allitems; i; i = i->next)
       -                if((i->matched = !fstrncmp(pattern, i->text, plen)))
       -                        j = appenditem(i, j);
       -        for(i = allitems; i; i = i->next)
       -                if(!i->matched && fstrstr(i->text, pattern))
       -                        j = appenditem(i, j);
       +                if(!fstrncmp(pattern, i->text, plen + 1)) {
       +                        appenditem(i, &lexact, &exactend);
       +                        nitem++;
       +                }
       +                else if(!fstrncmp(pattern, i->text, plen)) {
       +                        appenditem(i, &lprefix, &prefixend);
       +                        nitem++;
       +                }
       +                else if(fstrstr(i->text, pattern)) {
       +                        appenditem(i, &lsubstr, &substrend);
       +                        nitem++;
       +                }
       +        if(lexact) {
       +                item = lexact;
       +                itemend = exactend;
       +        }
       +        if(lprefix) {
       +                if(itemend) {
       +                        itemend->right - lprefix;
       +                        lprefix->left = itemend;
       +                }
       +                else
       +                        item = lprefix;
       +                itemend = prefixend;
       +        }
       +        if(lsubstr) {
       +                if(itemend) {
       +                        itemend->right = lsubstr;
       +                        lsubstr->left = itemend;
       +                }
       +                else
       +                        item = lsubstr;
       +        }
                curr = prev = next = sel = item;
                calcoffsets();
        }