<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -2520,12 +2520,8 @@ static void reset_tab_expansion(void)
 	arg_expand_cmd = -1;
 }
 
-int run_only_safe_commands;
-
-/* FIXME: parse all arguments */
-void run_command(const char *buf)
+int parse_command(const char *buf, char **cmdp, char **argp)
 {
-	char *cmd, *arg;
 	int cmd_start, cmd_end, cmd_len;
 	int arg_start, arg_end;
 	int i;
@@ -2535,7 +2531,7 @@ void run_command(const char *buf)
 		i++;
 
 	if (buf[i] == '#')
-		return;
+		return 0;
 
 	cmd_start = i;
 	while (buf[i] &amp;&amp; buf[i] != ' ')
@@ -2550,15 +2546,24 @@ void run_command(const char *buf)
 
 	cmd_len = cmd_end - cmd_start;
 	if (cmd_len == 0)
-		return;
+		return 0;
 
-	cmd = xstrndup(buf + cmd_start, cmd_len);
+	*cmdp = xstrndup(buf + cmd_start, cmd_len);
 	if (arg_start == arg_end) {
-		arg = NULL;
+		*argp = NULL;
 	} else {
-		arg = xstrndup(buf + arg_start, arg_end - arg_start);
+		*argp = xstrndup(buf + arg_start, arg_end - arg_start);
 	}
-	i = 0;
+	return 1;
+}
+
+int run_only_safe_commands;
+
+void run_parsed_command(char *cmd, char *arg)
+{
+	int cmd_len = strlen(cmd);
+	int i = 0;
+
 	while (1) {
 		const struct command *c = &amp;commands[i];
 
@@ -2570,7 +2575,7 @@ void run_command(const char *buf)
 			const char *next = commands[i + 1].name;
 			int exact = c-&gt;name[cmd_len] == 0;
 
-			if (!exact &amp;&amp; next &amp;&amp; strncmp(cmd, next, cmd_end - cmd_start) == 0) {
+			if (!exact &amp;&amp; next &amp;&amp; strncmp(cmd, next, cmd_len) == 0) {
 				error_msg(&quot;ambiguous command\n&quot;);
 				break;
 			}
@@ -2591,6 +2596,16 @@ void run_command(const char *buf)
 		}
 		i++;
 	}
+}
+
+void run_command(const char *buf)
+{
+	char *cmd, *arg;
+
+	if (!parse_command(buf, &amp;cmd, &amp;arg))
+		return;
+
+	run_parsed_command(cmd, arg);
 	free(arg);
 	free(cmd);
 }</diff>
      <filename>command_mode.c</filename>
    </modified>
    <modified>
      <diff>@@ -49,6 +49,8 @@ void command_mode_ch(uchar ch);
 void command_mode_key(int key);
 void commands_init(void);
 void commands_exit(void);
+int parse_command(const char *buf, char **cmdp, char **argp);
+void run_parsed_command(char *cmd, char *arg);
 void run_command(const char *buf);
 
 struct command *get_command(const char *str);</diff>
      <filename>command_mode.h</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>99bdfe9ffbcf023778d5e21af7699ce5b3c665a0</id>
    </parent>
  </parents>
  <author>
    <name>Timo Hirvonen</name>
    <email>tihirvon@gmail.com</email>
  </author>
  <url>http://github.com/JasonWoof/cmus-unofficial/commit/2a3694a30cc4242f0fed4a30f7a3d30e85967622</url>
  <id>2a3694a30cc4242f0fed4a30f7a3d30e85967622</id>
  <committed-date>2008-01-22T04:51:31-08:00</committed-date>
  <authored-date>2008-01-22T04:51:31-08:00</authored-date>
  <message>Separate command parsing from running command</message>
  <tree>61c58afad5fd60ccd0068a21fe1bf8ee76a3e49e</tree>
  <committer>
    <name>Timo Hirvonen</name>
    <email>tihirvon@gmail.com</email>
  </committer>
</commit>
