Skip to content

Commit 234e221

Browse files
committed
copy: support any amount of pluses [fixes #94]
1 parent b4fd333 commit 234e221

File tree

1 file changed

+43
-38
lines changed

1 file changed

+43
-38
lines changed

src/command.c

+43-38
Original file line numberDiff line numberDiff line change
@@ -472,11 +472,10 @@ static void extract_args(char *src)
472472
// scout ahead to see if there are really any arguments
473473
while (*src == ' ' || *src == '\t')
474474
src++;
475-
if (*src == '\0')
475+
if (*src == '\0' || *src == ';')
476476
{
477477
cmd_arg[0] = '\0';
478478
cmd_switch[0] = '\0';
479-
cmd_args[0] = '\0';
480479
return;
481480
}
482481

@@ -496,7 +495,7 @@ static void extract_args(char *src)
496495
*dest = *src;
497496
dest++;
498497
src++;
499-
if (*src == '/')
498+
if (*src == '/' || *src == ';')
500499
break;
501500
}
502501
*dest = '\0';
@@ -524,11 +523,16 @@ static void advance_cmd_arg(void)
524523
while (*extr != ' ' && *extr != '\t' && *extr != '\0')
525524
{
526525
extr++;
527-
if (*extr == '/')
526+
if (*extr == '/' || *extr == ';')
528527
break;
529528
}
530529
if (*extr == '\0')
531530
goto NoArgs;
531+
if (*extr == ';')
532+
{
533+
memmove(cmd_args, extr, strlen(extr)+1);
534+
goto NoArgs;
535+
}
532536

533537
// extract the rest
534538
extract_args(extr);
@@ -537,7 +541,6 @@ static void advance_cmd_arg(void)
537541
NoArgs:
538542
cmd_arg[0] = '\0';
539543
cmd_switch[0] = '\0';
540-
cmd_args[0] = '\0';
541544
return;
542545
}
543546

@@ -2028,42 +2031,44 @@ static void perform_choice(const char *arg)
20282031
return;
20292032
}
20302033

2034+
static int expand_pluses(void)
2035+
{
2036+
char cmd_args_bkp[MAX_CMD_BUFLEN];
2037+
int len;
2038+
char *p, *p2, *last_arg;
2039+
2040+
strcpy(cmd_args_bkp, cmd_args);
2041+
last_arg = strrchr(cmd_args_bkp, ' ');
2042+
if (!last_arg)
2043+
{
2044+
cprintf("syntax error\n");
2045+
return -1;
2046+
}
2047+
len = 0;
2048+
cmd_args[0] = '\0';
2049+
for (p2 = cmd_args_bkp, p = strchr(p2, '+'); p;
2050+
p2 = p + 1, p = strchr(p2, '+'))
2051+
{
2052+
len += snprintf(cmd_args + len, sizeof(cmd_args) - len, "%.*s %s;",
2053+
p - p2, p2, last_arg);
2054+
}
2055+
strlcat(cmd_args, p2, sizeof(cmd_args));
2056+
return 0;
2057+
}
2058+
20312059
static void perform_copy(const char *arg)
20322060
{
2033-
char cmd_line_bkp[MAX_CMD_BUFLEN] = "";
2034-
char *p, *p2;
2035-
if ((p = strchr(cmd_line, '+')))
2036-
{
2037-
strcpy(cmd_line_bkp, cmd_line);
2038-
p2 = p + 1 + strspn(p + 1, " ");
2039-
p2 = strchr(p2, ' ');
2040-
if (!p2)
2041-
{
2042-
cprintf("syntax error\n");
2043-
return;
2044-
}
2045-
memmove(p, p2, strlen(p2) + 1);
2046-
parse_cmd_line();
2047-
}
2061+
int err = expand_pluses();
2062+
if (err)
2063+
return;
20482064
general_file_transfer(FILE_XFER_COPY, 0);
2049-
if (p)
2050-
{
2051-
strcpy(cmd_line, cmd_line_bkp);
2052-
p2 = p - 1;
2053-
while (p2 > cmd_line && *p2 == ' ')
2054-
p2--;
2055-
while (p2 > cmd_line && *p2 != ' ')
2056-
p2--;
2057-
if (p2 <= cmd_line)
2058-
{
2059-
cprintf("syntax error\n");
2060-
return;
2061-
}
2062-
p++;
2063-
p += strspn(p, " ");
2064-
memmove(p2 + 1, p, strlen(p) + 1);
2065-
parse_cmd_line();
2066-
general_file_transfer(FILE_XFER_COPY, 1);
2065+
/* expand_pluses() delimited the arg groups with ; */
2066+
while (cmd_args[0] == ';')
2067+
{
2068+
cmd_args[0] = ' ';
2069+
extract_args(cmd_args);
2070+
if (cmd_arg[0] != '\0')
2071+
general_file_transfer(FILE_XFER_COPY, 1);
20672072
}
20682073
}
20692074

0 commit comments

Comments
 (0)