t* sacc + cursorline and uri preview
       
   URI git clone git://git.codevoid.de/sacc-sdk
   DIR Log
   DIR Files
   DIR Refs
   DIR LICENSE
       ---
   DIR commit d8d55448c98ebba791bf971579705d44d99d0ae2
   DIR parent 333f17e3958157b11ccf7acbf778748ac564406d
   URI Author: Quentin Rameau <quinq@fifth.space>
       Date:   Wed, 21 Jun 2017 19:52:00 +0200
       
       Move navigation handling into its own function
       
       Diffstat:
         M sacc.c                              |      71 +++++++++++++++++--------------
       
       1 file changed, 38 insertions(+), 33 deletions(-)
       ---
   DIR diff --git a/sacc.c b/sacc.c
       t@@ -301,6 +301,42 @@ dig(Item *entry, Item *item)
                return 1;
        }
        
       +void
       +delve(Item *hole)
       +{
       +        char buf[BUFSIZ];
       +        Item *entry = NULL;
       +        int n, itm;
       +
       +        for (;;) {
       +                if (dig(entry, hole)) {
       +                        n = display(hole);
       +                } else {
       +                        n = 0;
       +                        fprintf(stderr, "Couldn't get %s:%s/%c%s\n",
       +                                hole->host, hole->port,
       +                                hole->type, hole->selector);
       +                }
       +                do {
       +                        printf("%d items, visit (0: back, ^D or q: quit): ", n);
       +                        if (!fgets(buf, sizeof(buf), stdin)) {
       +                                putchar('\n');
       +                                return;
       +                        }
       +                        if (!strcmp(buf, "q\n"))
       +                                return;
       +                        if (sscanf(buf, "%d", &itm) != 1)
       +                                continue;
       +                } while (itm < 0 || itm > n);
       +                if (itm) {
       +                        entry = hole;
       +                        hole = ((Item **)hole->target)[itm-1];
       +                } else if (hole->entry) {
       +                        hole = hole->entry;
       +                }
       +        }
       +}
       +
        Item *
        parseurl(const char *URL)
        {
       t@@ -366,45 +402,14 @@ parseurl(const char *URL)
        int
        main(int argc, char *argv[])
        {
       -        char buf[BUFSIZ];
       -        Item *entry, *hole;
       -        int n, itm;
       +        Item *hole;
        
                if (argc != 2)
                        usage();
        
       -        entry = NULL;
                hole = parseurl(argv[1]);
        
       -        for (;;) {
       -                if (dig(entry, hole)) {
       -                        n = display(hole);
       -                } else {
       -                        n = 0;
       -                        fprintf(stderr, "Couldn't get %s:%s/%c%s\n",
       -                                hole->host, hole->port,
       -                                hole->type, hole->selector);
       -                }
       -                do {
       -                        printf("%d items, visit (0: back, ^D or q: quit): ", n);
       -                        if (!fgets(buf, sizeof(buf), stdin)) {
       -                                putchar('\n');
       -                                goto quit;
       -                        }
       -                        if (!strcmp(buf, "q\n"))
       -                                goto quit;
       -                        if (sscanf(buf, "%d", &itm) != 1)
       -                                continue;
       -                } while (itm < 0 || itm > n);
       -                if (itm) {
       -                        entry = hole;
       -                        hole = ((Item **)hole->target)[itm-1];
       -                } else if (hole->entry) {
       -                        hole = hole->entry;
       -                }
       -        }
       -
       -quit:
       +        delve(hole);
                free(hole); /* TODO free all tree recursively */
        
                return 0;