about summary refs log tree commit diff stats
path: root/xombrero.c
diff options
context:
space:
mode:
authorJosh Rickmar <jrick@devio.us>2012-06-01 17:22:42 -0400
committerJosh Rickmar <jrick@devio.us>2012-06-01 17:22:42 -0400
commit861831aad1d1114be754d027683a46bf20e5b664 (patch)
treeab9f2103bb4ace275bc19419f45fe1fca42f5c39 /xombrero.c
parent1df03fd0b17313e7d953dcb0e14d6849207ca0dc (diff)
downloadxombrero-861831aad1d1114be754d027683a46bf20e5b664.tar.gz
Add a cmd_alias feature to set an alias for a :command, and document
it in the manpage.
Diffstat (limited to 'xombrero.c')
-rw-r--r--xombrero.c63
1 files changed, 43 insertions, 20 deletions
diff --git a/xombrero.c b/xombrero.c
index 67dac8b..0c7840b 100644
--- a/xombrero.c
+++ b/xombrero.c
@@ -221,6 +221,7 @@ struct undo_tailq	undos;
 struct keybinding_list	kbl;
 struct sp_list		spl;
 struct user_agent_list	ua_list;
+struct cmd_alias_list	cal;
 struct custom_uri_list	cul;
 int			user_agent_count = 0;
 struct command_list	chl;
@@ -5855,32 +5856,54 @@ cmd_complete(struct tab *t, char *str, int dir)
 	g_free(sc);
 }
 
-gboolean
-cmd_execute(struct tab *t, char *str)
+char *
+parse_prefix_and_alias(const char *str, int *prefix)
 {
-	struct cmd		*cmd = NULL;
-	char			*tok, *last = NULL, *s = g_strdup(str), *sc;
-	char			prefixstr[4];
-	int			j, len, c = 0, dep = 0, matchcount = 0;
-	int			prefix = -1, rv = XT_CB_PASSTHROUGH;
-	struct karg		arg = {0, NULL, -1};
+	struct cmd_alias	*c;
+	char			*s = g_strdup(str), *sc;
+	char			hasprefix = 0;
 
+	g_strstrip(s);
 	sc = s;
 
-	/* copy prefix*/
-	for (j = 0; j<3 && isdigit(s[j]); j++)
-		prefixstr[j]=s[j];
+	if (isdigit(s[0])) {
+		hasprefix = 1;
+		sscanf(s, "%d", prefix);
+		while (isdigit(s[0]) || isspace(s[0]))
+			++s;
+	}
 
-	prefixstr[j]='\0';
+	TAILQ_FOREACH(c, &cal, entry) {
+		if (strncmp(s, c->alias, strlen(c->alias)))
+			continue;
 
-	s += j;
-	while (isspace(s[0]))
-		s++;
+		if (strlen(s) == strlen(c->alias)) {
+			g_free(sc);
+			return (g_strdup(c->cmd));
+		}
 
-	if (strlen(s) > 0 && strlen(prefixstr) > 0)
-		prefix = atoi(prefixstr);
-	else
-		s = sc;
+		if (!isspace(s[strlen(c->alias)]))
+			continue;
+
+		s = g_strdup_printf("%s %s", c->cmd, &s[strlen(c->alias) + 1]);
+		g_free(sc);
+		return (s);
+	}
+	s = g_strdup(s);
+	g_free(sc);
+	return (s);
+}
+
+gboolean
+cmd_execute(struct tab *t, char *str)
+{
+	struct cmd		*cmd = NULL;
+	char			*tok, *last = NULL, *s = str;
+	int			j = 0, len, c = 0, dep = 0, matchcount = 0;
+	int			prefix = -1, rv = XT_CB_PASSTHROUGH;
+	struct karg		arg = {0, NULL, -1};
+
+	s = parse_prefix_and_alias(s, &prefix);
 
 	for (tok = strtok_r(s, " ", &last); tok;
 	    tok = strtok_r(NULL, " ", &last)) {
@@ -5952,7 +5975,7 @@ execute_cmd:
 done:
 	if (j > 0)
 		cmd_prefix = 0;
-	g_free(sc);
+	g_free(s);
 	if (arg.s)
 		g_free(arg.s);
 
i/profani-tty/blame/themes/original_bright?id=d39bcdc166624a79f0bc962091c603ff8051c9bd'>^
b21edfaa ^
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50