tCache Gopher searches too - sacc - sacc (saccomys): simple gopher client.
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) LICENSE
       ---
 (DIR) commit 4d592c0484ac6270feba15d56c2796c2612a08c5
 (DIR) parent dd589fa72ace15295af2eb6a0426d2c49de3b524
 (HTM) Author: Quentin Rameau <quinq@fifth.space>
       Date:   Thu, 27 Jul 2017 01:43:38 +0200
       
       Cache Gopher searches too
       
       Diffstat:
         sacc.c                              |      69 ++++++++++++++++++++-----------
       
       1 file changed, 44 insertions(+), 25 deletions(-)
       ---
 (DIR) diff --git a/sacc.c b/sacc.c
       t@@ -463,23 +463,6 @@ 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(selector) + 1 + strlen(input);
       -                item->selector = xmalloc(n);
       -                snprintf(item->selector, n, "%s\t%s", selector, input);
       -                free(input);
       -        }
       -
       -        return selector;
       -}
       -
        static void
        plumb(char *url)
        {
       t@@ -597,11 +580,52 @@ dig(Item *entry, Item *item)
                return item->type;
        }
        
       +static char *
       +searchselector(Item *item)
       +{
       +        char *pexp, *exp, *tag, *selector = item->selector;
       +        size_t n = strlen(selector);
       +
       +        if ((tag = item->tag) && !strncmp(tag, selector, n))
       +                pexp = tag + n+1;
       +        else
       +                pexp = "";
       +
       +        if (!(exp = uiprompt("Enter search string (^D cancel) [%s]: ", pexp)))
       +                return NULL;
       +
       +        if (strcmp(exp, pexp) && exp[1]) {
       +                n += 1 + strlen(exp);
       +                tag = xmalloc(n);
       +                snprintf(tag, n, "%s\t%s", selector, exp);
       +        }
       +
       +        free(exp);
       +        return tag;
       +}
       +
       +static int
       +searchitem(Item *entry, Item *item)
       +{
       +        char *sel, *selector;
       +
       +        if (!(sel = searchselector(item)))
       +                return 0;
       +
       +        if (sel != item->tag) {
       +                clearitem(item);
       +                selector = item->selector;
       +                item->selector = item->tag = sel;
       +                dig(entry, item);
       +                item->selector = selector;
       +        }
       +        return (item->dat != NULL);
       +}
       +
        static void
        delve(Item *hole)
        {
                Item *entry = NULL;
       -        char *selector;
        
                while (hole) {
                        switch (hole->type) {
       t@@ -616,13 +640,8 @@ delve(Item *hole)
                                        entry = hole;
                                break;
                        case '7':
       -                        if (selector = searchselector(hole)) {
       -                                clear(&hole->raw);
       -                                if (dig(entry, hole) && hole->dat)
       -                                        entry = hole;
       -                                free(hole->selector);
       -                                hole->selector = selector;
       -                        }
       +                        if (searchitem(entry, hole))
       +                                entry = hole;
                                break;
                        case '4':
                        case '5':