sacc

sacc (saccomys): simple gopher client.
Log | Files | Refs | LICENSE

commit 9a618bec82d956de8d6a2d67539eb19f6790944e
parent 5f125c4f75c25a0bd4aeecc9625307c52f6a8c41
Author: Quentin Rameau <quinq@fifth.space>
Date:   Thu, 13 Jul 2017 00:24:53 +0200

Move printoff and curline to struct dir

Diffstat:
common.h | 6+++---
sacc.c | 10+++-------
ui_ti.c | 64+++++++++++++++++++++++++++++++++-------------------------------
ui_txt.c | 31++++++++++++++++---------------
4 files changed, 55 insertions(+), 56 deletions(-)

diff --git a/common.h b/common.h @@ -10,15 +10,15 @@ struct item { char *host; char *port; char *raw; - size_t printoff; - size_t curline; - Item *entry; void *dat; + Item *entry; }; struct dir { Item **items; size_t nitems; + size_t printoff; + size_t curline; }; void die(const char *fmt, ...); diff --git a/sacc.c b/sacc.c @@ -263,6 +263,7 @@ molddiritem(char *raw) dir->items = items; dir->nitems = nitems; + dir->printoff = dir->curline = 0; return dir; } @@ -485,9 +486,7 @@ delve(Item *hole) break; case '7': if (selector = searchselector(hole)) { - free(hole->raw); - hole->raw = NULL; - hole->printoff = 0; + clear(hole->raw); if (dig(entry, hole) && hole->dat) entry = hole; free(hole->selector); @@ -568,10 +567,7 @@ moldentry(char *url) entry->host = host; entry->port = port; entry->entry = entry; - entry->printoff = 0; - entry->curline = 0; - entry->raw = NULL; - entry->dat = NULL; + entry->raw = entry->dat = NULL; return entry; } diff --git a/ui_ti.c b/ui_ti.c @@ -94,15 +94,17 @@ help(void) static void displaystatus(Item *item) { - size_t nitems = item->dat ? ((Dir*)item->dat)->nitems : 0; + Dir *dir = item->dat; + size_t nitems = dir ? dir->nitems : 0; + unsigned long long printoff = dir ? dir->printoff : 0; putp(tparm(save_cursor)); putp(tparm(cursor_address, lines-1, 0)); putp(tparm(enter_standout_mode)); printf("%3lld%%| %s:%s%s", - (item->printoff + lines-1 >= nitems) ? 100 : - ((unsigned long long)item->printoff + lines-1) * 100 / nitems, + (printoff + lines-1 >= nitems) ? 100 : + (printoff + lines-1) * 100 / nitems, item->host, item->port, item->selector); putp(tparm(exit_standout_mode)); @@ -130,8 +132,8 @@ display(Item *entry) items = dir->items; nitems = dir->nitems; - printoff = entry->printoff; - curln = entry->curline; + printoff = dir->printoff; + curln = dir->curline; lastln = printoff + lines-1; /* one off for status bar */ for (i = printoff; i < nitems && i < lastln; ++i) { @@ -162,17 +164,17 @@ movecurline(Item *item, int l) if (dir == NULL) return; - curline = item->curline + l; + curline = dir->curline + l; nitems = dir->nitems; if (curline < 0 || curline >= nitems) return; - printitem(dir->items[item->curline]); - item->curline = curline; + printitem(dir->items[dir->curline]); + dir->curline = curline; if (l > 0) { - offline = item->printoff + lines-1; - if (curline - item->printoff >= plines / 2 && offline < nitems) { + offline = dir->printoff + lines-1; + if (curline - dir->printoff >= plines / 2 && offline < nitems) { putp(tparm(save_cursor)); putp(tparm(cursor_address, plines, 0)); @@ -180,10 +182,10 @@ movecurline(Item *item, int l) printitem(dir->items[offline]); putp(tparm(restore_cursor)); - item->printoff += l; + dir->printoff += l; } } else { - offline = item->printoff + l; + offline = dir->printoff + l; if (curline - offline <= plines / 2 && offline >= 0) { putp(tparm(save_cursor)); @@ -193,11 +195,11 @@ movecurline(Item *item, int l) putchar('\n'); putp(tparm(restore_cursor)); - item->printoff += l; + dir->printoff += l; } } - putp(tparm(cursor_address, curline - item->printoff, 0)); + putp(tparm(cursor_address, curline - dir->printoff, 0)); putp(tparm(enter_standout_mode)); printitem(dir->items[curline]); putp(tparm(exit_standout_mode)); @@ -218,27 +220,27 @@ jumptoline(Item *entry, ssize_t offset) nitems = dir->nitems; if (offset <= 0) { - if (!entry->curline) + if (!dir->curline) return; - entry->printoff = 0; - entry->curline = 0; + dir->printoff = 0; + dir->curline = 0; } else if (offset + plines < nitems) { - entry->printoff = offset; - entry->curline = offset; - } else if (entry->curline == nitems-1) { + dir->printoff = offset; + dir->curline = offset; + } else if (dir->curline == nitems-1) { return; } else if (nitems < plines) { - entry->curline = nitems-1; + dir->curline = nitems-1; } else if (offset == nitems) { - entry->printoff = nitems-1 - plines; - entry->curline = nitems-1; + dir->printoff = nitems-1 - plines; + dir->curline = nitems-1; } else { offset = nitems-1 - plines; - if (entry->printoff == offset) - entry->curline = nitems-1; - else if (entry->curline < offset) - entry->curline = offset; - entry->printoff = offset; + if (dir->printoff == offset) + dir->curline = nitems-1; + else if (dir->curline < offset) + dir->curline = offset; + dir->printoff = offset; } display(entry); @@ -296,7 +298,7 @@ selectitem(Item *entry) case '\n': pgnext: if (dir) - return dir->items[entry->curline]; + return dir->items[dir->curline]; continue; case _key_lndown: lndown: @@ -304,7 +306,7 @@ selectitem(Item *entry) continue; case _key_pgdown: pgdown: - jumptoline(entry, entry->printoff + plines); + jumptoline(entry, dir->printoff + plines); continue; case _key_end: end: @@ -316,7 +318,7 @@ selectitem(Item *entry) continue; case _key_pgup: pgup: - jumptoline(entry, entry->printoff - plines); + jumptoline(entry, dir->printoff - plines); continue; case _key_home: home: diff --git a/ui_txt.c b/ui_txt.c @@ -58,12 +58,13 @@ ndigits(size_t n) static void printstatus(Item *item, char c) { - size_t nitems = item->dat ? ((Dir*)item->dat)->nitems : 0; + Dir *dir = item->dat; + size_t nitems = dir ? dir->nitems : 0; + unsigned long long printoff = dir ? dir->printoff : 0; printf("%3lld%%%*c %s:%s%s [%c]: ", - (item->printoff + lines >= nitems) ? 100 : - ((unsigned long long)item->printoff + lines) * 100 / nitems, - ndigits(nitems)+2, '|', + (printoff + lines >= nitems) ? 100 : + (printoff + lines) * 100 / nitems, ndigits(nitems)+2, '|', item->host, item->port, item->selector, c); } @@ -96,10 +97,10 @@ display(Item *entry) items = dir->items; nitems = dir->nitems; - lines = entry->printoff + termlines(); + lines = dir->printoff + termlines(); nd = ndigits(nitems); - for (i = entry->printoff; i < nitems && i < lines; ++i) { + for (i = dir->printoff; i < nitems && i < lines; ++i) { printf("%*zu %s %s\n", nd, i+1, typedisplay(items[i]->type), items[i]->username); } @@ -140,26 +141,26 @@ selectitem(Item *entry) return NULL; case 'n': lines = termlines(); - if (lines < nitems - entry->printoff && - lines < (size_t)-1 - entry->printoff) - entry->printoff += lines; + if (lines < nitems - dir->printoff && + lines < (size_t)-1 - dir->printoff) + dir->printoff += lines; return entry; case 'p': lines = termlines(); - if (lines <= entry->printoff) - entry->printoff -= lines; + if (lines <= dir->printoff) + dir->printoff -= lines; else - entry->printoff = 0; + dir->printoff = 0; return entry; case 'b': lines = termlines(); if (nitems > lines) - entry->printoff = nitems - lines; + dir->printoff = nitems - lines; else - entry->printoff = 0; + dir->printoff = 0; return entry; case 't': - entry->printoff = 0; + dir->printoff = 0; return entry; case '!': if (entry->raw)