From f2c16edf99486a0ce2ca57f111831668e77d0fd1 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Tue, 20 Apr 2010 04:00:03 -0400 Subject: [PATCH] sed: fix nested {} case Signed-off-by: Denys Vlasenko --- editors/sed.c | 10 +++++++++- testsuite/sed.tests | 5 +++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/editors/sed.c b/editors/sed.c index 302a15605..30ab8c9fb 100644 --- a/editors/sed.c +++ b/editors/sed.c @@ -936,7 +936,15 @@ static void process_files(void) /* Skip blocks of commands we didn't match */ if (sed_cmd->cmd == '{') { if (sed_cmd->invert ? matched : !matched) { - while (sed_cmd->cmd != '}') { + unsigned nest_cnt = 0; + while (1) { + if (sed_cmd->cmd == '{') + nest_cnt++; + if (sed_cmd->cmd == '}') { + nest_cnt--; + if (nest_cnt == 0) + break; + } sed_cmd = sed_cmd->next; if (!sed_cmd) bb_error_msg_and_die("unterminated {"); diff --git a/testsuite/sed.tests b/testsuite/sed.tests index f88524d07..b0de9657c 100755 --- a/testsuite/sed.tests +++ b/testsuite/sed.tests @@ -253,4 +253,9 @@ testing "sed c" \ "repl\nrepl\n" "" \ "first\nsecond\n" +testing "sed nested {}s" \ + "sed '/asd/ { p; /s/ { s/s/c/ }; p; q }'" \ + "qwe\nasd\nacd\nacd\n" "" \ + "qwe\nasd\nzxc\n" + exit $FAILCOUNT