@@ -472,11 +472,10 @@ static void extract_args(char *src)
472
472
// scout ahead to see if there are really any arguments
473
473
while (* src == ' ' || * src == '\t' )
474
474
src ++ ;
475
- if (* src == '\0' )
475
+ if (* src == '\0' || * src == ';' )
476
476
{
477
477
cmd_arg [0 ] = '\0' ;
478
478
cmd_switch [0 ] = '\0' ;
479
- cmd_args [0 ] = '\0' ;
480
479
return ;
481
480
}
482
481
@@ -496,7 +495,7 @@ static void extract_args(char *src)
496
495
* dest = * src ;
497
496
dest ++ ;
498
497
src ++ ;
499
- if (* src == '/' )
498
+ if (* src == '/' || * src == ';' )
500
499
break ;
501
500
}
502
501
* dest = '\0' ;
@@ -524,11 +523,16 @@ static void advance_cmd_arg(void)
524
523
while (* extr != ' ' && * extr != '\t' && * extr != '\0' )
525
524
{
526
525
extr ++ ;
527
- if (* extr == '/' )
526
+ if (* extr == '/' || * extr == ';' )
528
527
break ;
529
528
}
530
529
if (* extr == '\0' )
531
530
goto NoArgs ;
531
+ if (* extr == ';' )
532
+ {
533
+ memmove (cmd_args , extr , strlen (extr )+ 1 );
534
+ goto NoArgs ;
535
+ }
532
536
533
537
// extract the rest
534
538
extract_args (extr );
@@ -537,7 +541,6 @@ static void advance_cmd_arg(void)
537
541
NoArgs :
538
542
cmd_arg [0 ] = '\0' ;
539
543
cmd_switch [0 ] = '\0' ;
540
- cmd_args [0 ] = '\0' ;
541
544
return ;
542
545
}
543
546
@@ -2028,42 +2031,44 @@ static void perform_choice(const char *arg)
2028
2031
return ;
2029
2032
}
2030
2033
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
+
2031
2059
static void perform_copy (const char * arg )
2032
2060
{
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 ;
2048
2064
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 );
2067
2072
}
2068
2073
}
2069
2074
0 commit comments