From 355501614f5ab6533354973ce5516ad0a27e4589 Mon Sep 17 00:00:00 2001 From: randomuser Date: Thu, 25 Nov 2021 23:54:10 -0600 Subject: [PATCH] production quality software(tm) --- tls2.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 69 insertions(+), 18 deletions(-) diff --git a/tls2.c b/tls2.c index 934ea21..91b81cf 100644 --- a/tls2.c +++ b/tls2.c @@ -95,39 +95,90 @@ void manager(void *newdata, ll **ptr, ll **head) { (*ptr)->data = newdata; } +int is_link(char *c) { + return c[0] == '=' && c[1] == '>'; +} + +ll *scroll_ll(int direction, ll *current) { + if(direction) { + if(current->next) { + return current->next; + } + } else { + if(current->prev) { + return current->prev; + } + } + return current; +} + +void render(int yinit, int ymax, ll *data) { + ll *ptr2 = data; + erase(); + while(ptr2) { + mvprintw(yinit++, 0, "%s", ptr2->data); + ptr2 = ptr2->next; + if(yinit == ymax) break; + } +} + +ll *fetch_and_render(struct tls *ctx, int yinit, int ymax, char *url) { + tls_write(ctx, url, strlen(url)); + tls_write(ctx, "\r\n", 2); + ll *doc = NULL, *dochead = NULL, *links = NULL, *linkhead = NULL; + char *c; + int to_screen = 0; + + while(c = tls_incremental_line_read(ctx)) { + manager(c, &doc, &dochead); + if(is_link(c)) manager(c, &links, &linkhead); + if(!to_screen) { + mvwprintw(stdscr, yinit++, 0, "%s", c); + } else if(to_screen == 1) { + refresh(); + to_screen++; + } + if(yinit == ymax) to_screen = 1; + } + + ll *document = malloc(sizeof *document); + ll *rlinks = malloc(sizeof *rlinks); + + document->data = dochead; + document->next = rlinks; + document->prev = NULL; + + rlinks->data = linkhead; + rlinks->next = NULL; + rlinks->prev = document; + + return document; +} + int main(void) { struct tls *ctx = dial("tilde.club", "1965"); - char *c; + int tx, ty; + getmaxyx(stdscr, ty, tx); char getchb; - int y = 0; ll *ptr = NULL, *head = NULL; tls_write(ctx, &towrite, sizeof towrite); ncurses_init(); + ll *docdata = fetch_and_render(ctx, 1, ty, "gemini://tilde.club/"); - while(c = tls_incremental_line_read(ctx)) { - manager(c, &ptr, &head); - mvprintw(y++, 0, "%s", c); - } - - ptr = head; - ll *ptr2 = ptr; + ptr = docdata->data; while(ptr) { getchb = getch(); - erase(); - ptr2 = ptr; - y = 0; - while(ptr2) { - mvprintw(y++, 0, "%s", ptr2->data); - ptr2 = ptr2->next; - } if(getchb == 'k') { - if(ptr->prev) ptr = ptr->prev; + ptr = scroll_ll(TRUE, ptr); + } else if(getchb == 'q') { + ptr = NULL; } else { - if(ptr->next) ptr = ptr->next; + ptr = scroll_ll(FALSE, ptr); } + render(1, ty, ptr); } ncurses_cleanup();