sed: fix nested {} case
authorDenys Vlasenko <vda.linux@googlemail.com>
Tue, 20 Apr 2010 08:00:03 +0000 (04:00 -0400)
committerDenys Vlasenko <vda.linux@googlemail.com>
Tue, 20 Apr 2010 08:00:03 +0000 (04:00 -0400)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
editors/sed.c
testsuite/sed.tests

index 302a156051a23938e5c1425ee0bdc2c22cd964bc..30ab8c9fbef34378c8240817bb395c4030207189 100644 (file)
@@ -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 {");
index f88524d073498d40d2debb865fc63cd071f16ff7..b0de9657ca7bc387f414528f7ee80e86592c5769 100755 (executable)
@@ -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