summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--editors/sed.c16
-rwxr-xr-xtestsuite/sed/sed-branch-conditional-inverted14
2 files changed, 24 insertions, 6 deletions
diff --git a/editors/sed.c b/editors/sed.c
index 1b6ed2b..a0a127e 100644
--- a/editors/sed.c
+++ b/editors/sed.c
@@ -57,7 +57,7 @@
- grouped commands: {cmd1;cmd2}
- transliteration (y/source-chars/dest-chars/)
- pattern space hold space storing / swapping (g, h, x)
- - labels / branching (: label, b, t)
+ - labels / branching (: label, b, t, T)
(Note: Specifying an address (range) to match is *optional*; commands
default to the whole pattern space if no specific address match was
@@ -65,7 +65,7 @@
Unsupported features:
- - GNU extensions
+ - most GNU extensions
- and more.
Todo:
@@ -440,7 +440,7 @@ static char *parse_cmd_args(sed_cmd_t *sed_cmd, char *cmdstr)
if(sed_cmd->cmd=='w')
sed_cmd->file=bb_xfopen(sed_cmd->string,"w");
/* handle branch commands */
- } else if (strchr(":bt", sed_cmd->cmd)) {
+ } else if (strchr(":btT", sed_cmd->cmd)) {
int length;
while(isspace(*cmdstr)) cmdstr++;
@@ -1000,11 +1000,15 @@ restart:
break;
}
- /* Test if substition worked, branch if so. */
+ /* Test/branch if substitution occurred */
case 't':
- if (!substituted) break;
+ if(!substituted) break;
substituted=0;
- /* Fall through */
+ /* Fall through */
+ /* Test/branch if substitution didn't occur */
+ case 'T':
+ if (substituted) break;
+ /* Fall through */
/* Branch to label */
case 'b':
if (!sed_cmd->string) goto discard_commands;
diff --git a/testsuite/sed/sed-branch-conditional-inverted b/testsuite/sed/sed-branch-conditional-inverted
new file mode 100755
index 0000000..f4df84b
--- /dev/null
+++ b/testsuite/sed/sed-branch-conditional-inverted
@@ -0,0 +1,14 @@
+busybox sed 's/a/1/;T notone;p;: notone;p'>output <<EOF
+a
+b
+c
+EOF
+cmp -s output - <<EOF
+1
+1
+1
+b
+b
+c
+c
+EOF