sacc

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

commit 7a4910b180411ba8a2d1e20a64acd9a324e76b71
parent 79e35daca2237ca69767574fbcb29192acf1c9ef
Author: Quentin Rameau <quinq@fifth.space>
Date:   Tue, 20 Jun 2017 20:03:03 +0200

Let the user go back in browsing history

Diffstat:
sacc.c | 22+++++++++++++++-------
1 file changed, 15 insertions(+), 7 deletions(-)

diff --git a/sacc.c b/sacc.c @@ -275,15 +275,17 @@ connectto(const char *host, const char *port) } void -dig(Item *item) +dig(Item *entry, Item *item) { int sock; - if (item->type > '1') /* not supported */ + if (item->target || /* already in cache */ + item->type > '1') /* not supported */ return; sock = connectto(item->host, item->port); sendselector(sock, item->selector); + item->entry = entry; item->raw = getrawitem(sock); if (item->type == '0') @@ -357,21 +359,22 @@ parseurl(const char *URL) int main(int argc, char *argv[]) { - Item *hole; char buf[BUFSIZ]; + Item *entry, *hole; int n, itm; if (argc != 2) usage(); + entry = NULL; hole = parseurl(argv[1]); for (;;) { - dig(hole); + dig(entry, hole); if (!(n = display(hole))) break; do { - printf("%d items, visit (^D or q: quit): ", n); + printf("%d items, visit (0: back, ^D or q: quit): ", n); if (!fgets(buf, sizeof(buf), stdin)) { putchar('\n'); goto quit; @@ -380,8 +383,13 @@ main(int argc, char *argv[]) goto quit; if (sscanf(buf, "%d", &itm) != 1) continue; - } while (itm < 1 || itm > n); - hole = ((Item **)hole->target)[itm-1]; + } while (itm < 0 || itm > n); + if (itm) { + entry = hole; + hole = ((Item **)hole->target)[itm-1]; + } else if (hole->entry) { + hole = hole->entry; + } } quit: