t* sacc + cursorline and uri preview
       
   URI git clone git://git.codevoid.de/sacc-sdk
   DIR Log
   DIR Files
   DIR Refs
   DIR LICENSE
       ---
   DIR commit 5cef355a572cbf96818f75ebb5ad31be19bffb02
   DIR parent ad655e3c1be072eb6f0d1d61279028707c836a82
   URI Author: Quentin Rameau <quinq@fifth.space>
       Date:   Tue, 12 Sep 2017 02:01:50 +0200
       
       Change the Dir Item pointer array for an Item array
       
       We then allocate all items at once in molddiritem, saving us a lot of
       malloc calls.
       
       Diffstat:
         M common.h                            |       2 +-
         M sacc.c                              |      28 +++++++++++-----------------
         M ui_ti.c                             |      18 +++++++++---------
         M ui_txt.c                            |       8 ++++----
       
       4 files changed, 25 insertions(+), 31 deletions(-)
       ---
   DIR diff --git a/common.h b/common.h
       t@@ -16,7 +16,7 @@ struct item {
        };
        
        struct dir {
       -        Item **items;
       +        Item *items;
                size_t nitems;
                size_t printoff;
                size_t curline;
   DIR diff --git a/sacc.c b/sacc.c
       t@@ -101,7 +101,7 @@ static void
        clearitem(Item *item)
        {
                Dir *dir;
       -        Item **items;
       +        Item *items;
                char *tag;
                size_t i;
        
       t@@ -110,10 +110,8 @@ clearitem(Item *item)
        
                if (dir = item->dat) {
                        items = dir->items;
       -                for (i = 0; i < dir->nitems; ++i) {
       -                        clearitem(items[i]);
       -                        free(items[i]);
       -                }
       +                for (i = 0; i < dir->nitems; ++i)
       +                        clearitem(&items[i]);
                        free(items);
                        clear(&item->dat);
                }
       t@@ -222,21 +220,18 @@ invaliditem(char *raw)
                return (tabs == 3) ? NULL : raw;
        }
        
       -static Item *
       -molditem(char **raw)
       +static void
       +molditem(Item *item, char **raw)
        {
       -        Item *item;
                char *next;
        
                if (!*raw)
       -                return NULL;
       -
       -        item = xcalloc(sizeof(Item));
       +                return;
        
                if ((next = invaliditem(*raw))) {
                        item->username = *raw;
                        *raw = next;
       -                return item;
       +                return;
                }
        
                item->type = *raw[0]++;
       t@@ -246,14 +241,12 @@ molditem(char **raw)
                item->port = pickfield(raw, '\r');
                if (!*raw[0])
                        ++*raw;
       -
       -        return item;
        }
        
        static Dir *
        molddiritem(char *raw)
        {
       -        Item **items = NULL;
       +        Item *items = NULL;
                char *s, *nl, *p;
                Dir *dir;
                size_t i, nitems;
       t@@ -270,10 +263,11 @@ molddiritem(char *raw)
                }
        
                dir = xmalloc(sizeof(Dir));
       -        items = xreallocarray(items, nitems, sizeof(Item*));
       +        items = xreallocarray(items, nitems, sizeof(Item));
       +        memset(items, 0, nitems * sizeof(Item));
        
                for (i = 0; i < nitems; ++i)
       -                items[i] = molditem(&raw);
       +                molditem(&items[i], &raw);
        
                dir->items = items;
                dir->nitems = nitems;
   DIR diff --git a/ui_ti.c b/ui_ti.c
       t@@ -203,7 +203,7 @@ displayuri(Item *item)
        void
        uidisplay(Item *entry)
        {
       -        Item **items;
       +        Item *items;
                Dir *dir;
                size_t i, curln, lastln, nitems, printoff;
        
       t@@ -232,7 +232,7 @@ uidisplay(Item *entry)
                                putp(tparm(save_cursor));
                                putp(tparm(enter_standout_mode));
                        }
       -                printitem(items[i]);
       +                printitem(&items[i]);
                        putp(tparm(column_address, 0));
                        if (i == curln)
                                putp(tparm(exit_standout_mode));
       t@@ -258,7 +258,7 @@ movecurline(Item *item, int l)
                if (curline < 0 || curline >= nitems)
                        return;
        
       -        printitem(dir->items[dir->curline]);
       +        printitem(&dir->items[dir->curline]);
                dir->curline = curline;
        
                if (l > 0) {
       t@@ -268,7 +268,7 @@ movecurline(Item *item, int l)
        
                                putp(tparm(cursor_address, plines, 0));
                                putp(tparm(scroll_forward));
       -                        printitem(dir->items[offline]);
       +                        printitem(&dir->items[offline]);
        
                                putp(tparm(restore_cursor));
                                dir->printoff += l;
       t@@ -280,7 +280,7 @@ movecurline(Item *item, int l)
        
                                putp(tparm(cursor_address, 0, 0));
                                putp(tparm(scroll_reverse));
       -                        printitem(dir->items[offline]);
       +                        printitem(&dir->items[offline]);
                                putchar('\n');
        
                                putp(tparm(restore_cursor));
       t@@ -290,7 +290,7 @@ movecurline(Item *item, int l)
                
                putp(tparm(cursor_address, curline - dir->printoff, 0));
                putp(tparm(enter_standout_mode));
       -        printitem(dir->items[curline]);
       +        printitem(&dir->items[curline]);
                putp(tparm(exit_standout_mode));
                displaystatus(item);
                fflush(stdout);
       t@@ -349,7 +349,7 @@ nearentry(Item *entry, int direction)
                item = dir->curline + direction;
        
                for (; item >= 0 && item < lastitem; item += direction) {
       -                if (dir->items[item]->type != 'i')
       +                if (dir->items[item].type != 'i')
                                return item;
                }
        
       t@@ -410,7 +410,7 @@ uiselectitem(Item *entry)
                        case '\n':
                        pgnext:
                                if (dir)
       -                                return dir->items[dir->curline];
       +                                return &dir->items[dir->curline];
                                continue;
                        case _key_lndown:
                        lndown:
       t@@ -452,7 +452,7 @@ uiselectitem(Item *entry)
                                return entry;
                        case _key_uri:
                                if (dir)
       -                                displayuri(dir->items[dir->curline]);
       +                                displayuri(&dir->items[dir->curline]);
                                continue;
                        case _key_help: /* FALLTHROUGH */
                                return help(entry);
   DIR diff --git a/ui_txt.c b/ui_txt.c
       t@@ -113,7 +113,7 @@ uiprompt(char *fmt, ...)
        void
        uidisplay(Item *entry)
        {
       -        Item **items;
       +        Item *items;
                Dir *dir;
                size_t i, lines, nitems;
                int nd;
       t@@ -130,7 +130,7 @@ uidisplay(Item *entry)
        
                for (i = dir->printoff; i < nitems && i < lines; ++i) {
                        printf("%*zu %s %s\n",
       -                       nd, i+1, typedisplay(items[i]->type), items[i]->username);
       +                       nd, i+1, typedisplay(items[i].type), items[i].username);
                }
        
                fflush(stdout);
       t@@ -234,7 +234,7 @@ uiselectitem(Item *entry)
                                return entry;
                        case 'u':
                                if (item > 0 && item <= nitems)
       -                                printuri(dir->items[item-1], item);
       +                                printuri(&dir->items[item-1], item);
                                continue;
                        case 'h':
                        case '?':
       t@@ -250,7 +250,7 @@ uiselectitem(Item *entry)
                }
        
                if (item > 0)
       -                return dir->items[item-1];
       +                return &dir->items[item-1];
        
                return entry->entry;
        }