commit 5cef355a572cbf96818f75ebb5ad31be19bffb02
parent ad655e3c1be072eb6f0d1d61279028707c836a82
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:
4 files changed, 25 insertions(+), 31 deletions(-)
diff --git a/common.h b/common.h
@@ -16,7 +16,7 @@ struct item {
};
struct dir {
- Item **items;
+ Item *items;
size_t nitems;
size_t printoff;
size_t curline;
diff --git a/sacc.c b/sacc.c
@@ -101,7 +101,7 @@ static void
clearitem(Item *item)
{
Dir *dir;
- Item **items;
+ Item *items;
char *tag;
size_t i;
@@ -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);
}
@@ -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]++;
@@ -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;
@@ -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;
diff --git a/ui_ti.c b/ui_ti.c
@@ -203,7 +203,7 @@ displayuri(Item *item)
void
uidisplay(Item *entry)
{
- Item **items;
+ Item *items;
Dir *dir;
size_t i, curln, lastln, nitems, printoff;
@@ -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));
@@ -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) {
@@ -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;
@@ -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));
@@ -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);
@@ -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;
}
@@ -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:
@@ -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);
diff --git a/ui_txt.c b/ui_txt.c
@@ -113,7 +113,7 @@ uiprompt(char *fmt, ...)
void
uidisplay(Item *entry)
{
- Item **items;
+ Item *items;
Dir *dir;
size_t i, lines, nitems;
int nd;
@@ -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);
@@ -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 '?':
@@ -250,7 +250,7 @@ uiselectitem(Item *entry)
}
if (item > 0)
- return dir->items[item-1];
+ return &dir->items[item-1];
return entry->entry;
}