sacc

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

commit 63737b1ffb50f53932a34001c0e6cc447d6d4e86
parent 1b724721acb63d32ea730b80348b7d96a27bbe09
Author: Quentin Rameau <quinq@fifth.space>
Date:   Mon, 10 Jul 2017 15:13:58 +0200

Add support for '7' search type

Diffstat:
common.h | 1+
sacc.c | 44++++++++++++++++++++++++++++++++++++++------
ui_ti.c | 39++++++++++++++++++++++++++++++++++++---
ui_txt.c | 19++++++++++++++++++-
4 files changed, 93 insertions(+), 10 deletions(-)

diff --git a/common.h b/common.h @@ -24,4 +24,5 @@ void display(Item *item); Item *selectitem(Item *entry); const char *typedisplay(char t); void uicleanup(void); +char *uiprompt(char *s); void uisetup(void); diff --git a/sacc.c b/sacc.c @@ -109,7 +109,7 @@ typedisplay(char t) case '6': return "UUEf|"; case '7': - return "Find|"; + return "Find+"; case '8': return "Tlnt|"; case '9': @@ -347,6 +347,23 @@ fetchitem(Item *item) return (item->raw != NULL); } +static char * +searchselector(Item *item) +{ + char *input, *selector = NULL; + size_t n; + + if (input = uiprompt("Enter search string: ")) { + selector = item->selector; + n = strlen(input)-1 + strlen(selector); + item->selector = xmalloc(n); + snprintf(item->selector, n, "%s\t%s", selector, input); + free(input); + } + + return selector; +} + static int dig(Item *entry, Item *item) { @@ -362,6 +379,7 @@ dig(Item *entry, Item *item) return 0; break; case '1': + case '7': if (!fetchitem(item) || !(item->dir = molddiritem(item->raw))) { fputs("Couldn't parse dir item\n", stderr); return 0; @@ -380,23 +398,37 @@ static void delve(Item *hole) { Item *entry = hole; + char *selector; while (hole) { - switch (dig(entry, hole)) { + switch (hole->type) { case '0': - displaytextitem(hole); + if (dig(entry, hole)) + displaytextitem(hole); break; case '1': - if (hole->dir) + if (dig(entry, hole) && hole->dir) entry = hole; break; + case '7': + if (selector = searchselector(hole)) { + free(hole->raw); + hole->raw = NULL; + hole->printoff = 0; + if (dig(entry, hole) && hole->dir) + entry = hole; + free(hole->selector); + hole->selector = selector; + } + break; case 0: fprintf(stderr, "Couldn't get %s:%s/%c%s\n", hole->host, hole->port, hole->type, hole->selector); } - display(entry); - hole = selectitem(entry); + do { + display(entry); + } while ((hole = selectitem(entry)) == entry); } } diff --git a/ui_ti.c b/ui_ti.c @@ -1,4 +1,5 @@ #include <stdio.h> +#include <stdlib.h> #include <term.h> #include <termios.h> #include <unistd.h> @@ -7,6 +8,7 @@ #include "common.h" static struct termios tsave; +static struct termios tsacc; /* navigation keys */ #define _key_lndown 'j' /* move one line down */ #define _key_lnup 'k' /* move one line up */ @@ -23,8 +25,6 @@ static struct termios tsave; void uisetup(void) { - struct termios traw; - tcgetattr(0, &tsave); tsacc = tsave; tsacc.c_lflag &= ~(ECHO|ICANON); @@ -46,6 +46,39 @@ uicleanup(void) fflush(stdout); } +char * +uiprompt(char *s) +{ + char *input = NULL; + size_t n = 0; + ssize_t r; + + putp(tparm(save_cursor)); + + putp(tparm(cursor_address, lines-1, 0)); + putp(tparm(clr_eol)); + putp(tparm(enter_standout_mode)); + fputs(s, stdout); + putp(tparm(exit_standout_mode)); + + tsacc.c_lflag |= (ECHO|ICANON); + tcsetattr(0, TCSANOW, &tsacc); + fflush(stdout); + + r = getline(&input, &n, stdin); + + tsacc.c_lflag &= ~(ECHO|ICANON); + tcsetattr(0, TCSANOW, &tsacc); + putp(tparm(restore_cursor)); + fflush(stdout); + + if (r > 1) + return input; + + free(input); + return NULL; +} + static void printitem(Item *item) { @@ -83,7 +116,7 @@ display(Item *entry) Item **items; size_t i, curln, lastln, nitems, printoff; - if (entry->type != '1') + if (!(entry->type == '1' || entry->type == '7')) return; putp(tparm(clear_screen)); diff --git a/ui_txt.c b/ui_txt.c @@ -1,6 +1,7 @@ #include <ctype.h> #include <errno.h> #include <stdio.h> +#include <stdlib.h> #include <string.h> #include <termios.h> #include <sys/ioctl.h> @@ -66,6 +67,22 @@ printstatus(Item *item, char c) item->host, item->port, item->selector, c); } +char * +uiprompt(char *s) +{ + char *input = NULL; + size_t n = 0; + + fputs(s, stdout); + fflush(stdout); + + if (getline(&input, &n, stdin) > 1) + return input; + + free(input); + return NULL; +} + void display(Item *entry) { @@ -73,7 +90,7 @@ display(Item *entry) size_t i, lines, nitems; int nd; - if (entry->type != '1' || !entry->dir) + if (!(entry->type == '1' || entry->type == '7') || !entry->dir) return; items = entry->dir->items;