Add support for '7' search type - sacc - sacc(omys), simple console gopher clie… | |
git clone git://bitreich.org/sacc/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65… | |
Log | |
Files | |
Refs | |
Tags | |
LICENSE | |
--- | |
commit 63737b1ffb50f53932a34001c0e6cc447d6d4e86 | |
parent 1b724721acb63d32ea730b80348b7d96a27bbe09 | |
Author: Quentin Rameau <[email protected]> | |
Date: Mon, 10 Jul 2017 15:13:58 +0200 | |
Add support for '7' search type | |
Diffstat: | |
M common.h | 1 + | |
M sacc.c | 44 ++++++++++++++++++++++++++---… | |
M ui_ti.c | 39 ++++++++++++++++++++++++++++-… | |
M 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->hos… | |
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; |