jcs
/detritus
/amendments
/23
gopher: Implement URL: handling, print all types the same but 'i'
jcs made amendment 23 about 1 year ago
--- gopher.c Mon Nov 4 10:52:28 2024
+++ gopher.c Mon Nov 4 13:57:29 2024
@@ -257,7 +257,8 @@ gopher_process(page_handle pageh)
page->content_len += slen;
browser_statusf(page->browser, "Read %ld bytes", page->content_len);
- if (page->content_len >= 3 &&
+ if ((page->type[0] == '0' || page->type[0] == '1' ||
+ page->type[0] == 3) && page->content_len >= 3 &&
(page->content_len == 3 ||
page->content[page->content_len - 4] == '\n') &&
page->content[page->content_len - 3] == '.' &&
@@ -343,10 +344,9 @@ parse_content(struct page *page)
/* text file, convert newlines and display */
for (n = page->content_pos; n < page->content_len; n++) {
if (page->content[n] == '\r') {
- if (n > page->content_pos)
- browser_print(page->browser,
- page->content + page->content_pos,
- n - page->content_pos + 1);
+ browser_print(page->browser,
+ page->content + page->content_pos,
+ n - page->content_pos + 1);
page->content_pos = n + 1;
if (page->content[n + 1] == '\n') {
page->content_pos++;
@@ -388,6 +388,7 @@ gopher_print_menu(struct page *page, char *line, size_
{
static char uri[URI_MAX_STR_LEN + 1], prefix[5];
char type, *label, *selector = NULL, *hostname = NULL;
+ size_t tlen;
unsigned short port = 0;
long n;
@@ -412,40 +413,24 @@ gopher_print_menu(struct page *page, char *line, size_
page->browser->style = STYLE_PRE;
switch (type) {
- case '0':
- /* text file */
- case '1':
- /* gopher submenu */
- case '2':
- /* CCSO nameserver? */
- case '7':
- /* search */
- case 'd':
- /* document */
-
- snprintf(prefix, sizeof(prefix), "[%c] ", type);
- browser_print(page->browser, prefix, 4);
-
- len = snprintf(uri, sizeof(uri), "gopher://%s/%c%s", hostname,
- type, selector);
- browser_print_link(page->browser, uri, len, label, strlen(label));
- browser_print(page->browser, "\r", 1);
- break;
case 'i':
/* informational */
browser_print(page->browser, label, strlen(label));
browser_print(page->browser, "\r", 1);
break;
default:
- browser_print(page->browser, "type: ", 0);
- browser_print(page->browser, (char *)&type, 1);
- //browser_print(page->browser, " label:", 0);
- //browser_print(page->browser, label, 0);
- //browser_print(page->browser, " selector:", 0);
- //browser_print(page->browser, selector, 0);
- //browser_print(page->browser, " host:", 0);
- //browser_print(page->browser, hostname, 0);
+ snprintf(prefix, sizeof(prefix), "[%c] ", type);
+ browser_print(page->browser, prefix, 4);
+
+ if (type == 'h' && strncmp(selector, "URL:", 4) == 0)
+ tlen = strlcpy(uri, selector + 4, sizeof(uri));
+ else
+ tlen = snprintf(uri, sizeof(uri), "gopher://%s/%c%s", hostname,
+ type, selector);
+
+ browser_print_link(page->browser, uri, tlen, label, strlen(label));
browser_print(page->browser, "\r", 1);
+ break;
}
for (n = 1; n < len; n++) {