Patch from Rob Landley;
authorGlenn L McGrath <bug1@ihug.co.nz>
Sat, 4 Oct 2003 05:27:56 +0000 (05:27 -0000)
committerGlenn L McGrath <bug1@ihug.co.nz>
Sat, 4 Oct 2003 05:27:56 +0000 (05:27 -0000)
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

index da06bf485f18f378e99d29b86d9ce41869e9180a..adf79d4d67f691ea904765f277ca63511eff886f 100644 (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.