From 42c25735e6be3b4af504ae098cf287d259f6b37c Mon Sep 17 00:00:00 2001
From: Glenn L McGrath <bug1@ihug.co.nz>
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.