Patch from Rob Landley;

Moving on to building diffutils, busybox sed needs this patch to get
past the first problem.  (Passing it a multi-line command line argument
with -e works, but if you don't use -e it doesn't break up the multiple
lines...)
This commit is contained in:
Glenn L McGrath 2003-10-04 05:27:56 +00:00
parent fd7bc13557
commit 42c25735e6

View File

@ -344,6 +344,8 @@ static int parse_subst_cmd(sed_cmd_t * const sed_cmd, const char *substr)
sed_cmd->which_match=(unsigned short)strtol(substr+idx,&pos,10);
idx=pos-substr;
}
/* Skip spaces */
if(isspace(substr[idx])) continue;
continue;
}
switch (substr[idx]) {
@ -366,10 +368,6 @@ static int parse_subst_cmd(sed_cmd_t * const sed_cmd, const char *substr)
case 'I':
cflags |= REG_ICASE;
break;
/* Skip spaces */
case ' ':
case '\t':
break;
case ';':
case '}':
goto out;
@ -1043,6 +1041,24 @@ discard_line:
}
}
/* It is possible to have a command line argument with embedded
newlines. This counts as multiple command lines. */
static void add_cmd_block(char *cmdstr)
{
int go=1;
char *temp=bb_xstrdup(cmdstr),*temp2=temp;
while(go) {
int len=strcspn(temp2,"\n");
if(!temp2[len]) go=0;
else temp2[len]=0;
add_cmd(temp2);
temp2+=len+1;
}
free(temp);
}
extern int sed_main(int argc, char **argv)
{
int opt, status = EXIT_SUCCESS;
@ -1060,23 +1076,8 @@ extern int sed_main(int argc, char **argv)
be_quiet++;
break;
case 'e':
{
int go=1;
char *temp=bb_xstrdup(optarg),*temp2=temp;
/* It is possible to have a command line argument with embedded
newlines. This counts as a multi-line argument. */
while(go) {
int len=strcspn(temp2,"\n");
if(!temp2[len]) go=0;
else temp2[len]=0;
add_cmd(temp2);
temp2+=len+1;
}
free(temp);
add_cmd_block(optarg);
break;
}
case 'f':
{
FILE *cmdfile;
@ -1097,8 +1098,6 @@ extern int sed_main(int argc, char **argv)
bb_show_usage();
}
}
/* Flush any unfinished commands. */
add_cmd("");
/* if we didn't get a pattern from a -e and no command file was specified,
* argv[optind] should be the pattern. no pattern, no worky */
@ -1106,8 +1105,10 @@ extern int sed_main(int argc, char **argv)
if (argv[optind] == NULL)
bb_show_usage();
else
add_cmd(argv[optind++]);
add_cmd_block(argv[optind++]);
}
/* Flush any unfinished commands. */
add_cmd("");
/* argv[(optind)..(argc-1)] should be names of file to process. If no
* files were specified or '-' was specified, take input from stdin.