shithub: castor9

Download patch

ref: 0f5e8eb6cd16ae6e1a54bf769826bd7df5cd321d
parent: 645dac214007d2edd60ea495a1e073cccdf482fc
author: Julien Blanchard <julien@typed-hole.org>
date: Fri Nov 27 12:31:20 EST 2020

Append protocol if needed

--- a/castor.c
+++ b/castor.c
@@ -118,6 +118,30 @@
 	return u;
 }
 
+int 
+starts_with(char *pre, char *str)
+{
+    int lenpre = strlen(pre),
+        lenstr = strlen(str);
+    return lenstr < lenpre ? 1 : memcmp(pre, str, lenpre);
+}
+
+char *
+protocol(char *link)
+{
+	if(strstr(link, "http://") != nil) {
+		return " [WWW]";
+	} else if(strstr(link, "https://") != nil) {
+		return " [WWW]";
+	} else if(strstr(link, "gopher://") != nil) {
+		return " [GOPHER]";
+	} else if(strstr(link, "finger://") != nil) {
+		return " [FINGER]";
+	} else {
+		return "";
+	}
+}
+
 void
 gemini_get(Url *url)
 {
@@ -163,8 +187,8 @@
 	{
 		if (strstr(line, "=>") == nil) {
 			/* Not a link so wrapping text */
-			char *base,*right_margin;
-    		int length,width;
+			char *base, *right_margin;
+    		int length, width;
 
     		length = strlen(strdup(line));
     		base = strdup(line);
@@ -181,12 +205,12 @@
         		while(!isspace(*right_margin))
         		{
             		right_margin--;
-            		if( right_margin == base)
+            		if(right_margin == base)
             		{
                 		right_margin += width;
                 		while(!isspace(*right_margin))
                 		{
-                    		if( *right_margin == '\0')
+                    		if(*right_margin == '\0')
                         		break;
                     		right_margin++;
                 		}
@@ -194,8 +218,8 @@
         		}
         		*right_margin = '\0';
 				plrtstr(&m->text, 1000000, 8, 0, font, strdup(cleanup(base)), 0, 0);
-        		length -= right_margin-base+1;      /* +1 for the space */
-        		base = right_margin+1;
+        		length -= right_margin - base + 1;      /* +1 for the space */
+        		base = right_margin + 1;
     		}
 		} else {
 			/* a link */
@@ -203,7 +227,11 @@
 			strtok(copy, " ");
 			char *link = strtok(NULL, " ");
 			char *rest = strtok(NULL, "\0");
-			char *label = smprint("→ %s", rest);
+			while(isspace(*rest))
+ 				rest++;
+
+			char *label = smprint("→ %s%s", rest, protocol(link));
+
 			plrtstr(&m->text, 1000000, 8, 0, font, strdup(label), PL_HOT, strdup(link));
 		}
 		free(line);
@@ -278,8 +306,10 @@
 	char *link = rt->user;
 
 	copy = link;
-	if ((strpbrk(link, " :/") == nil) || link[0] == '/') {
+	int len = strlen(copy);
+	if ((strpbrk(link, " :/") == nil) || link[0] == '/' || link[len-1] == '/') {
 		/* assuming relative URL */
+		message(copy);
 		if (*copy == '/') {
 			next_url = smprint("gemini://%s:%s/%s", current_url->server, current_url->port, copy+1);
 		} else {