about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--xxxterm.c77
1 files changed, 77 insertions, 0 deletions
diff --git a/xxxterm.c b/xxxterm.c
index e0af932..55c6e51 100644
--- a/xxxterm.c
+++ b/xxxterm.c
@@ -192,6 +192,14 @@ struct mime_type {
 };
 TAILQ_HEAD(mime_type_list, mime_type);
 
+/* uri aliases */
+struct alias {
+	char			*a_name;;
+	char			*a_uri;
+	TAILQ_ENTRY(alias)	 entry;
+};
+TAILQ_HEAD(alias_list, alias);
+
 /* settings */
 int			showtabs = 1;	/* show tabs on notebook */
 int			showurl = 1;	/* show url toolbar on notebook */
@@ -215,6 +223,7 @@ SoupSession		*session;
 SoupCookieJar		*cookiejar;
 
 struct mime_type_list	mtl;
+struct alias_list	aliases;
 
 /* protos */
 void			create_new_tab(char *, int);
@@ -243,11 +252,43 @@ valid_url_type(char *url)
 }
 
 char *
+match_alias(char *url_in)
+{
+	struct alias		*a;
+	char			*arg;
+	char			*url_out = NULL;
+
+	arg = url_in;
+	if (strsep(&arg, " \t") == NULL)
+		errx(1, "match_alias: NULL URL");
+
+	TAILQ_FOREACH(a, &aliases, entry) {
+		if (!strcmp(url_in, a->a_name))
+			break;
+	}
+
+	if (a != NULL) {
+		DNPRINTF(XT_D_URL, "match_alias: matched alias %s\n",
+			a->a_name);
+		if (arg != NULL)
+			asprintf(&url_out, a->a_uri, arg);
+		else
+			url_out = strdup(a->a_uri);
+	}
+
+	return (url_out);
+}
+
+char *
 guess_url_type(char *url_in)
 {
 	struct stat		sb;
 	char			*url_out = NULL;
 
+	url_out = match_alias(url_in);
+	if (url_out != NULL)
+		return (url_out);
+
 	/* XXX not sure about this heuristic */
 	if (stat(url_in, &sb) == 0) {
 		if (asprintf(&url_out, "file://%s", url_in) == -1)
@@ -267,6 +308,39 @@ guess_url_type(char *url_in)
 }
 
 void
+add_alias(char *line)
+{
+	char			*l, *alias;
+	struct alias		*a;
+
+	if (line == NULL)
+		errx(1, "add_alias");
+	l = line;
+
+	a = malloc(sizeof(*a));
+	if (a == NULL)
+		err(1, "add_alias: malloc");
+
+	if ((alias = strsep(&l, " \t,")) == NULL || l == NULL)
+		errx(1, "add_alias: incomplete alias definition");
+
+	if (strlen(alias) == 0 || strlen(l) == 0)
+		errx(1, "add_alias: invalid alias definition");
+
+	a->a_name = strdup(alias);
+	if (a->a_name == NULL)
+		err(1, "add_alias: malloc alias");
+
+	a->a_uri = strdup(l);
+	if (a->a_uri == NULL)
+		err(1, "add_alias: malloc uri");
+
+	DNPRINTF(XT_D_CONFIG, "add_alias: %s for %s\n", a->a_name, a->a_uri);
+
+	TAILQ_INSERT_TAIL(&aliases, a, entry);
+}
+
+void
 add_mime_type(char *line)
 {
 	char			*mime_type;
@@ -342,6 +416,7 @@ config_parse(char *filename)
 	DNPRINTF(XT_D_CONFIG, "config_parse: filename %s\n", filename);
 
 	TAILQ_INIT(&mtl);
+	TAILQ_INIT(&aliases);
 
 	if (filename == NULL)
 		return;
@@ -393,6 +468,8 @@ config_parse(char *filename)
 			fancy_bar = atoi(val);
 		else if (!strcmp(var, "mime_type"))
 			add_mime_type(val);
+		else if (!strcmp(var, "alias"))
+			add_alias(val);
 		else if (!strcmp(var, "http_proxy")) {
 			if (http_proxy)
 				free(http_proxy);