[git commit] sed: in '/regexp/cmd1; //cmd2', cmd2 should use the same regexp as cmd1

Denys Vlasenko vda.linux at googlemail.com
Wed Aug 23 15:56:03 UTC 2017


commit: https://git.busybox.net/busybox/commit/?id=9c47c43e07365abe1eda02d69572b9e579b49cec
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

function                                             old     new   delta
get_address                                          165     211     +46

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 editors/sed.c       | 14 ++++++++++----
 testsuite/sed.tests |  6 ++++++
 2 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/editors/sed.c b/editors/sed.c
index 3fc40ce..7ed9937 100644
--- a/editors/sed.c
+++ b/editors/sed.c
@@ -350,10 +350,16 @@ static int get_address(const char *my_str, int *linenum, regex_t ** regex)
 		if (*my_str == '\\')
 			delimiter = *++pos;
 		next = index_of_next_unescaped_regexp_delim(delimiter, ++pos);
-		temp = copy_parsing_escapes(pos, next);
-		*regex = xzalloc(sizeof(regex_t));
-		xregcomp(*regex, temp, G.regex_type);
-		free(temp);
+		if (next != 0) {
+			temp = copy_parsing_escapes(pos, next);
+			G.previous_regex_ptr = *regex = xzalloc(sizeof(regex_t));
+			xregcomp(*regex, temp, G.regex_type);
+			free(temp);
+		} else {
+			*regex = G.previous_regex_ptr;
+			if (!G.previous_regex_ptr)
+				bb_error_msg_and_die("no previous regexp");
+		}
 		/* Move position to next character after last delimiter */
 		pos += (next+1);
 	}
diff --git a/testsuite/sed.tests b/testsuite/sed.tests
index 05c00a9..675cb4f 100755
--- a/testsuite/sed.tests
+++ b/testsuite/sed.tests
@@ -387,6 +387,12 @@ testing "sed 's///w FILE'" \
 	"" \
 	"123\nqwe\nasd\n"
 
+testing "sed uses previous regexp" \
+	"sed '/w/p;//q'" \
+	"q\nw\nw\n" \
+	"" \
+	"q\nw\ne\nr\n"
+
 # testing "description" "commands" "result" "infile" "stdin"
 
 exit $FAILCOUNT


More information about the busybox-cvs mailing list