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);
+}