From 42c25735e6be3b4af504ae098cf287d259f6b37c Mon Sep 17 00:00:00 2001 From: Glenn L McGrath Date: Sat, 4 Oct 2003 05:27:56 +0000 Subject: [PATCH] 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...) --- editors/sed.c | 47 ++++++++++++++++++++++++----------------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/editors/sed.c b/editors/sed.c index da06bf485..adf79d4d6 100644 --- a/editors/sed.c +++ b/editors/sed.c @@ -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.