AmendHub

Download:

jcs

/

detritus

/

amendments

/

52

*: Use a common plaintext line printer, add page free callback


jcs made amendment 52 about 1 year ago
--- browser.c Thu Nov 21 12:09:37 2024 +++ browser.c Thu Nov 21 16:42:39 2024 @@ -61,6 +61,7 @@ page_handle browser_create_page(struct browser *browse void browser_draw_status(struct browser *browser); struct TVStyle * browser_build_tvstyle(struct browser *browser); void browser_finished_loading(struct browser *browser); +void browser_page_free(page_handle pageh); void browser_follow_redir(struct browser *browser); void browser_stop_loading_page(struct browser *browser); void browser_free_links(struct browser *browser); @@ -266,9 +267,7 @@ browser_close(struct focusable *focusable) while (fpage) { HLock(fpage); tpage = (*fpage)->fwd_page; - (*fpage)->handler->request_cleanup(fpage); - xfree(&(*fpage)->uri); - DisposeHandle(fpage); + browser_page_free(fpage); fpage = tpage; } @@ -276,16 +275,12 @@ browser_close(struct focusable *focusable) while (bpage) { HLock(bpage); tpage = (*bpage)->back_page; - (*bpage)->handler->request_cleanup(bpage); - xfree(&(*bpage)->uri); - DisposeHandle(bpage); + browser_page_free(bpage); bpage = tpage; } HLock(pageh); - (*pageh)->handler->request_cleanup(pageh); - xfree(&(*pageh)->uri); - DisposeHandle(pageh); + browser_page_free(pageh); } browser_free_links(browser); @@ -358,15 +353,13 @@ browser_stop_loading_page(struct browser *browser) if ((*(browser->loading_page))->download_frefnum) FSClose((*(browser->loading_page))->download_frefnum); - if (page->request) - page->handler->request_cleanup(browser->loading_page); - /* only dispose if uncommitted */ if (browser->current_page == browser->loading_page) { + if (page->request) + page->handler->request_cleanup(browser->loading_page); HUnlock(browser->loading_page); } else { - xfree(&page->uri); - DisposeHandle(browser->loading_page); + browser_page_free(browser->loading_page); } browser->loading_page = NULL; @@ -807,9 +800,7 @@ browser_create_page(struct browser *browser, char *uri /* handler failed, no point in keeping page */ browser->loading_page = NULL; browser_update_buttons(browser); - (*pageh)->handler->request_cleanup(pageh); - xfree(&(*pageh)->uri); - DisposeHandle(pageh); + browser_page_free(pageh); return NULL; } @@ -1041,6 +1032,21 @@ browser_commit_to_loading_page(struct browser *browser browser_update_buttons(browser); } +void +browser_page_free(page_handle pageh) +{ + struct page *page = *pageh; + + if (page->handler->request_cleanup) + page->handler->request_cleanup(pageh); + + if (page->handler->free) + page->handler->free(pageh); + + xfree(&page->uri); + DisposeHandle(pageh); +} + bool browser_start_download(struct browser *browser, char *filename, char *dump_buf, size_t dump_len) @@ -1231,4 +1237,51 @@ page_request_cleanup(page_handle pageh) if (page->request) request_xfree(&page->request); -} +} + +bool +page_print_plaintext(page_handle pageh) +{ + struct page *page = *pageh; + size_t n, trail, skip, len, tlen, j; + bool newline; + + for (n = page->content_pos; n < page->content_len; n++) { + if (page->content[n] != '\n' && + !(n == page->content_len - 1 && !PAGE_CAN_READ_MORE(page))) + continue; + + len = n - page->content_pos + 1; + trail = 0; + skip = 0; + newline = false; + + if (page->content[n] == '\n') { + len--; + trail = 1; + newline = true; + + if (n > 0 && page->content[n - 1] == '\r') { + len--; + trail++; + } + } else if (page->request != NULL) + /* no newline at the end and fetching, so wait for more data */ + return true; + +print_line: + if (len) + browser_print(page->browser, + page->content + page->content_pos + skip, len, newline); + + page->content_pos += skip + len + trail; + } + + if (!PAGE_CAN_READ_MORE(page) && + page->content_pos < page->content_len) + browser_print(page->browser, + page->content + page->content_pos, + page->content_len - page->content_pos, false); + + return PAGE_CAN_READ_MORE(page); +} \ No newline at end of file --- browser.h Thu Nov 21 10:10:04 2024 +++ browser.h Thu Nov 21 16:23:28 2024 @@ -132,6 +132,9 @@ struct page_handler { /* reset an existing page to be parsed again with no request */ void (*reset)(page_handle pageh); + + /* free anything else the page allocated before we xfree page obj */ + void (*free)(page_handle pageh); }; struct browser * browser_init(void); @@ -152,6 +155,7 @@ bool browser_start_download(struct browser *browser, c /* generic versions */ +bool page_print_plaintext(page_handle pageh); bool page_queue_output(struct request *request, void *cookie, char **buf, size_t *len, bool did_write); bool page_consume_data(struct request *request, void *cookie, char **buf, --- detritus.h Mon Nov 18 17:17:02 2024 +++ detritus.h Thu Nov 21 11:45:29 2024 @@ -48,7 +48,10 @@ #define BOOKMARKS_MENU_EDIT_ID 1 #define BOOKMARKS_MENU_SEP_ID 2 +#define CURSOR_FINGER_ID 128 + extern MenuHandle file_menu, edit_menu, bookmarks_menu; +extern Cursor finger_cursor; struct default_bookmark { char name[64]; --- finger.c Wed Nov 20 13:23:27 2024 +++ finger.c Thu Nov 21 16:20:43 2024 @@ -93,34 +93,5 @@ finger_process(page_handle pageh) page->browser->style = STYLE_PRE; - /* text file, convert newlines and display */ - for (n = page->content_pos; n < page->content_len; n++) { - if (page->content[n] == '\r') { - browser_print(page->browser, - page->content + page->content_pos, - n - page->content_pos + 1, false); - page->content_pos = n + 1; - if (page->content[n + 1] == '\n') { - page->content_pos++; - n++; - } - } else if (page->content[n] == '\n') { - /* lone \n */ - if (n > page->content_pos) - browser_print(page->browser, - page->content + page->content_pos, - n - page->content_pos, true); - page->content_pos = n + 1; - } - } - - if (!PAGE_CAN_READ_MORE(page) && page->content_pos < page->content_len) { - /* no request to fetch more content, finish */ - browser_print(page->browser, page->content + page->content_pos, - page->content_len - page->content_pos, false); - page->content_pos = page->content_len; - ret = false; - } - - return ret; + return page_print_plaintext(pageh); } --- gopher.c Wed Nov 20 13:24:14 2024 +++ gopher.c Thu Nov 21 16:30:44 2024 @@ -41,6 +41,7 @@ struct gopher_page { bool gopher_accept_uri(struct URI *uri); bool gopher_request_init(page_handle pageh); bool gopher_process(page_handle pageh); +void gopher_free(page_handle pageh); static void gopher_print_menu(struct page *page, char *line, size_t len); @@ -52,6 +53,7 @@ struct page_handler gopher_handler = { page_request_cleanup, gopher_process, NULL, + gopher_free, }; bool @@ -181,35 +183,9 @@ gopher_process(page_handle pageh) } } else if (page->content_type[0] == '0') { /* text file, convert newlines and display */ - for (n = page->content_pos; n < page->content_len; n++) { - if (page->content[n] == '\r') { - browser_print(page->browser, - page->content + page->content_pos, - n - page->content_pos + 1, false); - page->content_pos = n + 1; - if (page->content[n + 1] == '\n') { - page->content_pos++; - n++; - } - } else if (page->content[n] == '\n') { - /* lone \n */ - if (n > page->content_pos) - browser_print(page->browser, - page->content + page->content_pos, - n - page->content_pos, true); - page->content_pos = n + 1; - } - } - - if (!PAGE_CAN_READ_MORE(page) && - page->content_pos < page->content_len) { - browser_print(page->browser, page->content + page->content_pos, - page->content_len - page->content_pos, false); - page->content_pos = page->content_len; - ret = false; - } + ret = page_print_plaintext(pageh); } else { - /* anything else, just show it */ + /* anything else, just show it as-is */ browser_print(page->browser, page->content + page->content_pos, page->content_len - page->content_pos, false); page->content_pos = page->content_len; @@ -217,6 +193,18 @@ gopher_process(page_handle pageh) } return ret; +} + +void +gopher_free(page_handle pageh) +{ + struct page *page = *pageh; + struct gopher_page *gopher; + + gopher = (struct gopher_page *)page->handler_cookie; + + ReleaseResource(gopher->sicn); + xfree(&page->handler_cookie); } static void --- http.c Wed Nov 20 13:35:04 2024 +++ http.c Thu Nov 21 16:27:58 2024 @@ -28,12 +28,14 @@ enum { PARSE_STATE_DOWNLOAD }; -extern bool print_html(struct page *page); +extern bool html_print(struct page *page); +extern void html_free(struct page *page); bool http_accept_uri(struct URI *uri); bool http_request_init(page_handle pageh); bool http_process(page_handle pageh); void http_reset(page_handle pageh); +void http_free(page_handle pageh); static void print_plaintext(struct page *page); @@ -45,6 +47,7 @@ struct page_handler http_handler = { page_request_cleanup, http_process, http_reset, + http_free, }; bool @@ -168,12 +171,12 @@ http_process(page_handle pageh) if (page->parse_state != PARSE_STATE_BODY) return true; - if (strncasecmp(page->content_type, "text/html", 9) == 0) - print_html(page); - else - print_plaintext(page); - - return PAGE_CAN_READ_MORE(page); + if (strncasecmp(page->content_type, "text/html", 9) == 0) { + html_print(page); + return PAGE_CAN_READ_MORE(page); + } + + return page_print_plaintext(pageh); } void @@ -187,44 +190,10 @@ http_reset(page_handle pageh) } void -print_plaintext(struct page *page) +http_free(page_handle pageh) { - size_t n, trail, skip, len, tlen, j; - bool newline; - - for (n = page->content_pos; n < page->content_len; n++) { - if (page->content[n] != '\n' && - !(n == page->content_len - 1 && !PAGE_CAN_READ_MORE(page))) - continue; - - len = n - page->content_pos + 1; - trail = 0; - skip = 0; - newline = false; - - if (page->content[n] == '\n') { - len--; - trail = 1; - newline = true; - - if (n > 0 && page->content[n - 1] == '\r') { - len--; - trail++; - } - } else if (page->request != NULL) - /* no newline at the end and fetching, so wait for more data */ - return; - -print_line: - if (len) - browser_print(page->browser, - page->content + page->content_pos + skip, len, newline); - - page->content_pos += skip + len + trail; - } + struct page *page = *pageh; - if (!PAGE_CAN_READ_MORE(page) && page->content_pos < page->content_len) - browser_print(page->browser, - page->content + page->content_pos, - page->content_len - page->content_pos, false); -} \ No newline at end of file + if (page->handler_cookie) + html_free(page); +}